天天看點

Kubernetes 1.2 新功能介紹:Deployment

http://www.dockerinfo.net/1128.html

Kubernetes 1.2 新功能介紹:Deployment

什麼是Deployment

Kubernetes Deployment提供了官方的用于更新Pod和Replica Set(下一代的Replication Controller)的方法,您可以在Deployment對象中隻描述您所期望的理想狀态(預期的運作狀态),Deployment控制器為您将現在的實際狀态轉換成您期望的狀态,例如,您想将所有的webapp:v1.0.9更新成webapp:v1.1.0,您隻需建立一個Deployment,Kubernetes會按照Deployment自動進行更新。現在,您可以通過Deployment來建立新的資源(pod,rs,rc),替換已經存在的資源等。

Deployment內建了上線部署、滾動更新、建立副本、暫停上線任務,恢複上線任務,復原到以前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment可以幫我們實作無人值守的上線,大大降低我們的上線過程的複雜溝通、操作風險。

Deployment的使用場景

下面是Deployment的典型用例:

  • 使用Deployment來啟動(上線/部署)一個Pod或者ReplicaSet
  • 檢查一個Deployment是否成功執行
  • 更新Deployment來重新建立相應的Pods(例如,需要使用一個新的Image)
  • 如果現有的Deployment不穩定,那麼復原到一個早期的穩定的Deployment版本
  • 暫停或者恢複一個Deployment

建立Deployment

下面是一個簡單的Deployment的例子,它建立了一個ReplicaSet來建立三個

nginx Pods:      
cat > nginx-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:

- containerPort: 80      

建立nginx(1.7.9)deployment示例:

kubectl create -f nginx-deployment.yaml --record      

使用—record選項是為了記錄目前執行的指令所建立/更新的資源,即使用—record選型執行的deployment都會被記錄下來,用于以後檢視每次deployment的細節,檢視所有Deployment的曆史,或者復原到某一曆史版本。

我們使用kubectl get deployment(s) [name]來檢視Deployment的狀态,下面的指令供參考:

kubectl get deployment nginx-deploymen
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         3         3            3           22m      

這裡DESIRED為3,CURRENT為3,UP-TO-DATE,AVAILABLE均為3,說明Deployment按照您的預期(建立3個Nginx Pods)已經完成任務。

kubectl get deployement
kubectl get rc
kubectl get pods --show-labels
NAME                                READY     STATUS              RESTARTS   AGE       LABELS
nginx-deployment-2035384211-nllka   1/1       Running             0          23m       app=nginx,pod-template-hash=2035384211
nginx-deployment-2035384211-w1jqv   1/1       Running             0          23m       app=nginx,pod-template-hash=2035384211
nginx-deployment-2035384211-x0c1a   1/1       Running             0          23m       app=nginx,pod-template-hash=2035384211      

檢視Deployment的狀态

kubectl get deployment nginx-deployment -o yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: 2016-04-12T15:52:51Z
generation: 2
labels:
app: nginx
name: nginx-deployment
namespace: default
resourceVersion: "539464"
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-deployment
uid: 9ca3c289-00c6-11e6-a09f-fa163e788d93
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
observedGeneration: 2

replicas: 3

{.spec.replicas}被設定為3,那麼Deploymentment會建立3個nginx(1.7.9)的副本

kubectl get deployment nginx-deployment -o yaml | grep [Gg]eneration

generation: 2

observednGeneration: 2      

更新Deployment

假設我們現在需要将剛剛建立的nginx從1.7.9版本更新到1.9.1,我們可以建立一個新的Deployment:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.9.1
ports:
- containerPort: 80      

我們使用kubectl apply指令來發起Deployment更新:

kubectl apply -f new-nginx-deployment.yaml

deployment “nginx-deployment” configured      

也可以通過edit指令線上修改deployment:

kubectl edit deployment nginx-deployment

deployment “nginx-deployment” configured      

指令執行後,可以通過kubectl get pods [—show-label]來檢視nginx是否已經從1.7.9更新至1.9.1

復原Deployment

這裡我們模拟一次失敗的部署,我們利用一個不存在的鏡像(例如:nginx:1.91),我們看接下來會發生什麼。

先建立一個nginx(1.91)的Deployment:

cat > bad-nginx-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.91
ports:

- containerPort: 80      

更新這個deployment:

kubectl apply -f bad-nginx-deployment.yaml

kubectl get rs
NAME                          DESIRED   CURRENT   AGE
nginx-deployment-1564180365   2         2         32m
nginx-deployment-2035384211   0         0         37m
nginx-deployment-3066724191   2         2         30m      

檢視deployment的建立情況:

kubectl get pods 
NAME                                READY     STATUS             RESTARTS   AGE
daemons-demo-29xri                  1/1       Running            0          1h
daemons-demo-j5z1k                  1/1       Running            0          1h
daemons-demo-oxzki                  1/1       Running            0          1h
daemons-demo-rsw8f                  1/1       Running            0          1h
nginx-deployment-1564180365-klelt   1/1       Running            0          33m
nginx-deployment-1564180365-opmuu   1/1       Running            0          33m
nginx-deployment-3066724191-qmqo2   0/1       ImagePullBackOff   0          2m
nginx-deployment-3066724191-w6wd7   0/1       ImagePullBackOff   0          2m      

到此時,我們發現最新一次Deployment出現了問題,沒有找到相應的鏡像,部署失敗。對于這種情形,我們選擇将Deployment恢複到上一版本,注意,這裡不是通過恢複之前的RC或者Pods或者RS,而是復原Deployment。

檢視deployment的曆史記錄:

kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment":
REVISION    CHANGE-CAUSE
1       kubectl create -f nginx-deployment.yaml --record
4       kubectl apply -f new-nginx-deployment.yaml --record
5       kubectl apply -f bad-nginx-deployment.yaml --record      

REVISION的三個序号【1,4,5】說明您可以回到這三個版本中的任一一個,現在我們選擇回退到序号4即nginx:1.9.1版本:

kubectl get rs
NAME                          DESIRED   CURRENT   AGE
nginx-deployment-1564180365   2         2         39m
nginx-deployment-2035384211   0         0         43m
nginx-deployment-3066724191   2         2         36m

kubectl rollout undo deployment nginx-deployment --to-revision=4
deployment "nginx-deployment" rolled back

kubectl get rs
NAME                          DESIRED   CURRENT   AGE
nginx-deployment-1564180365   3         3         39m
nginx-deployment-2035384211   0         0         44m
nginx-deployment-3066724191   0         0         37m      

現在Deployment已經完全恢複到nginx1.9.1時的正常情況,nginx又可以正常對外服務了。在以後的實際運維工作中,我們會采用這種方式來復原應用版本,不再使用原來RC的方式。

暫停或恢複上線

在釋出一個新的deployment過程中,可以暫停上線過程:

kubectl rollout pause deployment nginx-deployment
kubectl get rs
NAME                          DESIRED   CURRENT   AGE
nginx-deployment-1564180365   3         3         45m
nginx-deployment-2035384211   0         0         50m
nginx-deployment-3066724191   0         0         42m      

也可通過如下指令恢複/繼續上線過程:

kubectl rollout resume deployment/nginx-deployment

kubectl get rs
NAME                          DESIRED   CURRENT   AGE
nginx-deployment-1564180365   3         3         46m
nginx-deployment-2035384211   0         0         51m
nginx-deployment-3066724191   0         0         44m      

繼續閱讀