Kubernetes 支持兩種方式創建資源:
1. 用 kubectl 命令直接創建,比如:
kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
在命令行中通過參數指定資源的屬性。
2. 通過配置文件和 kubectl apply
創建,要完成前面同樣的工作,可執行命令:
kubectl apply -f nginx.yml
分別介紹:
一、kubectl run 直接創建Deployment
Kubernetes 通過各種 Controller 來管理 Pod 的生命周期。
為了滿足不同業務場景,Kubernetes 開發了 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等多種 Controller。
首先學習最常用的 Deployment。
先從例子開始(通過 kubectl run
創建 Deployment),運行一個 Deployment:
kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
上面的命令將部署包含兩個副本的 Deployment nginx-deployment
,容器的 image 為 nginx:1.7.9
。
下面詳細分析 Kubernetes 都做了些什么工作。
daweij@master:~$ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE httpd-app 2 2 2 2 53m kubernetes-bootcamp 2 2 2 2 5h nginx-deployment 2 2 2 0 17m
kubectl get deployment
命令可以查看 nginx-deployment
的狀態,輸出顯示兩個副本正常運行。
kubectl describe deployment
了解更詳細的信息。
daweij@master:~$ kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Wed, 07 Mar 2018 14:02:48 +0800
Labels: run=nginx-deployment
Annotations: deployment.kubernetes.io/revision=1
Selector: run=nginx-deployment
Replicas: 2 desired | 2 updated | 2 total | 0 available | 2 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: run=nginx-deployment
Containers:
nginx-deployment:
Image: nginx:1.7.9
Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-d5655dd9d (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 18m deployment-controller Scaled up replica set nginx-deployment-d5655dd9d to 2
daweij@master:~$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
httpd-app-5fbccd7c6c-c8qq7 1/1 Running 0 55m 10.233.71.8 node3
httpd-app-5fbccd7c6c-jstpm 1/1 Running 0 55m 10.233.75.8 node2
kubernetes-bootcamp-5d7f968ccb-c57nw 1/1 Running 0 4h 10.233.75.7 node2
kubernetes-bootcamp-5d7f968ccb-lv24f 1/1 Running 0 4h 10.233.71.7 node3
nginx-deployment-d5655dd9d-4td79 0/1 ContainerCreating 0 18m <none> node1
nginx-deployment-d5655dd9d-9btkm 0/1 ContainerCreating 0 18m <none> node4
上述標紅部分,告訴我們創建了一個NewReplicaSet: nginx-deployment-d5655dd9d,Events
是 Deployment 的日志,記錄了 ReplicaSet 的啟動過程。
通過上面的分析,也驗證了 Deployment 通過 ReplicaSet 來管理 Pod 的事實。
接着我們將注意力切換到nginx-deployment-d5655dd9d,執行 kubectl describe replicaset
:
daweij@master:~$ kubectl get replicaset NAME DESIRED CURRENT READY AGE nginx-deployment-d5655dd9d 2 2 2 21m
兩個副本已經就緒,用 kubectl describe replicaset
查看詳細信息:
daweij@master:~$ kubectl describe replicaset nginx-deployment-d5655dd9d
Name: nginx-deployment-d5655dd9d
Namespace: default
Selector: pod-template-hash=812118858,run=nginx-deployment
Labels: pod-template-hash=812118858
run=nginx-deployment
Annotations: deployment.kubernetes.io/desired-replicas=2
deployment.kubernetes.io/max-replicas=3
deployment.kubernetes.io/revision=1
Controlled By: Deployment/nginx-deployment
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: pod-template-hash=812118858
run=nginx-deployment
Containers:
nginx-deployment:
Image: nginx:1.7.9
Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 31m replicaset-controller Created pod: nginx-deployment-d5655dd9d-4td79
Normal SuccessfulCreate 31m replicaset-controller Created pod: nginx-deployment-d5655dd9d-9btkm
Controlled By
指明此 ReplicaSet 是由 Deployment nginx-deployment
創建。
Events
記錄了兩個副本 Pod 的創建。接着我們來看 Pod,執行 kubectl get pod
:
daweij@master:~$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-d5655dd9d-4td79 1/1 Running 0 32m nginx-deployment-d5655dd9d-9btkm 1/1 Running 0 32m
兩個副本 Pod 都處於 Running
狀態,用 kubectl describe pod
查看更詳細的信息:
daweij@master:~$ kubectl describe pod nginx-deployment-d5655dd9d-4td79 Name: nginx-deployment-d5655dd9d-4td79 Namespace: default Node: node1/172.28.2.211 Start Time: Wed, 07 Mar 2018 14:03:08 +0800 Labels: pod-template-hash=812118858 run=nginx-deployment Annotations: <none> Status: Running IP: 10.233.102.133 Controlled By: ReplicaSet/nginx-deployment-d5655dd9d Containers: nginx-deployment: Container ID: docker://bd8995acce93e5b9ee64bb1984973de74ad65823da33d7bb2d68a3e0bb149d21 Image: nginx:1.7.9 Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451 Port: <none> State: Running Started: Wed, 07 Mar 2018 14:24:52 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-8g5br (ro) Conditions: Type Status Initialized True Ready True PodScheduled True Volumes: default-token-8g5br: Type: Secret (a volume populated by a Secret) SecretName: default-token-8g5br Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 33m default-scheduler Successfully assigned nginx-deployment-d5655dd9d-4td79 to node1 Normal SuccessfulMountVolume 32m kubelet, node1 MountVolume.SetUp succeeded for volume "default-token-8g5br" Normal Pulling 32m kubelet, node1 pulling image "nginx:1.7.9" Normal Pulled 11m kubelet, node1 Successfully pulled image "nginx:1.7.9" Normal Created 11m kubelet, node1 Created container Normal Started 11m kubelet, node1 Started container
Controlled By
指明此 Pod 是由 ReplicaSet nginx-deployment-1260880958
創建。Events
記錄了 Pod 的啟動過程。如果操作失敗(比如 image 不存在),也能在這里查看到原因。
總結一下這個過程:
-
用戶通過
kubectl
創建 Deployment。 -
Deployment 創建 ReplicaSet。
-
ReplicaSet 創建 Pod。
從上圖也可以看出,對象的命名方式是:子對象的名字
= 父對象名字
+ 隨機字符串或數字
。
二、通過配置文件和 kubectl apply
創建創建Deployment
通過配置文件和 kubectl apply
創建,要完成前面同樣的工作,可執行命令:
kubectl apply -f nginx.yml
nginx.yml 的內容為:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 template: metadata: labels: app: web_server spec: containers: - name: nginx image: nginx:1.7.9
資源的屬性寫在配置文件中,文件格式為 YAML。
下面對這兩種方式進行比較。
基於命令的方式:
-
簡單直觀快捷,上手快。
-
適合臨時測試或實驗。
基於配置文件的方式:
-
配置文件描述了
What
,即應用最終要達到的狀態。 -
配置文件提供了創建資源的模板,能夠重復部署。
-
可以像管理代碼一樣管理部署。
-
適合正式的、跨環境的、規模化部署。
-
這種方式要求熟悉配置文件的語法,有一定難度。
kubectl apply
不但能夠創建 Kubernetes 資源,也能對資源進行更新,非常方便。
不過 Kubernets 還提供了幾個類似的命令,例如 kubectl create
、kubectl replace
、kubectl edit
和 kubectl patch
。
為避免造成不必要的困擾,我們會盡量只使用 kubectl apply
,
此命令已經能夠應對超過 90% 的場景,事半功倍。
讀懂 Deployment YAML
既然要用 YAML 配置文件部署應用,現在就很有必要了解一下 Deployment 的配置格式,其他 Controller(比如 DaemonSet)非常類似。
還是以 nginx-deployment 為例,配置文件如下圖所示:
① apiVersion
是當前配置格式的版本。
② kind
是要創建的資源類型,這里是 Deployment
。
③ metadata
是該資源的元數據,name
是必需的元數據項。
④ spec
部分是該 Deployment
的規格說明。
⑤ replicas
指明副本數量,默認為 1。
⑥ template
定義 Pod 的模板,這是配置文件的重要部分。
⑦ metadata
定義 Pod 的元數據,至少要定義一個 label。label 的 key 和 value 可以任意指定。
⑧ spec
描述 Pod 的規格,此部分定義 Pod 中每一個容器的屬性,name
和 image
是必需的。
此 nginx.yml 是一個最簡單的 Deployment 配置文件,后面我們學習 Kubernetes 各項功能時會逐步豐富這個文件。
先刪除之前操作創建的Depolyment:
kubectl delete deployment nginx-deployment
執行 kubectl apply -f nginx.yml
:
daweij@master:~/stady01/nginx$ kubectl apply -f nginx.yml deployment "nginx-deployment" created daweij@master:~/stady01/nginx$ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE httpd-app 2 2 2 2 1h kubernetes-bootcamp 2 2 2 2 6h nginx-deployment 2 2 2 1 9s
daweij@master:~/stady01/nginx$ kubectl get replicaset NAME DESIRED CURRENT READY AGE httpd-app-5fbccd7c6c 2 2 2 1h kubernetes-bootcamp-5d7f968ccb 2 2 2 6h kubernetes-bootcamp-7689dc585d 0 0 0 5h nginx-deployment-5cff94d9b 2 2 1 37s daweij@master:~/stady01/nginx$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE httpd-app-5fbccd7c6c-c8qq7 1/1 Running 0 1h 10.233.71.8 node3 httpd-app-5fbccd7c6c-jstpm 1/1 Running 0 1h 10.233.75.8 node2 kubernetes-bootcamp-5d7f968ccb-c57nw 1/1 Running 0 5h 10.233.75.7 node2 kubernetes-bootcamp-5d7f968ccb-lv24f 1/1 Running 0 5h 10.233.71.7 node3 nginx-deployment-5cff94d9b-5j79m 0/1 ContainerCreating 0 48s <none> node3 nginx-deployment-5cff94d9b-q7z8s 1/1 Running 0 48s 10.233.102.135 node1
Deployment、ReplicaSet、Pod 都已經就緒。
如果要刪除這些資源,執行 kubectl delete deployment nginx-deployment
或者 kubectl delete -f nginx.yml
。
daweij@master:~/stady01/nginx$ kubectl delete -f nginx.yml deployment "nginx-deployment" deleted daweij@master:~/stady01/nginx$ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE httpd-app 2 2 2 2 1h kubernetes-bootcamp 2 2 2 2 6h