Kubernetes部署實(shí)例并配置Deployment、網(wǎng)絡(luò)映射、副本集
Deployment
Deployment 是 Kubernetes 提供的一種自我修復(fù)機(jī)制來(lái)解決機(jī)器故障維護(hù)的問(wèn)題。
當(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)建,一種是通過(guò) yaml,后面我們會(huì)介紹這兩種創(chuàng)建方法。
創(chuàng)建 Deployment
我們來(lái)部署一個(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 到部署容器過(guò)程的詳細(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
無(wú)論哪種部署方式,我們都可以從已經(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)覆蓋任何你沒(méi)有指定更改的屬性
另外還有 kubectl replace
、kubectl edit
,kubectl replace
是破壞性更新/替換,容易導(dǎo)致問(wèn)題;kubectl edit
可以更新 deployment。
根據(jù) Kubernetes 官方的文檔,應(yīng)始終使用 kubectl apply
或 kubectl create --save-config
創(chuàng)建資源。
這里再說(shuō)一下創(chuàng)建 deployment 的區(qū)別。
如果使用 create 創(chuàng)建,命令格式:
kubectl create deployment {deployment的名字} --image={鏡像名稱(chēng)}
如果使用 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ù)來(lái)預(yù)覽而不真正提交。
kubectl create deployment testnginx --image=nginx:latest --dry-run=client
在一些 k8s 認(rèn)證中,我們沒(méi)時(shí)間一點(diǎn)點(diǎn)寫(xiě) 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è)地方也說(shuō)一下,kubectl get xxx
時(shí),帶不帶 s
都沒(méi)關(guān)系,例如 kubectl get nodes
/ kubectl get node
都是一樣的。
不過(guò),一般從語(yǔ)義上,我們獲取全部對(duì)象時(shí),可以使用 kubectl get nodes
,獲取具體的對(duì)象時(shí),可以使用 kubectl get node nginx
。類(lèi)似的,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 是不能訪(fǎng)問(wèn)的。
使用 kubectl get services
或 kubectl get ep
查詢(xún)的 ip ,我們可以在 worker 節(jié)點(diǎn)上直接訪(fǎng)問(wèn)。
例如筆者查詢(xún)出來(lái)的 ip,可以在 worker 中這樣訪(fǎng)問(wèn)。
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 的名稱(chēng)。READY
顯示應(yīng)用程序的可用的 副本 數(shù)。顯示的模式是“就緒個(gè)數(shù)/期望個(gè)數(shù)”。UP-TO-DATE
顯示為了達(dá)到期望狀態(tài)已經(jīng)更新的副本數(shù)。AVAILABLE
顯示應(yīng)用可供用戶(hù)使用的副本數(shù)。AGE
顯示應(yīng)用程序運(yùn)行的時(shí)間。
副本
因?yàn)槿萜骰瘧?yīng)用中,根據(jù)云原生12因素的方法論和核心思想,一個(gè) Processes
應(yīng)當(dāng)是無(wú)狀態(tài)的,任何持久化的數(shù)據(jù)都要存儲(chǔ)在后端服務(wù)中。因此,A 鏡像,啟動(dòng) N 個(gè) docker 容器,端口為 801、802、803...,他們其實(shí)都是一樣的,我們?cè)L問(wèn)哪個(gè)容器,最終提供的服務(wù)都是一致的。
但是,如果我們把這些容器放到不同 Node 中,再通過(guò) k8s ,就可以為多個(gè)實(shí)例之間分配流量,即負(fù)載均衡。
在 Deployment 中,可以通過(guò)指定 yaml 文件的 .spec.replicas
字段或者以命令參數(shù) --replicas=
設(shè)置副本數(shù)量。
ReplicaSet
“ReplicaSet 的目的是維護(hù)一組在任何時(shí)候都處于運(yùn)行狀態(tài)的 Pod 副本的穩(wěn)定集合。 因此,它通常用來(lái)保證給定數(shù)量的、完全相同的 Pod 的可用性。”
感興趣的讀者可以看文檔:https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicaset/
在前面,我們已經(jīng)創(chuàng)建了 nginx ,接下來(lái)我們?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 3h15m
執(zhí)行 kubectl get pod -o wide
可以輸出信息的 pod 信息 。
NAME READY STATUS ESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-581 1/1 Running 0 3h11m 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的部分名稱(chēng)
可以看到 這幾個(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 3h15m
到此這篇關(guān)于Kubernetes部署實(shí)例并配置Deployment、網(wǎng)絡(luò)映射、副本集的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細(xì)教程-中篇
本系列文章主要介紹了Kubernetes(K8S)容器集群管理環(huán)境完整部署的詳細(xì)教程,分為上中下三篇文章,此為中篇,需要的朋友可以參考下2022-01-01Citrix Xenserver 7怎么安裝?Xenserver 7.0安裝詳細(xì)圖文教程(附下載地址)
XenServer 7.0正式版已近發(fā)布了,今天腳本之家 小編為大家?guī)?lái)了Xenserver 7安裝詳細(xì)圖文教程,希望對(duì)大家有所幫助2017-12-12Kubernetes部署實(shí)例并配置Deployment、網(wǎng)絡(luò)映射、副本集
這篇文章介紹了Kubernetes部署實(shí)例并配置Deployment、網(wǎng)絡(luò)映射、副本集的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Kubernetes關(guān)鍵組件與結(jié)構(gòu)組成介紹
這篇文章介紹了Kubernetes的關(guān)鍵組件與結(jié)構(gòu)組成,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03Kubernetes Visitor設(shè)計(jì)模式及發(fā)送pod創(chuàng)建請(qǐng)求解析
這篇文章主要為大家介紹了Kubernetes Visitor設(shè)計(jì)模式及發(fā)送pod創(chuàng)建請(qǐng)求解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Dashboard管理Kubernetes集群與API訪(fǎng)問(wèn)配置
這篇文章介紹了Dashboard管理Kubernetes集群與API訪(fǎng)問(wèn)配置的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Kubernetes(K8S)入門(mén)基礎(chǔ)內(nèi)容介紹
這篇文章介紹了Kubernetes(K8S)的入門(mén)基礎(chǔ)內(nèi)容,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03CentOS 出現(xiàn)no space left on device錯(cuò)誤解決辦法
這篇文章主要介紹了CentOS 出現(xiàn)no space left on device錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04