溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubernetes部署并配置Deploymen、網(wǎng)絡(luò)映射、副本集的方法

發(fā)布時(shí)間:2022-04-01 11:09:15 來源:億速云 閱讀:305 作者:iii 欄目:開發(fā)技術(shù)

這篇“Kubernetes部署并配置Deploymen、網(wǎng)絡(luò)映射、副本集的方法”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Kubernetes部署并配置Deploymen、網(wǎng)絡(luò)映射、副本集的方法”文章吧。

Deployment

Deployment 是 Kubernetes 提供的一種自我修復(fù)機(jī)制來解決機(jī)器故障維護(hù)的問題。

當(dāng)我們單獨(dú)使用 docker 部署應(yīng)用時(shí),為了應(yīng)用掛了后能夠重啟,我們可以使用 --restart=always 參數(shù),例如:

docker run -itd --restart=always -p 666:80 nginx:latest

但是這種方式只能單純重啟容器,并不具備從機(jī)器故障中恢復(fù)的能力。

Kubernetes Deployment 是一個(gè)配置,它可以指揮 Kubernetes 如何創(chuàng)建和更新你部署的應(yīng)用實(shí)例,創(chuàng)建 Deployment 后,Kubernetes master 會(huì)將應(yīng)用程序調(diào)度到集群中的各個(gè)節(jié)點(diǎn)上。Kubernetes Deployment 提供了一種與眾不同的應(yīng)用程序管理方法。

Deployment 的創(chuàng)建,有兩種方法,一種是直接使用命令創(chuàng)建,一種是通過 yaml,后面我們會(huì)介紹這兩種創(chuàng)建方法。

創(chuàng)建 Deployment

我們來部署一個(gè) Nginx 應(yīng)用。

kubectl create deployment nginx --image=nginx:latest

在 worker 節(jié)點(diǎn)上執(zhí)行 docker ps,可以看到:

root@instance-2:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
fe7433f906a0   nginx     "/docker-entrypoint.…"   7 seconds ago    Up 6 seconds              k8s_nginx_nginx-55649fd747-wdrjj_default_ea41dcc4-94fe-47f9-a804-5b5b1df703e9_0

獲取所有 deployment :

kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           2m24s

使用 kubectl describe deployment nginx 可以獲得更加詳細(xì)的信息。

使用 kubectl get events 可以獲得創(chuàng)建 Deployment 到部署容器過程的詳細(xì)事件記錄。

Successfully assigned default/nginx-55649fd747-wdrjj to instance-2
Pulling image "nginx:latest"
Successfully pulled image "nginx:latest" in 8.917597859s
Created container nginx
Started container nginx
Created pod: nginx-55649fd747-wdrjj
Scaled up replica set nginx-55649fd747 to 1

我們也可以使用 yaml 文件創(chuàng)建 Deployment:

kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

導(dǎo)出 yaml

無論哪種部署方式,我們都可以從已經(jīng)創(chuàng)建的 Deployment 導(dǎo)出 yaml 文件,使用 -o yaml 即可導(dǎo)出(-o json 導(dǎo)出json)。

kubectl get deployment nginx -o yaml
# 保存到文件
# kubectl get deployment nginx -o yaml > mynginx.yaml

然后終端會(huì)打?。?/p>

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2021-04-21T00:37:13Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
... ...

我們可以嘗試把 yaml 導(dǎo)出到 mynginx.yaml 文件中,然后我們刪除這個(gè) Deployment。

kubectl delete deployment ngin

然后利用導(dǎo)出的 mynginx.yaml 再創(chuàng)建一個(gè) Deployment。

kubectl apply -f mynginx.yaml

kubectl apply/create

當(dāng)我們創(chuàng)建一個(gè) deployment 時(shí),kubectl create 和 kubectl apply 效果是一樣的,但是 apply 還具有更新(update) 的功能。

kubectl apply 會(huì)在以前的配置、提供的輸入和資源的當(dāng)前配置之間 找出三方差異,以確定如何修改資源,kubectl apply 命令將會(huì)把推送的版本與以前的版本進(jìn)行比較,并應(yīng)用你所做的更改, 但是不會(huì)自動(dòng)覆蓋任何你沒有指定更改的屬性

另外還有 kubectl replace 、kubectl edit,kubectl replace 是破壞性更新/替換,容易導(dǎo)致問題;kubectl edit 可以更新 deployment。

根據(jù) Kubernetes 官方的文檔,應(yīng)始終使用 kubectl apply 或 kubectl create --save-config 創(chuàng)建資源。

這里再說一下創(chuàng)建 deployment 的區(qū)別。

如果使用 create 創(chuàng)建,命令格式:

kubectl create deployment {deployment的名字} --image={鏡像名稱}

如果使用 apply 命令創(chuàng)建,yaml 中需要指定一些信息:

kind: Deployment
... ...
medatada:
    name:nginx
... ...
    spec:
      containers:
      - image: nginx:latest

然后執(zhí)行 kubectl apply -f xxx.yaml 文件。

一個(gè)是 kubectl create deployment ;另一個(gè)是 kubectl apply -f,在 yaml 中指定 kind: Deployment。

有時(shí)我們不知道我們的創(chuàng)建命令或 yaml 是否正確,可以使用 --dry-run=client ,--dry-run=client 參數(shù)來預(yù)覽而不真正提交。

kubectl create deployment testnginx --image=nginx:latest --dry-run=client

在一些 k8s 認(rèn)證中,我們沒時(shí)間一點(diǎn)點(diǎn)寫 yaml ,但是又需要定制,此時(shí)可以使用 --dry-run=client -o yaml ,既可以不生效 Deployment,又可以導(dǎo)出 yaml 文件。

kubectl create deployment testnginx --image=nginx:latest --dry-run=client -o yaml

除了 deployment,其它 kubernetes 對(duì)象也可以使用這種方法,格式是 kubectl {對(duì)象} {參數(shù)} --dry-run=client -o yaml。

kubernetes 對(duì)象/資源,有 deployment、job、role、namespace 等。

還有一個(gè)地方也說一下,kubectl get xxx 時(shí),帶不帶 s 都沒關(guān)系,例如 kubectl get nodes / kubectl get node 都是一樣的。

不過,一般從語義上,我們獲取全部對(duì)象時(shí),可以使用 kubectl get nodes,獲取具體的對(duì)象時(shí),可以使用 kubectl get node nginx。類似的,kubectl describe nodes 、kubectl describe node nginx。實(shí)際上加不加 s 都一樣。

網(wǎng)絡(luò)端口映射和更新 Deployment

對(duì)于 docker,我們要映射端口時(shí),可以使用 docker ... -p 6666:80 ,那么對(duì)于 deployment 部署容器應(yīng)用,我們?cè)趺刺幚砟兀?/p>

我們可以看一下 https://k8s.io/examples/controllers/nginx-deployment.yaml 文件,

    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

這里我們不直接使用這個(gè) yaml 文件,繼續(xù)使用之前的 yaml 文件,我們首先部署一個(gè) nginx。

kubectl apply -f mynginx.yaml

然后修改 mynginx.yaml 文件,找到 image: nginx:latest,在后面加上端口映射。

    spec:
      containers:
      - image: nginx:latest
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
... ...
注:在里面加上了
        ports:
        - containerPort: 80
          protocol: TCP
          這三行。

然后刪除兩行字段:

  resourceVersion: "109967"
  uid: e66201e3-a740-4c1c-85f5-a849db40a0fd

因?yàn)檫@兩個(gè)字段限定了版本和 uid ,這樣替換或更新的時(shí)候,可以對(duì) nginx 的 deployment 直接操作。

查看 deployment、pod:

kubectl get deployment,pod
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           5m44s

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-55649fd747-9vfrx   1/1     Running   0          5m44s

然后我們創(chuàng)建 service。

kubectl expose deployment nginx

或者指定端口:

kubectl expose deployment nginx --port=80 --target-port=8000

查看 service:

kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   24h
nginx        ClusterIP   10.101.245.225   <none>        80/TCP    5m57s

查看 端口:

kubectl get ep
NAME         ENDPOINTS          AGE
kubernetes   10.170.0.2:6443    25h
nginx        192.168.56.24:80   17m

查看 Pod 信息信息:

kubectl describe pod nginx | grep Node:
Node:         instance-2/10.170.0.4

因?yàn)?deployment 部署的 應(yīng)用/pod ,不會(huì)在 master 上,不同 Node 是不能訪問的。

使用 kubectl get services 或 kubectl get ep 查詢的 ip ,我們可以在 worker 節(jié)點(diǎn)上直接訪問。

例如筆者查詢出來的 ip,可以在 worker 中這樣訪問。

curl 192.168.56.24:80
curl 10.101.245.225:80

ReplicaSet

我們執(zhí)行 kubectl get deployments 命令,輸出:

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           38m
  • NAME 列出了集群中 Deployment 的名稱。

  • READY 顯示應(yīng)用程序的可用的 副本 數(shù)。顯示的模式是“就緒個(gè)數(shù)/期望個(gè)數(shù)”。

  • UP-TO-DATE 顯示為了達(dá)到期望狀態(tài)已經(jīng)更新的副本數(shù)。

  • AVAILABLE 顯示應(yīng)用可供用戶使用的副本數(shù)。

  • AGE 顯示應(yīng)用程序運(yùn)行的時(shí)間。

副本

因?yàn)槿萜骰瘧?yīng)用中,根據(jù)云原生12因素的方法論和核心思想,一個(gè) Processes 應(yīng)當(dāng)是無狀態(tài)的,任何持久化的數(shù)據(jù)都要存儲(chǔ)在后端服務(wù)中。因此,A 鏡像,啟動(dòng) N 個(gè) docker 容器,端口為 801、802、803...,他們其實(shí)都是一樣的,我們?cè)L問哪個(gè)容器,最終提供的服務(wù)都是一致的。

但是,如果我們把這些容器放到不同 Node 中,再通過 k8s ,就可以為多個(gè)實(shí)例之間分配流量,即負(fù)載均衡。

在 Deployment 中,可以通過指定 yaml 文件的 .spec.replicas 字段或者以命令參數(shù) --replicas= 設(shè)置副本數(shù)量。

ReplicaSet

“ReplicaSet 的目的是維護(hù)一組在任何時(shí)候都處于運(yùn)行狀態(tài)的 Pod 副本的穩(wěn)定集合。 因此,它通常用來保證給定數(shù)量的、完全相同的 Pod 的可用性?!?/p>

感興趣的讀者可以看文檔:https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicaset/

在前面,我們已經(jīng)創(chuàng)建了 nginx ,接下來我們?cè)谶@個(gè) deployment 中修改副本數(shù)。

kubectl scale deployment nginx --replicas=3

然后等幾秒后執(zhí)行 kubectl get deployments 查看結(jié)果。

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           3h25m

執(zhí)行 kubectl get pod -o wide 可以輸出信息的 pod 信息 。

NAME       READY   STATUS   ESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
nginx-581   1/1     Running   0     3h21m   192.168.56.24   instance-2   <none>           <none>
nginx-582   1/1     Running   0     3m30s   192.168.56.25   instance-2   <none>           <none>
nginx-583   1/1     Running   0     3m30s   192.168.56.26   instance-2   <none>           <none>
# 注,筆者刪除了Name的部分名稱

可以看到 這幾個(gè) pod 都分配在 instance-2 這個(gè)節(jié)點(diǎn)上,因?yàn)槲抑挥幸慌_(tái) worker 節(jié)點(diǎn)服務(wù)器,如果多創(chuàng)建幾臺(tái)節(jié)點(diǎn)服務(wù)器,k8s 會(huì)自動(dòng)分配到不同的節(jié)點(diǎn)中。什么的輸出也可以看到,每個(gè) pod 都有自己的 ip 地址。

當(dāng)我們使用 kubectl delete xxx 刪除 pod 時(shí),Deployment 會(huì)自動(dòng)保持三個(gè)副本集,所以會(huì)自動(dòng)啟用新的 pod 。

執(zhí)行 kubectl get ep 可以看到不同 pod 暴露的 端口。

NAME         ENDPOINTS                                            AGE
kubernetes   10.170.0.2:6443                                      28h
nginx        192.168.56.24:80,192.168.56.25:80,192.168.56.26:80   3h25m

以上就是關(guān)于“Kubernetes部署并配置Deploymen、網(wǎng)絡(luò)映射、副本集的方法”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI