偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Docker 是什么?K8s又是什么?如何從 0 到 1 實(shí)戰(zhàn) Docker 與 K8s 全流程部署?

云計算
什么是 Docker?什么又是 Kubernetes?它們之間存在怎樣的關(guān)系?這篇文章,我將通過理論加代碼實(shí)戰(zhàn)的方式,詳細(xì)地剖析他們。

云原生時代,作為技術(shù)人員,如果不了解 Docker 和 Kubernetes,那絕對是技術(shù)棧上的一個短板。那么,什么是 Docker?什么又是 Kubernetes?它們之間存在怎樣的關(guān)系?這篇文章,我將通過理論加代碼實(shí)戰(zhàn)的方式,詳細(xì)地剖析他們。

一、原理部分

1. Docker

Docker是一個容器化平臺,它允許開發(fā)者將應(yīng)用及其依賴項(xiàng)打包到一個稱為容器的標(biāo)準(zhǔn)化單元中,以便可以在不同環(huán)境中快速、可靠地運(yùn)行這些應(yīng)用。它的本質(zhì)是利用操作系統(tǒng)的Cgroups和Namespace機(jī)制創(chuàng)建出來的隔離環(huán)境。更多詳情參考我以往的文章:容器 = Namespace + Cgroups + rootfs

Docker核心概念包括以下幾個:

(1) Kubernetes核心概念

① 鏡像:Docker(Image)鏡像是一個輕量級、獨(dú)立、可執(zhí)行的軟件包,其中包含運(yùn)行某個應(yīng)用程序所需的所有內(nèi)容,包括代碼、運(yùn)行時、庫、環(huán)境變量和配置文件。鏡像是不可變的,基于鏡像可以創(chuàng)建容器。

② 容器:容器(Container)是鏡像的運(yùn)行實(shí)例,它是一個輕量級、獨(dú)立的環(huán)境,可以在任何支持 Docker的機(jī)器上運(yùn)行。容器與主機(jī)系統(tǒng)共享操作系統(tǒng)內(nèi)核,但在進(jìn)程空間上是隔離的。

③ Dockerfile:Dockerfile是一個文本文件,包含構(gòu)建 Docker鏡像的所有命令,可以通過 Dockerfile來自動化鏡像的創(chuàng)建過程。

④ Docker Hub:Docker Hub是一個云端的 Docker鏡像存儲庫,用戶可以在上面發(fā)布和獲取鏡像,它提供了一個平臺來共享和管理鏡像。

⑤ 容器編排:Docker Compose是一種定義和運(yùn)行多容器 Docker應(yīng)用程序的工具,通過一個docker-compose.yml文件,用戶可以定義一個應(yīng)用包含的所有服務(wù),并使用簡單的命令啟動或停止它們。

Docker容器可以描述成以下全景圖(圖片來自極客張磊):

(2) Docker的優(yōu)點(diǎn)

Docker的優(yōu)點(diǎn)可以用一句話總結(jié):一次打包,到處部署。這個和 JVM一次編譯,到處運(yùn)行的設(shè)計有著異曲同工之妙,所以說,計算機(jī)領(lǐng)域很多思維是相通的!

下圖對比了使用與不使用 Docker的場景:

  • 不使用 Docker:每次將應(yīng)用部署新主機(jī)時,都需要重新安裝一遍應(yīng)用需要的環(huán)境,因?yàn)椴僮飨到y(tǒng)多,運(yùn)營商可能也不同,安裝環(huán)境是一件痛苦的事情。
  • 使用 Docker:制作 Docker鏡像時,已經(jīng)包含應(yīng)用及其所需的環(huán)境,因此可以到任何運(yùn)營商提供的操作系統(tǒng)上運(yùn)行。

2. Kubernetes

Kubernetes(K8s) 一詞源自希臘,意為“舵手”或“掌舵者”,用于指導(dǎo)和管理船只的航行。它是一個容器編排平臺,負(fù)責(zé)自動化容器的部署、擴(kuò)展(水平擴(kuò)展)、負(fù)載均衡、以及故障恢復(fù)等工作。

Kubernetes的核心概念包括以下幾個:

(1) Kubernetes核心概念

① 節(jié)點(diǎn):節(jié)點(diǎn)(Node)是 Kubernetes集群中的一臺物理機(jī)或虛擬機(jī),負(fù)責(zé)運(yùn)行應(yīng)用程序的工作負(fù)載。每個節(jié)點(diǎn)運(yùn)行一個Kubelet(用于管理節(jié)點(diǎn)上的容器)和一個容器運(yùn)行時(例如Docker)。

② Pod:Pod是 Kubernetes中最小的可部署單元,通常包含一個或多個容器。Pod中的容器共享網(wǎng)絡(luò)和存儲,可以協(xié)同工作。

③ 控制器:控制器(Controller)負(fù)責(zé)管理和維護(hù)集群中的Pod和相關(guān)的服務(wù)。常見的控制器有 ReplicaSet(確保指定數(shù)量的Pod副本在運(yùn)行)、Deployment(管理無狀態(tài)應(yīng)用)和 StatefulSet(管理有狀態(tài)應(yīng)用)。

④ 服務(wù):服務(wù)(Service)是一個抽象的方式,用于定義一組Pod的邏輯集合以及訪問這些 Pod的策略。Kubernetes中的服務(wù)提供了負(fù)載均衡和服務(wù)發(fā)現(xiàn)功能。

⑤ 命名空間:命名空間(Namespace)用于在同一個 Kubernetes集群中將資源進(jìn)行邏輯上的隔離。它允許多個團(tuán)隊或項(xiàng)目共享一個集群而不會相互影響。

⑥ 配置管理:配置管理包含 ConfigMap 和 Secret。ConfigMap 用于存儲非機(jī)密的數(shù)據(jù),類似配置文件。Secret用于存儲機(jī)密數(shù)據(jù),如密碼、OAuth令牌和SSH密鑰。

⑦ Ingress:Ingress是一個 API對象,管理外部訪問到集群中服務(wù)的 HTTP和 HTTPS路由。它提供負(fù)載均衡、SSL終止和基于名稱的虛擬托管等功能。

⑧ Deployment:Deployment是一個用于管理無狀態(tài)應(yīng)用程序的核心組件。它提供了一種聲明式的方法來管理 Pod和 ReplicaSet,從而實(shí)現(xiàn)應(yīng)用程序的部署、升級和擴(kuò)縮。

Kubernetes可以描述成以下全景圖(圖片來自極客張磊):

(2) Kubernetes 的工作流程

Kubernetes 的整體工作流程可以總結(jié)成下面 6個步驟:

  • 用戶定義和提交文件:用戶通過 kubectl提交描述文件,例如 Deployment 和 Service 定義,這些文件描述了應(yīng)用副本數(shù)量、負(fù)責(zé)選擇負(fù)載均衡的標(biāo)簽、資源需求等信息。
  • API Server 接受請求:API Server處理用戶的對象創(chuàng)建請求,這些請求會被記錄在 etcd 中。
  • 調(diào)度器決定 Pod 的位置:Scheduler根據(jù)集群的整體資源使用情況、節(jié)點(diǎn)健康狀況、Pod 的資源要求等調(diào)度策略,將 Pod安排到集群中的某個 Node上。
  • Kubelet 處理并運(yùn)行Pod:在選定的 Node上,Kubelet調(diào)用 Container Runtime(例如 Docker 或 Container)啟動容器,并根據(jù)請求的規(guī)格拉取鏡像、分配資源、啟動應(yīng)用。
  • Kube Proxy 實(shí)現(xiàn)服務(wù)訪問:集群中的 Kube Proxy負(fù)責(zé)為每個 Pod生成虛擬 IP,通過這些 IP,集群內(nèi)外部的訪問可以通過 Kubernetes Services 來訪問這些 Pod,進(jìn)行負(fù)載均衡。
  • 狀態(tài)保持和自動修復(fù):Kubernetes的控制器會持續(xù)監(jiān)控 Pod和節(jié)點(diǎn)的狀態(tài),并在檢測到某些 Pod不可用或節(jié)點(diǎn)失效時,自動重啟或調(diào)度新的 Pod到健康的節(jié)點(diǎn)上。

整個流程如下圖:

3. 兩者關(guān)系

Docker提供容器化機(jī)制,用于封裝和打包應(yīng)用,并利用 CI/CD管道將容器鏡像推送至中央容器注冊中心(如 Docker Hub 或 Harbor),而 Kubernetes是一個強(qiáng)大的容器編排平臺,負(fù)責(zé)調(diào)度、擴(kuò)展和管理 Docker容器化應(yīng)用,保證系統(tǒng)高可用、故障自動恢復(fù)。

從宏觀上看,兩者關(guān)系可以通過下圖來形象的表達(dá):

好了,理論部分講解完后,我們正式進(jìn)入代碼實(shí)戰(zhàn)部分,俗話說:說起來容易做起來難,對于 Kubernetes集群還真有點(diǎn)難度,來,上干貨!??!

二、代碼實(shí)戰(zhàn)

1. 目的

開發(fā)一個簡單的 Java Web應(yīng)用,并將其 Docker容器化部署到 Kubernetes集群中,然后在瀏覽器訪問,展示:Hello world, This is my docker running in Kubernetes!。

2. 步驟

整體流程核心步驟有下面幾個:

  • 安裝環(huán)境
  • 創(chuàng)建 Web應(yīng)用
  • 應(yīng)用 Docker 容器化
  • 部署到 Kubernetes 集群
  • 瀏覽器驗(yàn)證

(1) 安裝環(huán)境

首先,需要確保我們安裝了以下環(huán)境:JDK(Java Development Kit), Gradle(Maven),Docker, Kubernetes,下面是我安裝的版本:

JDK 版本:

Gradle版本:

Docker 版本:我使用的是 Mac Pro 電腦,直接使用 brew安裝:

brew install --cask docker

Kubernetes 版本:

我使用的是 Mac Pro電腦,直接使用 brew安裝:

brew install kubectl

注意:Gradle 和 Maven 是項(xiàng)目管理工具,只要安裝一個就OK,自己熟悉哪個就安裝哪個。

(2) 創(chuàng)建Java Web應(yīng)用

① 創(chuàng)建Gradle(Maven)項(xiàng)目

創(chuàng)建一個 Springboot 項(xiàng)目,整個目錄結(jié)構(gòu)如下:

在src/main/cloud/com/yuanjava/docker目錄下創(chuàng)建一個新的 Java類,如HelloController.java:

package com.yuanjava.docker;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author 猿java
 */
@RestController
public class HelloController {
   @GetMapping("/test")
   public String test() {
      return "Hello world, This is my docker running in Kubernetes!";
   }
}

② Gradle(Maven)打包項(xiàng)目:

Gradle打包指令如下:

gradle build

這里在 build/libs 目錄下就就會看到打包后的 jar包:

(3) 容器化 Java Web應(yīng)用

① 編寫Dockerfile:

在項(xiàng)目根目錄下創(chuàng)建一個Dockerfile:

FROM openjdk:17-jdk-slim
COPY build/libs/yuanjava-1.0.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

② 構(gòu)建Docker鏡像:

在當(dāng)前目錄,運(yùn)行以下命令就可以構(gòu)建 Docker鏡像,-t的作用是給這個鏡像加一個Tag,也就是起一個好聽的名字。

docker build -t yuanjava:1.0 .

運(yùn)行完上面的指令之后,就可以在 Docker鏡像庫看到剛才打的鏡像了,可以使用docker images指令查看鏡像:

docker images

也可以通過 Docker的可視化工具查看鏡像:

③ 運(yùn)行Docker容器

我們可以通過下面的命令來啟動 Docker容器:

docker run -p 9999:9999 yuanjava:1.0

然后,在瀏覽器中訪問http://localhost:9999/test來測試 Docker是否啟動完成。訪問結(jié)果如下圖:

④ 推送 Docker鏡像到遠(yuǎn)程倉庫

這一步是為了下面將 Docker鏡像部署到 Kubernetes集群做準(zhǔn)備,推送命令如下:

docker push yuanjava:1.0

推送完之后,遠(yuǎn)程倉庫就多了一個鏡像,如下圖所示:

注意:如果沒有 Docker賬號,需要先創(chuàng)建賬號。

(4) 部署到Kubernetes集群

① 啟動 Kubernetes集群

通常來說,我們會使用minikube命令來啟動和管理 Kubernetes 集群,安裝和啟動命令如下:

# 安裝 minikube
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo mv minikube /usr/local/bin/

# 啟動 Kubernetes集群
minikube start

② 編寫Kubernetes Deployment配置

創(chuàng)建一個deployment.yaml文件,內(nèi)容如下:

apiVersion: apps/v1 # 定義了 Kubernetes API 的版本
kind: Deployment    # 聲明這個 Kubernetes 資源的類型
metadata:
 name: yuanjava     # 包含資源的元數(shù)據(jù),Kubernetes 通過 metadata 字段中的各類信息來跟蹤和管理資源
spec:
 replicas: 2       # Pod的副本數(shù)量,即 Deployment將運(yùn)行 2個相同的 Pod
 selector:
   matchLabels:
     app: yuanjava # 告訴 Deployment 如何找到它管理的 Pod
 template:
   metadata:
     labels:
       app: yuanjava # 定義 Pod 的模板
   spec:
     containers:
     - name: yuanjava
       image: yuanjava/yuanjava:1.0 #定義容器使用的鏡像,Kubernetes 會從容器鏡像倉庫中拉取它
       ports:
       - containerPort: 9999     # 指定容器內(nèi)部監(jiān)聽的應(yīng)用端口

③ 編寫Kubernetes Service配置

創(chuàng)建一個service.yaml文件,內(nèi)容如下:

apiVersion: v1
kind: Service # 用于描述和管理向外部或者內(nèi)部暴露應(yīng)用的網(wǎng)絡(luò)訪問方式
metadata:
  name: yuanjava # 包含資源的元數(shù)據(jù)信息
spec:
  type: LoadBalancer # 定義了服務(wù)的類型,LoadBalancer 類型會將服務(wù)暴露給外部網(wǎng)絡(luò)
  ports:
  - port: 80  # 這是對外暴露的端口,表示外部客戶端訪問服務(wù)時使用的端口號
    targetPort: 9999 # 這是集群內(nèi)部目標(biāo) Pod 上運(yùn)行的容器所監(jiān)聽的端口
  selector:
    app: yuanjava

④ 部署到Kubernetes

我們可以使用kubectl命令應(yīng)用配置,命令說明如下:

  • kubectl apply -f deployment.yaml:根據(jù) deployment.yaml 文件中的定義,創(chuàng)建或更新 Kubernetes中相應(yīng)的 Deployment。
  • kubectl apply -f service.yaml:根據(jù) service.yaml 文件中的內(nèi)容,Kubernetes會創(chuàng)建一個 Service,并將其與運(yùn)行 Deployment 中的 Pod關(guān)聯(lián)起來。
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

⑤ 驗(yàn)證部署

使用以下命令檢查 Pods和 Service狀態(tài):

kubectl get pods
kubectl get services

如下圖,2個 Pod都處于 Running 狀態(tài):

(5) 瀏覽器驗(yàn)證

最后,我們可以在瀏覽器中訪問,驗(yàn)證應(yīng)用是否成功部署到 Kubernetes 集群,訪問地址是:http://EXTERNAL-IP/hello ,如下圖:

因?yàn)?,我是本地部署,所以EXTERNAL-IP地址為<pending>,即未分配,但是可以通過minikube service yuanjava查看 IP地址,如下圖所示:

最后,打開地址http://192.168.49.2:63213/test, 見證奇跡的時刻到了:

因?yàn)槭潜镜丨h(huán)境,所以鏈接最終會跳轉(zhuǎn)到http://127.0.0.1:63213/test 。

到此,我們就成功地手動將 Docker鏡像部署到 Kubernetes集群,并且通過 URL能夠訪問,過程很艱辛,結(jié)果還是比較美好。

但是,如果要部署大量的機(jī)器,這樣手動操作肯定是不行,因此,我們需要結(jié)組一些 CI/CD工具(如 GitHub Actions、GitLab CI/CD 或 Jenkins)實(shí)現(xiàn)自動化 Docker鏡像構(gòu)建和 Kubernetes 部署。

這里以 GitHub Actions為例,創(chuàng)建 .github/workflows/auto-deploy.yaml:

name: Auto Deploy Application to Kubernetes

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    # Step 1: 檢出代碼
    - name: Checkout code
      uses: actions/checkout@v3

    # Step 2: 登錄 Docker Registry
    - name: Log in to Docker Hub
      run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

    # Step 3: 構(gòu)建并推送 Docker 鏡像
    - name: Build and push Docker image
      run: |
        docker build -t ${{ secrets.DOCKER_USERNAME }}/yuanjava:latest .
        docker push ${{ secrets.DOCKER_USERNAME }}/yuanjava:latest

    # Step 4: 設(shè)置 kubectl
    - name: Set up kubectl
      uses: azure/setup-kubectl@v3
      with:
        version: 'latest'

    # Step 5: 配置 kubeconfig 文件
    - name: Configure kubeconfig
      run: |
        echo "${{ secrets.KUBECONFIG }}" > kubeconfig
        export KUBECONFIG=kubeconfig

    # Step 6: 部署到 Kubernetes
    - name: Apply Kubernetes manifests
      run: |
        kubectl apply -f deployment.yaml
        kubectl apply -f service.yaml

關(guān)鍵說明:

  • 配置里面的 DOCKER_USERNAME, DOCKER_PASSWORD, KUBECONFIG,需在項(xiàng)目的 Settings > Secrets 中配置。
  • 在觸發(fā)階段(push 到 main 分支)時,上述流水線將自動完成 Docker 構(gòu)建、推送,并將應(yīng)用部署到 Kubernetes。

三、總結(jié)

本文,我們先從理論上分析了 Docker 和 Kubernetes的核心概念以及它們之間的關(guān)系。

接著,我們從代碼實(shí)戰(zhàn)的角度,帶大家一步一步實(shí)操了如何編寫一個簡單的 Java Web應(yīng)用,并將其 Docker容器化,最后部署到 Kubernetes集群中,然后在瀏覽器訪問。在實(shí)操的期間,因?yàn)樗械沫h(huán)境都是本地環(huán)境臨時搭建,所以遇到了很多的問題,但最終還是成功了。

通過這次實(shí)操,再次說明了做技術(shù)不能只停留在理論,實(shí)操很重要,實(shí)操期間我們可能遇到很多問題,但是,當(dāng)我們通過各種方式去解決問題的時候,這個過程其實(shí)就是對技術(shù)更深入的學(xué)習(xí)和掌握。

個人建議:

Docker是云原生很重要相對簡單的一個技術(shù)基礎(chǔ),強(qiáng)烈建議掌握并且一定要去實(shí)戰(zhàn)。Kubernetes的難度系統(tǒng)會比 Docker大,它為大量容器提供調(diào)度、資源管理、彈性伸縮等功能,如果使用的機(jī)器數(shù)量比較少,Kubernetes其實(shí)很難用上,但是,如果可以,還是建議我們創(chuàng)造條件在實(shí)際生產(chǎn)環(huán)境中去使用和學(xué)習(xí) Kubernetes。相信我,這種有壓力的學(xué)習(xí)效果賊棒!

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2024-04-02 08:02:11

Dockerk8s容器

2023-09-06 08:12:04

k8s云原生

2022-04-22 13:32:01

K8s容器引擎架構(gòu)

2020-11-10 07:05:41

DockerK8S云計算

2025-02-27 08:09:52

2020-12-29 05:29:39

DockerK8s容器

2022-10-10 12:54:00

Flink運(yùn)維

2023-02-27 07:40:00

2023-09-08 08:09:12

k8sservice服務(wù)

2023-08-29 10:27:32

2023-11-06 07:16:22

WasmK8s模塊

2024-03-04 08:03:50

k8sClusterNode

2021-07-14 14:20:22

root命令Linux

2020-07-30 09:10:21

DockerK8s容器

2022-11-06 21:31:11

云原生Sentinel集群模式

2023-03-01 07:42:12

HBase編排部署數(shù)據(jù)

2022-09-07 09:22:36

SpringBootWeb

2023-11-06 01:17:25

主機(jī)容器選項(xiàng)

2024-02-01 09:48:17

2023-03-06 07:19:50

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號