k8s之Deployment詳解

一、官方介紹
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
Deployment爲Pod和Replica Set提供聲明式更新。
你只需要在 Deployment 中描述您想要的目標狀態是什麼,Deployment controller 就會幫您將 Pod 和ReplicaSet 的實際狀態改變到您的目標狀態。您可以定義一個全新的 Deployment 來創建 ReplicaSet 或者刪除已有的 Deployment 並創建一個新的來替換。
注意:您不該手動管理由 Deployment 創建的 Replica Set,否則您就篡越了 Deployment controller 的職責!下文羅列了 Deployment 對象中已經覆蓋了所有的用例。如果未有覆蓋您所有需要的用例,請直接在 Kubernetes 的代碼庫中提 issue。



二、Deployment可以幫我們做什麼
定義一組Pod期望數量,Controller會維持Pod數量與期望數量一致
配置Pod的發佈方式,controller會按照給定的策略更新Pod,保證更新過程中不可用Pod維持在限定數量範圍內
如果發佈有問題支持回滾
三、Deployment原理
控制器模型
在Kubernetes架構中,有一個叫做kube-controller-manager的組件。這個組件,是一系列控制器的集合。其中每一個控制器,都以獨有的方式負責某種編排功能。而Deployment正是這些控制器中的一種。它們都遵循Kubernetes中一個通用的編排模式,即:控制循環





用一段go語言僞代碼,描述這個控制循環

for {
實際狀態 := 獲取集羣中對象X的實際狀態
期望狀態 := 獲取集羣中對象X的期望狀態
if 實際狀態 == 期望狀態 {
什麼都不做
}else{
執行編排動作,將實際狀態調整爲期望狀態
}
}
在具體實現中,實際狀態往往來自於Kubernetes集羣本身。比如Kubelet通過心跳彙報的容器狀態和節點狀態,或者監控系統中保存的應用監控數據,或者控制器主動收集的它感興趣的信息,這些都是常見的實際狀態的來源;期望狀態一般來自用戶提交的YAML文件,這些信息都保存在Etcd中








對於Deployment,它的控制器簡單實現如下:

Deployment Controller從Etcd中獲取到所有攜帶 “app:nginx”標籤的Pod,然後統計它們的數量,這就是實際狀態
Deployment對象的replicas的值就是期望狀態
Deployment Controller將兩個狀態做比較,然後根據比較結果,確定是創建Pod,還是刪除已有Pod
滾動更新
Deployment滾動更新的實現,依賴的是Kubernetes中的ReplicaSet



Deployment控制器實際操縱的,就是Replicas對象,而不是Pod對象。對於Deployment、ReplicaSet、Pod它們的關係如下圖:

ReplicaSet負責通過“控制器模式”,保證系統中Pod的個數永遠等於指定的個數。這也正是Deployment只允許容器的restartPolicy=Always的主要原因:只有容器能保證自己始終是running狀態的前提下,ReplicaSet調整Pod的個數纔有意義。

Deployment同樣通過控制器模式,操作ReplicaSet的個數和屬性,進而實現“水平擴展/收縮”和“滾動更新”兩個編排動作對於“水平擴展/收縮”的實現,Deployment Controller只需要修改replicas的值即可。用戶執行這個操作的指令如下:

kubectl scale deployment nginx-deployment --replicas=4
四、Delpyment演示
啓動minikube
minikube start


deployment_nginx.yml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
















  • name: nginx
    image: nginx:1.12.2
    ports:
    • containerPort: 80
      創建deployment
      kubectl create -f deployment_nginx.yml
      kubectl get deployment
      kubectl get rs
      kubectl get pods






deployment信息
可以看到這個deloyment下的詳情,nginx是1.12.2

kubectl get deployment -o wide

deployment的升級
針對目前的nginx1.12升級成1.13的命令,老的下面自動移除了,全部都在新的下面。

kubectl set image deployment nginx-deployment nginx=nginx:1.13
kubectl get deployment
kubectl get deployment -o wide
kubectl get pods


deployment查看歷史版本
kubectl rollout history deployment nginx-deployment

deployment 回滾到之前的版本
又變成了nginx 1.12.2

kubectl rollout undo deployment nginx-deployment

deployment 端口暴露
其實就是把端口暴露在minikube上。

kubectl get node
kubectl get node -o wide
kubectl expose deployment nginx-deployment --type=NodePort
#查看node節點暴露的端口30960
kubectl get svc
#進入minikube查看ip地址192.168.99.100
minikube ssh





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章