Kubernetes 基礎
四、 Kubernetes 基礎
1、 kubernetes 基礎使用篇
1.1、 kubernetes 帶來的變革
1.1.1、對於開發人員
由於公司業務多,開發環境、測試環境、預生產環境和生產環境都是隔離的,而且除了生產環境,為了節省 成本,其他環境可能是沒有日誌收集的,在沒有用 k8s 的時候,檢視線下測試的日誌,需要開發或者測試人員, 找到對應的機器,在找到對應的容器,然後才能檢視日誌,在用了 k8s 之後,開發和測試可以直接在 k8s 的dashboard 到對應的 namespace,即可定位到業務的容器,然後可以直接通過控制檯檢視到對應的日誌,大大降 低了操作時間。
把應用部署到 k8s 之後,程式碼的釋出、回滾,以及藍綠髮布、金絲雀釋出等都變得特別簡單,不僅加快了業 務程式碼迭代的速度,而且全程無需人工干預。目前我們使用 jenkins、gitrunner 進行發版或者回滾等,從開發環 境到測試環境,到生產環境,完全遵守一次構建,多叢集、多環境部署,通過不同的啟動引數、不同的環境變數、 不同的配置檔案實現區分不同的環境。目前已經實現 Python、Java、PHP、NodeJS、Go、.NET Core、Python 等多 種語言的一鍵式發版、一鍵式回滾,大大提高了開發人員的開發效率。
在使用服務網格後,開發人員在開發應用的過程中,不用再關心程式碼的網路部分,這些功能都被服務網格實 現,讓開發人員可以只關心程式碼邏輯部分,即可實現網路部分的功能,比如:斷流、分流、路由、負載均衡、限 速和觸發故障等功能。
測試過程中,可能同時多套環境,當然也會需要再建立一套測試環境,之前測試環境的建立,需要找運維或 者自行手工搭建。在遷移至 k8s 集群后,只需要在 jenkins 上點點滑鼠即可在 k8s 叢集上建立一套新的
1.1.2、對於運維人員
如果你是一名運維人員,可能經常因為一些重複、繁瑣的工作感覺厭倦。比如:這個需要一套新的測試環境, 那個需要一套新的測試環境,之前可能需要裝系統、裝依賴環境、開通許可權等等。而如今,可以直接用映象直接 部署一套新的測試環境,甚至全程無需自己干預,開發人員通過 jenkins 或者自動化運維平臺即可一鍵式建立, 大大降低了運維成本。
一開始,公司業務故障,可能是因為基礎環境不一致、依賴不一致、埠衝突等等問題,現在實現 Docker 映象部署,k8s 編排,所有的依賴、基礎都是一樣的,並且環境的自動化擴容、健康檢查、容災、恢復都是全自 動的,大大減少了因為這類基礎問題引發的故障。也有可能公司業務是由於伺服器宕機、網路等問題,造成服務 不可用,此類情況均需要運維人員及時去修復,而如今,可能在你收到告警資訊的時候,k8s 已經幫你恢復了。
一開始,公司業務故障,可能是因為基礎環境不一致、依賴不一致、埠衝突等等問題,現在實現 Docker 映象部署,k8s 編排,所有的依賴、基礎都是一樣的,並且環境的自動化擴容、健康檢查、容災、恢復都是全自 動的,大大減少了因為這類基礎問題引發的故障。也有可能公司業務是由於伺服器宕機、網路等問題,造成服務 不可用,此類情況均需要運維人員及時去修復,而如今,可能在你收到告警資訊的時候,k8s 已經幫你恢復了。
對於反代配置方面,比如可能你並不會,或者對 nginx 的配置規則並不熟悉,一些高階的功能你也不會實現, 而如今,利用 k8s 的 ingress 即可簡單的實現那些複雜的邏輯。並且也不會在遇到 nginx 少加一個斜槓和多加一個 斜槓的問題
對於負載均衡方面,之前負載均衡可能是 Nginx、LVS、HAProxy、F5 等,雲上可能是雲服務商提供的不在均 衡機制。每次新增刪除節點時,都需要手動去配置前端負載均衡,手動去匹配後端節點,而如今,使用 k8s 內部 的 service 可以動態發現實現自動管理節點,並且支援自動擴容縮容。之前遇到高峰流量時,經常伺服器效能不 夠,需要臨時加伺服器面對高峰流量,而如今對於高效能 k8s 叢集加上 serverless,基本實現無需管理,自動擴 容
對於高可用方面,k8s 天生的高可用功能,徹底釋放了雙手,無需再去建立各類高可用工具、檢測檢查指令碼。 k8s 支援程序介面級別的健康檢查,如發現介面超時或者返回值不正確,會自動處理該問題。
對於中介軟體搭建方面,根據定義好的資原始檔,可以實現秒級搭建各類中介軟體高可用叢集,並且支援一鍵式 擴縮容,如 Redis、RabbitMQ、Zookeeper 等,並且大大減少了出錯的概率。
對於應用埠方面,傳統行業中,一個伺服器可能跑了很多程序,每個程序都有一個埠,需要人為的去配 置埠,並且還需要考慮埠衝突的問題,如果有防火牆的話,還需要配置防火牆,在 k8s 中,埠統一管理, 統一配置,每個應用的埠都可設定成一樣的,之後通過 service 進行負載均衡,大大降低了埠管理的複雜度 和埠衝突。
無論是對於開發人員、測試人員還是運維人員,k8s 的誕生,不僅減少了工作的複雜性,還減少了各種成本。 上述帶來的變革只是其中比較小的一部分,更多優點只有用了才能體會到。
1.2、 kubernetes 帶來的挑戰
首先是對於 k8s 的學習本身就是很難的,概念太多,無從入手,可能學習了一個月也無法入門,甚至連叢集 也搭建不出來,使人望而卻步。並且 k8s 對運維的技術能力要求比較高,已經不僅僅侷限於傳統運維,有時候你 可能要修改業務程式碼等。並且需要掌握的知識也需要很多,你可能需要掌握公司所有使用到的程式碼,比如程式碼是 如何進行編譯的、如何正確釋出、如何修改程式碼配置檔案等,這對於運維人員,也是一種挑戰。Kubernetes 之所 以被叫做 k8s,業界有兩種說法,通俗的說法是 k 和 s 之間有 8 個字母,另一種比較說法是 k8s 叢集至少需要搭 建 8 遍才能搭建成功。當然,在實際使用時,可能不止 8 遍。k8s 的誕生,把運維從傳統轉變到了 DevOps 方向, 需要面臨的問題會更多,需要面臨的新技術也有很多,但是當你掌握到了 k8s 的核心使用,就會受益終身
1.3、 Pod
K8s 有很多技術概念,同時對應很多 API 物件,最重要的也是最基礎的是微服務 Pod。Pod 是在 K8s 叢集中運 行部署應用或服務的最小單元,它是可以支援多容器的。Pod 的設計理念是支援多個容器在一個 Pod 中共享網路 地址和檔案系統,可以通過程序間通訊和檔案共享這種簡單高效的方式組合完成服務。Pod 對多容器的支援是 K8s 最基礎的設計理念。比如你執行一個作業系統發行版的軟體倉庫,一個 Nginx 容器用來發布軟體,另一個容器專 門用來從源倉庫做同步,這兩個容器的映象不太可能是一個團隊開發的,但是他們一塊兒工作才能提供一個微服 務;這種情況下,不同的團隊各自開發構建自己的容器映象,在部署的時候組合成一個微服務對外提供服務。這 就是 K8S 中的 POD。
1.3.1、Pod 的初體驗
apiVersion: v1
kind: Pod
metadata:
name: first-pod
labels:
app: bash
spec:
containers:
- name: bash-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10]
1.3.1.1、 執行結果
[root@instance-gvpb80ao docs]# kubectl apply -f test.yaml
pod/first-pod created
[root@instance-gvpb80ao docs]# kubectl get -f test.yaml
NAME READY STATUS RESTARTS AGE
first-pod 0/1 ContainerCreating 0 6s
1.3.2、Pod 帶來的好處
- Pod 做為一個可以獨立執行的服務單元,簡化了應用部署的難度,以更高的抽象層次為應用部署管提供了極 大的方便。
- Pod 做為最小的應用例項可以獨立執行,因此可以方便的進行部署、水平擴充套件和收縮、方便進行排程管理與 資源的分配。
- Pod 中的容器共享相同的資料和網路地址空間,Pod 之間也進行了統一的資源管理與分配。
1.3.3、Pod 是如何管理多個容器的
Pod 中可以同時執行多個程序(作為容器執行)協同工作。同一個 Pod 中的容器會自動的分配到同一個 node 上。同一個 Pod 中的容器共享資源、網路環境和依賴,所以它們總是被同時排程。在一個 Pod 中同時執行多個容 器是一種比較高階的用法。只有當你的容器需要緊密配合協作的時候才考慮用這種模式。
1.3.4、Pod 中的資料永續性
Pod 在設計⽀持就不是作為持久化實體的。在排程失敗、節點故障、缺少資源或者節點維護的狀態下都會死 掉會被驅逐。通常,我們是需要藉助類似於 Docker 儲存卷這樣的資源來做 Pod 的資料持久化的
1.3.5、Pod 的生命週期和重啟策略
Pod 在整個生命週期過程中被系統定義為各種狀態,熟悉 Pod 各種狀態對於我 理解如何設定 Pod 的排程策 略、重啟策略是很有必要的。
1.3.5.1、 Pod 的狀態
狀態值 | 描述 |
---|---|
掛起(Pending) | API Server 建立了 pod 資源物件已存入 etcd 中,但它尚未被排程完成,或者仍處於從倉 庫下載映象的過程中。 |
執行中(Running) | Pod 已經被排程至某節點,並且所有容器都已經被 kubelet 建立完成 |
成功(Succeeded) | Pod 中的所有容器都已經成功終止並且不會被重啟 |
失敗(Failed) | Pod 中的所有容器都已終止了,並且至少有一個容器是因為失敗終止。即容器以非 0 狀 態退出或者被系統禁止。 |
未知(Unknown) | Api Server 無法正常獲取到 Pod 物件的狀態資訊,通常是由於無法與所在工作節點的 kubelet 通訊所致 |
1.3.5.2、 Pod 的重啟策略
Pod 重啟策略( RestartPolicy )應用於 Pod 內的所有容器,井且僅在 Pod 所處的 Node 上由 kubelet 進 行判斷和重啟操作。當某個容器異常退出或者健康檢查失敗時, kubelet 將根據 RestartPolicy 設定來進行相應的 操作。Pod 的重啟策略包括:Always、OnFailure 和 Never,預設值為 Alway
- Always:當容器失效時,由 kubelet 自動重啟該容器。
- OnFailure:當容器終止執行且退出碼不為 0 時,由 kubelet 自動重啟該容器
- Never:不論容器執行狀態如何,kubelet 都不會重啟該容器。
kubelet 重啟失效容器的時間間隔以 sync-frequency 乘以 2n 來計算;例如 1、2、4、8 倍等,最長延時 5min , 並且在成功重啟後的 10 min 後重置該時間
kubelet 重啟失效容器的時間間隔以 sync-frequency 乘以 2n 來計算;例如 1、2、4、8 倍等,最長延時 5min , 並且在成功重啟後的 10 min 後重置該時間
1.RC 和 DaemonSet:必須設定為 Always,需要保證該容器持續執行。
2.Job 和 CronJob:OnFailure 或 Never,確保容器執行完成後不再重啟。
3.kubelet:在 Pod 失效時自動重啟它,不論將 RestartPolicy 設定為什麼值,也不會對 Pod 進行健康檢查。
1.3.6、Pod 的資源清單詳解
eg:
# 資源型別
kind: Pod
# api版本號
apiVersion: v1
# 定義Pod的元資訊
metadata:
name: nginx-pod
namespace: default
labels:
app: aginx
spec:
containers:
- name: nginx
image: nginx:1.19.2
imagePullPolicy: IfNotPresent
kubectl apply -f pod-nginx.yaml
kubectl get pods -o wide
1.4、 Label
Label 是 Kubernetes 系統中另外一個核心概念。一個 Label 是一個 key=value 的鍵值對,其中 key 與 vaue 由用 戶自己指定。Label 可以附加到各種資源物件上,例如 Node、Pod、Service、RC 等,一個資源物件可以定義任意 數量的 Label,同一個 Label 也可以被新增到任意數量的資源物件上去,Label 通常在資源物件定義時確定,也可 以在物件建立後動態新增或者刪除。
我們可以通過指定的資源物件捆綁一個或多個不同的 Label 來實現多維度的資源分組管理功能,以便於靈活、 方便地進行資源分配、排程、配置、部署等管理工作。例如:部署不同版本的應用到不同的環境中;或者監控和 分析應用(日誌記錄、監控、告警)等。一些常用等 label 示例如下。
- 版本標籤:"release" : "stable" , "release" : "canary"
- 環境標籤:"environment" : "dev" , "environment" : "production"
- 架構標籤:"tier" : "frontend" , "tier" : "backend" , "tier" : "middleware"
- 分割槽標籤:"partition" : "customerA" , "partition" : "customerB" 阿里雲
- 質量管控標籤:"track" : "daily" , "track" :
Label 相當於我們熟悉的“標籤”,給某個資源物件定義一個 Label,就相當於給它打了一個標籤,隨後可以 通過 Label Selector(標籤選擇器)查詢和篩選擁有某些 Label 的資源物件,Kubernetes 通過這種方式實現了類似 SQL 的簡單又通用的物件查詢機制。
[root@kubernetes-master-01 ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-86c57db685-xnstd 1/1 Running 2 26d app=nginx,pod-template-hash=86c57db685
nginx-pod 1/1 Running 1 3h55m app=aginx
1.4.1、根據標籤來查詢 Pod
# 根據名稱空間查詢
[root@kubernetes-master-01 ~]# kubectl get pod --show-labels -n docs
No resources found in docs namespace.
[root@kubernetes-master-01 ~]# kubectl get pod --show-labels -n default
NAME READY STATUS RESTARTS AGE LABELS
nginx-86c57db685-xnstd 1/1 Running 2 26d app=nginx,pod-template-hash=86c57db685
nginx-pod 1/1 Running 1 3h58m app=aginx
# 根據標籤名稱查詢
kubectl get pod -l env=dev
1.4.2、增加標籤
方式一:
# 直接修改.yml檔案label
# 資源型別
kind: Pod
# api版本號
apiVersion: v1
# 定義Pod的元資訊
metadata:
name: nginx-pod
namespace: default
labels:
app: nginx
env: dev
spec:
containers:
- name: nginx
image: nginx:1.19.2
imagePullPolicy: IfNotPresent
# 執行
kubectl apply -f pod-nginx.yaml
# 檢視標籤
kubectl get pod --show-labels
方式二:
kubectl label pod pod名稱 標籤鍵值對
kubectl label pod nginx-pod dev=test
kubectl get pod --show-labels
1.4.3、刪除標籤
kubectl label pod pod名稱 key名+-
kubectl label pod nginx-pod dev-
1.4.4、可以將標籤顯示為列
kubectl get pods -L app -n default
1.5、 service 資源
service 是 k8s 中的一個重要概念,主要是提供負載均衡和服務自動發現。它是 k8s 中最核心的資源之一,每 一個 Service 就是我們平常所說的一個“微服務”。在非 k8s 世界中,管理員可以通過在配置檔案中指定 IP 地址 或主機名,容許客戶端訪問,但在 k8s 中這種方式是行不通的。因為 Pod 是有生命週期的,它們可以被建立或 銷燬。雖然通過控制器能夠動態地建立 Pod,但當 Pod 被分配到某個節點時,K8s 都會為其分配一個 IP 地址,而 該 IP 地址不總是穩定可依賴的。因此,在 Kubernetes 叢集中,如果一組 Pod(稱為 backend)為其它 Pod (稱 為 frontend)提供服務,那麼那些 frontend 該如何發現,並連線到這組 backend 的 Pod 呢?
如上圖所示,Kubernetes 的 Service 定義了一個服務的訪問入口,前端的應用(Pod)通過這個入口地址訪問 其背後的一組由 Pod 副本組成的叢集例項,Service 與其後端的 Pod 副本叢集之間是通過 Label Selector 來實現關 聯的,而 Deployment 則是保證 Service 的服務能力和服務質量始終處於預期的標準。
通過分析,識別並建模系統中的所有服務為微服務,最終我們的系統是由多個提供不同業務能力而彼此獨立 的微服務單元所組成,服務之間通過 TCP/IP 進行通訊,從而形成了強大而又靈活的彈性網路,擁有強大的分佈 式能力、彈性擴充套件能力、容錯能力。
每一個service就是一個對外暴露的一個服務,service通過標籤連線每一個pod
說明:
kubectl get pod -o wide
kubectl get svc
kubectl describe svc nginx
kubectl get pod --show-labels # Selector負載均衡的就是nginx-pod、nginx-86c57db685-xnstd這兩個pod Endpoints:關聯所有的ip和埠
selector負載均衡:labels標籤名為:app=nginx
1.5.1、定義 Service
kubectl explain svc # 檢視版本
1.5.2、Service 的工作方式
在 Kubernetes 迭代過程中,給 Service 設定裡三種工作方式,分別是:Userspace 方式、Iptables 以及 Ipvs, 這三種方式到現在為止,官方推薦使用 IPVS, 當叢集不支援 IPVS 的時候,叢集會降級到 Iptables
1.5.2.1、 Userspace
Client Pod 要訪問 Server Pod 時,它先將請求發給本機核心空間中的 service 規則,由它再將請求,轉給監聽在指 定套接字上的 kube-proxy,kube-proxy 處理完請求,並分發請求到指定 Server Pod 後,再將請求遞交給核心空間中 的 service,由 service 將請求轉給指定的 Server Pod。由於其需要來回在使用者空間和核心空間互動通訊,因此效率 很差。
1.5.2.2、 Iptables 模型
直接由核心中的 iptables 規則,接受 Client Pod 的請求,並處理完成後,直接轉發給指定 ServerPod。這種方 式不再將請求轉發給 kube-proxy,效能提升很多。
1.5.2.3、 Ipvs 模型
在 ipvs 模式下,kube-proxy 監視 Kubernetes 服務和端點,呼叫 netlink 介面相應地建立 IPVS 規則, 並定 期將 IPVS 規則與 Kubernetes 服務和端點同步。 該控制迴圈可確保 IPVS 狀態與所需狀態匹配。 訪問服務時, IPVS 將流量定向到後端 Pod 之一。
IPVS 代理模式基於類似於 iptables 模式的 netfilter 掛鉤函式,但是使用雜湊表作為基礎資料結構,並且在 核心空間中工作。 這意味著,與 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通訊的 延遲要短,並且在同步代理規則時具有更好的效能。與其他代理模式相比,IPVS 模式還支援更高的網路流量吞 吐量。
以上不論哪種,kube-proxy 都通過 watch 的方式監控著 kube-APIServer 寫入 etcd 中關於 Pod 的最新狀態資訊, 它一旦檢查到一個 Pod 資源被刪除了 或 新建,它將立即將這些變化,反應再 iptables 或 ipvs 規則中,以便 iptables 和 ipvs 在排程 Clinet Pod 請求到 Server Pod 時,不會出現 Server Pod 不存在的情況
自 k8s1.1 以後,service 預設使用 ipvs 規則,若 ipvs 沒有被啟用,則降級使用 iptables 規則. 但在 1.1 以前,service 使用的模式預設為 userspace。
1.5.3、Service 型別
Service 是 Kubernetes 對外訪問的視窗,針對不同的場景,kubernetes 為我們設定了四種 Service 的型別。
1.5.3.1、 ClusterIP
kubernetes 預設就是這種方式,是叢集內部訪問的方式,外部是無法訪問的(叢集外部是無法訪問的)。其主要用於為叢集內 Pod 訪 問時,提供的固定訪問地址,預設是自動分配地址,可使用 ClusterIP 關鍵字指定固定 IP。
kind: Service
apiVersion: v1
metadata:
name: clusterip-svc
namespace: default
spec:
selector: # 選擇器
env: dev
ports: # 暴露埠
- port: 80 # 暴露埠(service埠)
targetPort: 80 # 容器裡面埠
type: ClusterIP
kubectl apply -f clusterip-svc
kubectl get svc
1.5.3.1.1、 Headless Service
kubernates 中還有一種 service 型別:headless serivces 功能,字面意思無 service 其實就是改 service 對外無提 供 IP。一般用於對外提供域名服務的時候,我們在 Ingress 章節詳講。
1.5.3.2、 NodePort
NodePort 是將主機 IP 和埠跟 kubernetes 叢集所需要暴露的 IP 和埠進行關聯,方便其對外提供服務。內 部可以通過 ClusterIP 進行訪問,外部使用者可以通過 NodeIP:NodePort 的方式單獨訪問每個 Node 上的例項。
1.5.3.3、 LoadBalancer
LoadBalancer 型別的 service 是可以實現叢集外部訪問服務的另外一種解決方案。不過並不是所有的 k8s 集 群都會支援,大多是在公有云託管叢集中會支援該型別。負載均衡器是非同步建立的,關於被提供的負載均衡器的 資訊將會通過 Service 的 status.loadBalancer 欄位被髮布出去。
kind: Service
apiVersion: v1
metadata:
name: pod-svc
namespace: default
spec:
selector: # 選擇器
env: dev
ports: # 暴露埠
- port: 80 # 暴露埠(service埠)
targetPort: 80 # 容器裡面埠
type: LoadBalancer
kubectl apply -f loadbalancer.yaml
kubectl get svc
1.5.3.4、 ExternalName
ExternalName Service 是 Service 的一個特例,它沒有選擇器,也沒有定義任何埠或 Endpoints。它的作用是 返回叢集外 Service 的外部別名。它將外部地址經過叢集內部的再一次封裝(實際上就是叢集 DNS 伺服器將 CNAME 解析到了外部地址上),實現了叢集內部訪問即可。例如你們公司的映象倉庫,最開始是用 ip 訪問,等到後面域 名下來了再使用域名訪問。你不可能去修改每處的引用。但是可以建立一個 ExternalName,首先指向到 ip,等後 面再指向到域名。
kind: Service
apiVersion: v1
metadata:
name: my-svc
spec:
type: ExternalName
externalName: www.baidu.com
1.6、 deployment 資源
Deployment 為 Pod 提供宣告式更新。在 Deployment 物件中描述所需的狀態,然後 Deployment 控制器將實 際狀態以受控的速率更改為所需的狀態。您可以定義部署以建立新的副本集,或刪除現有部署並在新部署中採用 其所有資源。一句話:Deployment 主要功能是保證有足夠的 Pod 正常對外提供服
deployment-->pod的控制器
作用保證一定數量的pod副本
eg:
有2個pod
宕機了一個:pod(1)
zabbix--->報警郵件--->運維同學檢查哪裡有問題-->啟動服務pod(2)(太黑下班了)(手動建立)
當deployment發現一個服務宕機了,會自動建立一個服務pod
supcerctl管理程序,程序存在,不能夠對外提供服務
1.6.1、建立 Depoyment
# 定義資源型別
kind: Deployment
# 指定API版本號
apiVersion: apps/v1
# 元資訊
metadata:
namespace: default
name: test-deployment
labels:
app: test-deployment
spec:
# 選擇器
selector:
# 精確匹配
matchLabels:
app: nginx
dev: pro
# 定義pod的模板
template:
metadata:
# 跟matchlabels精確匹配只能多不能少
labels:
app: nginx
dev: pro
name: randysun
spec:
containers:
- name: nginx # 容器名稱
image: nginx:latest
imagePullPolicy: IfNotPresent # 拉取映象規則
# 定義副本pod數量
replicas: 2
1.6.1.1、 引數示意
nginx-deployment:Deployment 的名稱。
replicas: 建立 Pod 的副本數。
selector:定義 Deployment 如何找到要管理的 Pod,與 template 的 label(標籤)對應。
template 欄位包含以下欄位:
app: nginx 使用 label(標籤)標記 Pod
spec:表示 Pod 執行一個名字為 nginx 的容器。
image:執行此 Pod 使用的映象
Port:容器用於傳送和接收流量的埠
1.6.1.2、 執行建立命令
vi deployment.yaml
kubectl apply -f deployment.yaml
kubectl get pod
kubectl get -f deployment.yaml
假設一個pod出現問題
kubectl get -f deployment.yaml
kubectl delete pod test-deployment-69b64b5769-z572k
kubectl get -f deployment.yaml
kubectl get pod -l dev=pro
[root@kubernetes-master-01 ~]# kubectl get -f deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
test-deployment 2/2 2 2 7m19s
[root@kubernetes-master-01 ~]# kubectl delete pod test-deployment-69b64b5769-z572k
pod "test-deployment-69b64b5769-z572k" deleted
[root@kubernetes-master-01 ~]# kubectl get -f deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
test-deployment 2/2 2 2 8m1s
[root@kubernetes-master-01 ~]# kubectl get pod -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-69b64b5769-j8nns 1/1 Running 0 8m19s
test-deployment-69b64b5769-rs8f5 1/1 Running 0 26s
# 刪除一個pod則立刻被建立一個pod
升級版deployment對外提供服務
kind: Deployment
# 指定API版本號
apiVersion: apps/v1
# 元資訊
metadata:
namespace: default
name: test-deployment
labels:
app: test-deployment
spec:
# 選擇器
selector:
# 精確匹配
matchLabels:
app: nginx
dev: pro
# 定義pod的模板
template:
metadata:
# 跟matchlabels精確匹配只能多不能少
labels:
app: nginx
dev: pro
name: randysun
spec:
containers:
- name: nginx # 容器名稱
image: nginx:latest
imagePullPolicy: IfNotPresent # 拉取映象規則
# 定義副本pod數量
replicas: 2
---
kind: Service
apiVersion: v1
metadata:
name: test-deployment-svc
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30001
selector: # 選擇器與label一樣只能多不能少
app: nginx
dev: pro
不間斷的對外提供服務
1.6.1.3、 注意
將 kubectl 標誌設定--record 為 true 允許您將當前命令記錄在正在建立或更新的資源的註釋中。這對於將來 的檢查很有用。
kubectl rollout history deployment test-deployment
kubectl delete -f deployment.yaml
kubectl get pod -l dev=pro
kubectl apply -f deployment.yaml --record
kubectl rollout history deployment test-deployment
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
1 <none>
[root@kubernetes-master-01 ~]# kubectl delete -f deployment.yaml
deployment.apps "test-deployment" deleted
service "test-deployment-svc" deleted
[root@kubernetes-master-01 ~]# kubectl get pod -l dev=pro
No resources found in default namespace.
[root@kubernetes-master-01 ~]# kubectl apply -f deployment.yaml --rec
--record --recursive
[root@kubernetes-master-01 ~]# kubectl apply -f deployment.yaml --record
deployment.apps/test-deployment created
service/test-deployment-svc created
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
[root@kubernetes-master-01 ~]#
1.6.2、檢視部署狀態
kubectl get pods -l dev=pro
# 檢視部署詳情並可以檢視部署錯誤資訊
kubectl describe pods test-deployment-69b64b5769-jsmqq
# 編輯控制器
kubectl edit deployments.apps test-deployment
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-69b64b5769-9nphp 1/1 Running 0 2m19s
test-deployment-69b64b5769-jsmqq 1/1 Running 0 2m19s
1.6.3、檢視部署詳情
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-69b64b5769-9nphp 1/1 Running 0 4m36s
test-deployment-69b64b5769-jsmqq 1/1 Running 0 4m36s
[root@kubernetes-master-01 ~]# kubectl describe pods test-deployment-69b64b5769-jsmqq
Name: test-deployment-69b64b5769-jsmqq
Namespace: default
Priority: 0
Node: kubernetes-node-02/172.16.0.54
Start Time: Tue, 09 Mar 2021 23:43:10 +0800
Labels: app=nginx
dev=pro
name=randysun
pod-template-hash=69b64b5769
Annotations: <none>
Status: Running
IP: 10.240.144.2
IPs:
IP: 10.240.144.2
Controlled By: ReplicaSet/test-deployment-69b64b5769
Containers:
nginx:
Container ID: docker://8136e7ae43b75ae7f392294b70ad68cb084e582e0788c17d5a7648a879fc474c
Image: nginx:latest
Image ID: docker-pullable://nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 09 Mar 2021 23:43:11 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-xt6cs (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-xt6cs:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-xt6cs
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 360s
node.kubernetes.io/unreachable:NoExecute for 360s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m52s default-scheduler Successfully assigned default/test-deployment-69b64b5769-jsmqq to kubernetes-node-02
Normal Pulled 4m52s kubelet Container image "nginx:latest" already present on machine
Normal Created 4m52s kubelet Created container nginx
Normal Started 4m51s kubelet Started container nginx
1.6.4、更新
一般對應用程序升級或者版本迭代時,會通過 Deployment 對 Pod 進行滾動更新。
1.6.4.1、 設定
kubectl set image deployment 建立deployment的名字 建立的容器名字=映象版本
kubectl set image deployment test-deployment nginx=nginx:1.18.0
# 現啟動一個在刪除,保證永遠能夠提供服務
1.6.4.2、 修改
# 將nginx版本修改為1.19.2映象
kubectl edit deployments.apps test-deployment
kubectl get pods -l dev=pro
kubectl get pods -l dev=pro -w
1.6.4.3、 檢視更新狀態
kubectl rollout status deployment 建立deploymen的名稱
kubectl rollout status deployment test-deploymen
[root@kubernetes-master-01 ~]# kubectl rollout status deployment test-deployment
deployment "test-deployment" successfully rolled out
[root@kubernetes-master-01 ~]# kubectl set image deployment test-deployment nginx=1.17.10
deployment.apps/test-deployment image updated
[root@kubernetes-master-01 ~]# kubectl rollout status deployment test-deployment
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
1.6.5、回滾
當新版本不穩定時,可以對其進行回滾操作,預設情況下,所有 Deployment 的 rollout 歷史都保留在系統中, 可以隨時回滾。
1.6.5.1、 檢視構建歷史
kubectl rollout history deployment 建立deployment名稱
# 檢視當前構建歷史
kubectl rollout history deployment test-deployment
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
2 kubectl apply --filename=deployment.yaml --record=true
3 kubectl apply --filename=deployment.yaml --record=true
4 kubectl apply --filename=deployment.yaml --record=true
1.6.5.2、 回滾到上一個版本
# 檢視當前構建歷史
kubectl rollout history deployment test-deployment
# 開始回滾
kubectl rollout undo deployment test-deployment
# 檢視構建狀態
kubectl rollout status deployment test-deployment
# 檢視 deployment 詳細資訊
kubectl describe pods test-deployment-5d45d64fdb-7gdlg
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
2 kubectl apply --filename=deployment.yaml --record=true
3 kubectl apply --filename=deployment.yaml --record=true
4 kubectl apply --filename=deployment.yaml --record=true
[root@kubernetes-master-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-xnstd 1/1 Running 4 29d
nginx-pod 1/1 Running 3 3d5h
test-deployment-5d45d64fdb-4wtfw 1/1 Running 1 22h
test-deployment-5d45d64fdb-7gdlg 1/1 Running 1 22h
test-deployment-66bf6cc7d-4h7hw 0/1 ImagePullBackOff 0 16m
[root@kubernetes-master-01 ~]#
[root@kubernetes-master-01 ~]#
[root@kubernetes-master-01 ~]# kubectl rollout undo deployment test-deployment
deployment.apps/test-deployment rolled back
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-5d45d64fdb-4wtfw 1/1 Running 1 22h
test-deployment-5d45d64fdb-7gdlg 1/1 Running 1 22h
[root@kubernetes-master-01 ~]# kubectl describe pod
poddisruptionbudgets.policy pods podsecuritypolicies.policy podtemplates
[root@kubernetes-master-01 ~]# kubectl describe pods test-deployment-5d45d64fdb-7gdlg
Name: test-deployment-5d45d64fdb-7gdlg
Namespace: default
Priority: 0
Node: kubernetes-node-02/172.16.0.54
Start Time: Wed, 10 Mar 2021 00:03:40 +0800
Labels: app=nginx
dev=pro
name=randysun
pod-template-hash=5d45d64fdb
Annotations: <none>
Status: Running
IP: 10.240.8.2
IPs:
IP: 10.240.8.2
Controlled By: ReplicaSet/test-deployment-5d45d64fdb
Containers:
nginx:
Container ID: docker://acfb7e914cd5ef549a99d13789d78d6c5a693f8d0f2313bc17db7dbba5c09bb5
Image: nginx:1.18.0
Image ID: docker-pullable://nginx@sha256:ebd0fd56eb30543a9195280eb81af2a9a8e6143496accd6a217c14b06acd1419
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 10 Mar 2021 21:58:13 +0800
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: Wed, 10 Mar 2021 00:04:08 +0800
Finished: Wed, 10 Mar 2021 21:58:11 +0800
Ready: True
Restart Count: 1
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-xt6cs (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-xt6cs:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-xt6cs
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 360s
node.kubernetes.io/unreachable:NoExecute for 360s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 22h default-scheduler Successfully assigned default/test-deployment-5d45d64fdb-7gdlg to kubernetes-node-02
Normal Pulling 22h kubelet Pulling image "nginx:1.18.0"
Normal Pulled 22h kubelet Successfully pulled image "nginx:1.18.0"
Normal SandboxChanged 26m kubelet Pod sandbox changed, it will be killed and re-created.
Normal Created 26m (x2 over 22h) kubelet Created container nginx
Normal Started 26m (x2 over 22h) kubelet Started container nginx
Normal Pulled 26m kubelet Container image "nginx:1.18.0" already present on machine
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
2 kubectl apply --filename=deployment.yaml --record=true
4 kubectl apply --filename=deployment.yaml --record=true
5 kubectl apply --filename=deployment.yaml --record=true
1.6.5.3、 回滾指定版本
# 檢視當前歷史版本
kubectl rollout history deployment test-deployment
# 回滾至指定版本
kubectl rollout undo deployment test-deployment --to-revision=1
# 查看回滾狀態
kubectl rollout status deployment test-deployment
# 檢視 deployment 詳細資訊
kubectl describe deployments.apps test-deployment
# 檢視當前歷史版本
kubectl rollout history deployment test-deployment
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
2 kubectl apply --filename=deployment.yaml --record=true
4 kubectl apply --filename=deployment.yaml --record=true
5 kubectl apply --filename=deployment.yaml --record=true
[root@kubernetes-master-01 ~]# kubectl rollout undo deployment test-deployment --to-revision=1
deployment.apps/test-deployment rolled back
[root@kubernetes-master-01 ~]# kubectl rollout status deployment test-deployment
deployment "test-deployment" successfully rolled out
[root@kubernetes-master-01 ~]# kubectl describe deployments.apps test-deployment
Name: test-deployment
Namespace: default
CreationTimestamp: Tue, 09 Mar 2021 23:43:10 +0800
Labels: app=test-deployment
Annotations: deployment.kubernetes.io/revision: 6
kubernetes.io/change-cause: kubectl apply --filename=deployment.yaml --record=true
Selector: app=nginx,dev=pro
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
dev=pro
name=randysun
Containers:
nginx:
Image: nginx:latest
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: test-deployment-69b64b5769 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 22h deployment-controller Scaled up replica set test-deployment-69b64b5769 to 2
Normal ScalingReplicaSet 22h deployment-controller Scaled up replica set test-deployment-6f5585566c to 1
Normal ScalingReplicaSet 22h deployment-controller Scaled down replica set test-deployment-69b64b5769 to 1
Normal ScalingReplicaSet 22h deployment-controller Scaled up replica set test-deployment-6f5585566c to 2
Normal ScalingReplicaSet 22h deployment-controller Scaled down replica set test-deployment-69b64b5769 to 0
Normal ScalingReplicaSet 22h deployment-controller Scaled up replica set test-deployment-5d45d64fdb to 1
Normal ScalingReplicaSet 22h deployment-controller Scaled down replica set test-deployment-6f5585566c to 1
Normal ScalingReplicaSet 22h deployment-controller Scaled up replica set test-deployment-5d45d64fdb to 2
Normal ScalingReplicaSet 22h deployment-controller Scaled down replica set test-deployment-6f5585566c to 0
Normal ScalingReplicaSet 27m deployment-controller Scaled up replica set test-deployment-66bf6cc7d to 1
Normal ScalingReplicaSet 10m deployment-controller Scaled down replica set test-deployment-66bf6cc7d to 0
Normal ScalingReplicaSet 28s deployment-controller Scaled up replica set test-deployment-69b64b5769 to 1
Normal ScalingReplicaSet 27s deployment-controller Scaled down replica set test-deployment-5d45d64fdb to 1
Normal ScalingReplicaSet 27s deployment-controller Scaled up replica set test-deployment-69b64b5769 to 2
Normal ScalingReplicaSet 24s deployment-controller Scaled down replica set test-deployment-5d45d64fdb to 0
[root@kubernetes-master-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-xnstd 1/1 Running 4 29d
nginx-pod 1/1 Running 3 3d5h
test-deployment-69b64b5769-d55j9 1/1 Running 0 41s
test-deployment-69b64b5769-f5z4t 1/1 Running 0 42s
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
2 kubectl apply --filename=deployment.yaml --record=true
4 kubectl apply --filename=deployment.yaml --record=true
5 kubectl apply --filename=deployment.yaml --record=true
6 kubectl apply --filename=deployment.yaml --record=true
1.6.6、擴容
當業務的使用者越來越多,目前的後端服務已經無法滿足業務要求當前的業務要求,傳統的解決辦法是將其橫 向增加伺服器,從而滿足我們的業務要求。K8S 中也是支援橫向擴容的方法的。
第一種方式
# 第一種方式:scale
kubectl scale deployment test-deployment --replicas=7
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-6f5585566c-7r2gf 1/1 Running 0 15m
test-deployment-6f5585566c-975ch 1/1 Running 0 15m
test-deployment-6f5585566c-vmzrf 1/1 Running 0 8m56s
[root@kubernetes-master-01 ~]# kubectl scale deployment test-deployment --replicas=7
deployment.apps/test-deployment scaled
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-6f5585566c-7r2gf 1/1 Running 0 15m
test-deployment-6f5585566c-975ch 1/1 Running 0 15m
test-deployment-6f5585566c-9hglp 0/1 ContainerCreating 0 8s
test-deployment-6f5585566c-kln8r 1/1 Running 0 7s
test-deployment-6f5585566c-p9xq2 1/1 Running 0 8s
test-deployment-6f5585566c-rsmvf 1/1 Running 0 8s
test-deployment-6f5585566c-vmzrf 1/1 Running 0 9m17s
第二種方式
# 第二種方式: Patch(打標籤)
kubectl patch deployments.apps nginx-deployment -p '{"spec": {"replicas": 5}}'
[root@kubernetes-master-01 ~]# kubectl patch deployments.apps test-deployment -p '{"spec": {"replicas": 3}}'
deployment.apps/test-deployment patched
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-6f5585566c-7r2gf 1/1 Running 0 14m
test-deployment-6f5585566c-975ch 1/1 Running 0 14m
test-deployment-6f5585566c-vmzrf 1/1 Running 0 7m59s
第三種方式
# 第三種方式(線上編輯)edit
kubectl edit deployments.apps test-deployment
[root@kubernetes-master-01 ~]# kubectl edit deployments.apps test-deployment
deployment.apps/test-deployment edited
# 監聽pods
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-5d45d64fdb-4wtfw 1/1 Running 1 22h
test-deployment-5d45d64fdb-7gdlg 1/1 Running 1 22h
test-deployment-66bf6cc7d-4h7hw 0/1 ImagePullBackOff 0 7m56s
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
ku c NAME READY STATUS RESTARTS AGE
test-deployment-6f5585566c-7r2gf 1/1 Running 0 4m55s
test-deployment-6f5585566c-975ch 1/1 Running 0 4m57s
[root@kubernetes-master-01 ~]# kubectl get pods -o -w
error: unable to match a printer suitable for the output format "-w", allowed formats are: custom-columns,custom-columns-file,go-template,go-template-file,json,jsonpath,jsonpath-file,name,template,templatefile,wide,yaml
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro -w
NAME READY STATUS RESTARTS AGE
test-deployment-6f5585566c-7r2gf 1/1 Running 0 5m16s
test-deployment-6f5585566c-975ch 1/1 Running 0 5m18s
test-deployment-6f5585566c-vmzrf 0/1 Pending 0 0s
test-deployment-6f5585566c-vmzrf 0/1 Pending 0 0s
test-deployment-6f5585566c-2hj99 0/1 Pending 0 0s
test-deployment-6f5585566c-whvht 0/1 Pending 0 0s
test-deployment-6f5585566c-whvht 0/1 Pending 0 0s
test-deployment-6f5585566c-2hj99 0/1 Pending 0 1s
test-deployment-6f5585566c-vmzrf 0/1 ContainerCreating 0 1s
test-deployment-6f5585566c-2hj99 0/1 ContainerCreating 0 1s
test-deployment-6f5585566c-whvht 0/1 ContainerCreating 0 2s
test-deployment-6f5585566c-vmzrf 1/1 Running 0 18s
test-deployment-6f5585566c-2hj99 1/1 Running 0 32s
test-deployment-6f5585566c-whvht 1/1 Running 0 2m21s
test-deployment-6f5585566c-975ch 1/1 Running 0 8m37s
test-deployment-6f5585566c-975ch 1/1 Running 0 8m47s
test-deployment-6f5585566c-whvht 1/1 Running 0 2m36s
test-deployment-6f5585566c-whvht 1/1 Running 0 2m40s
test-deployment-6f5585566c-975ch 1/1 Running 0 9m8s
test-deployment-6f5585566c-975ch 1/1 Running 0 9m17s
test-deployment-6f5585566c-whvht 1/1 Running 0 3m27s
test-deployment-6f5585566c-whvht 1/1 Running 0 3m29s
# 檢視建立的pod
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME READY STATUS RESTARTS AGE
test-deployment-6f5585566c-2hj99 1/1 Running 0 5m26s
test-deployment-6f5585566c-7r2gf 1/1 Running 0 11m
test-deployment-6f5585566c-975ch 1/1 Running 0 11m
test-deployment-6f5585566c-vmzrf 1/1 Running 0 5m26s
test-deployment-6f5585566c-whvht 1/1 Running 0 5m26s
1.6.7、暫停部署
# 暫停部署
[root@kubernetes-master-01 ~]# kubectl rollout pause deployment test-deployment
deployment.apps/test-deployment paused
# 設定映象升級
[root@kubernetes-master-01 ~]# kubectl set image deployment test-deployment nginx=nginx:1.17.0
deployment.apps/test-deployment image updated
# 檢視部署狀態,發現沒有開始部署
[root@kubernetes-master-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-xnstd 1/1 Running 4 29d
nginx-pod 1/1 Running 3 3d6h
test-deployment-6f5585566c-7r2gf 1/1 Running 0 20m
test-deployment-6f5585566c-975ch 1/1 Running 0 20m
test-deployment-6f5585566c-9hglp 1/1 Running 0 4m52s
test-deployment-6f5585566c-kln8r 1/1 Running 0 4m51s
test-deployment-6f5585566c-p9xq2 1/1 Running 0 4m52s
test-deployment-6f5585566c-rsmvf 1/1 Running 0 4m52s
test-deployment-6f5585566c-vmzrf 1/1 Running 0 14m
# 取消暫停,開始部署
[root@kubernetes-master-01 ~]# kubectl rollout resume deployment test-deployment
deployment.apps/test-deployment resumed
# 檢視狀態,發現開始部署
[root@kubernetes-master-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-xnstd 1/1 Running 4 29d
nginx-pod 1/1 Running 3 3d6h
test-deployment-6f5585566c-7r2gf 1/1 Running 0 21m
test-deployment-6f5585566c-975ch 1/1 Running 0 21m
test-deployment-6f5585566c-9hglp 1/1 Running 0 5m45s
test-deployment-6f5585566c-p9xq2 1/1 Running 0 5m45s
test-deployment-6f5585566c-rsmvf 1/1 Running 0 5m45s
test-deployment-6f5585566c-vmzrf 1/1 Running 0 14m
test-deployment-765f4986fd-8fscm 0/1 ContainerCreating 0 7s
test-deployment-765f4986fd-8pb59 0/1 ContainerCreating 0 7s
test-deployment-765f4986fd-hvmtw 0/1 ContainerCreating 0 7s
在當下的階段,必將由程式設計師來主導,甚至比以往更甚。