K8S脈絡整理(006)-運行Deployment(kubectl 命令和yaml配置文件)


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 不存在),也能在這里查看到原因。

總結一下這個過程:

  1. 用戶通過 kubectl 創建 Deployment。

  2. Deployment 創建 ReplicaSet。

  3. 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。

下面對這兩種方式進行比較。

基於命令的方式:

  1. 簡單直觀快捷,上手快。

  2. 適合臨時測試或實驗。

基於配置文件的方式:

  1. 配置文件描述了 What,即應用最終要達到的狀態。

  2. 配置文件提供了創建資源的模板,能夠重復部署。

  3. 可以像管理代碼一樣管理部署。

  4. 適合正式的、跨環境的、規模化部署。

  5. 這種方式要求熟悉配置文件的語法,有一定難度。

kubectl apply 不但能夠創建 Kubernetes 資源,也能對資源進行更新,非常方便。

不過 Kubernets 還提供了幾個類似的命令,例如 kubectl createkubectl replacekubectl 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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM