YAML是專門用來寫配置文件的語言,很是簡潔和強大,使用比json更方便。它實質上是一種通用的數據串行化格式。html
YAML語法規則:node
在Kubernetes中,只須要知道兩種結構類型便可:python
1.1 YAML Mapsnginx
Map顧名思義指的是字典,即一個Key:Value 的鍵值對信息。例如: web
--- apiVersion: v1 kind: Pod
注:---爲可選的分隔符 ,當須要在一個文件中定義多個結構的時候須要使用。上述內容表示有兩個鍵apiVersion和kind,分別對應的值爲v1和Pod。apache
Maps的value既可以對應字符串也可以對應一個Maps。例如: json
--- apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web
注:上述的YAML文件中,metadata這個KEY對應的值爲一個Maps,而嵌套的labels這個KEY的值又是一個Map。實際使用中可視狀況進行多層嵌套。flask
YAML處理器根據行縮進來知道內容之間的關聯。上述例子中,使用兩個空格做爲縮進,但空格的數據量並不重要,只是至少要求一個空格而且全部縮進保持一致的空格數 。例如,name和labels是相同縮進級別,所以YAML處理器知道他們屬於同一map;它知道app是lables的值由於app的縮進更大。api
注意:在YAML文件中絕對不要使用tab鍵數組
1.2 YAML Lists
List即列表,說白了就是數組,例如:
args -beijing -shanghai -shenzhen -guangzhou
能夠指定任何數量的項在列表中,每一個項的定義以破折號(-)開頭,而且與父元素之間存在縮進。在JSON格式中,表示以下:
{ "args": ["beijing", "shanghai", "shenzhen", "guangzhou"] }
固然Lists的子項也能夠是Maps,Maps的子項也能夠是List,例如:
--- apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web spec: containers: - name: front-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: 8080
如上述文件所示,定義一個containers的List對象,每一個子項都由name、image、ports組成,每一個ports都有一個KEY爲containerPort的Map組成,轉成JSON格式文件:
{ "apiVersion": "v1", "kind": "Pod", "metadata": { "name": "kube100-site", "labels": { "app": "web" }, }, "spec": { "containers": [{ "name": "front-end", "image": "nginx", "ports": [{ "containerPort": "80" }] }, { "name": "flaskapp-demo", "image": "jcdemo/flaskapp", "ports": [{ "containerPort": "5000" }] }] } }
--- apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web spec: containers: - name: front-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: - containerPort: 5000
(1)查看apiVersion
# kubectl api-versions admissionregistration.k8s.io/v1beta1 apiextensions.k8s.io/v1beta1 apiregistration.k8s.io/v1 apiregistration.k8s.io/v1beta1 apps/v1 apps/v1beta1 apps/v1beta2 authentication.k8s.io/v1 authentication.k8s.io/v1beta1 authorization.k8s.io/v1 authorization.k8s.io/v1beta1 autoscaling/v1 autoscaling/v2beta1 batch/v1 batch/v1beta1 certificates.k8s.io/v1beta1 events.k8s.io/v1beta1 extensions/v1beta1 networking.k8s.io/v1 policy/v1beta1 rbac.authorization.k8s.io/v1 rbac.authorization.k8s.io/v1beta1 storage.k8s.io/v1 storage.k8s.io/v1beta1 v1
(2)下面是一個典型的容器定義:
… spec: containers: - name: front-end image: nginx ports: - containerPort: 80 …
上述例子只是一個簡單的最小定義:一個名字(front-end)、基於nginx的鏡像,以及容器將會監聽的指定端口號(80)。
除了上述的基本屬性外,還可以指定複雜的屬性,包括容器啓動運行的命令、使用的參數、工做目錄以及每次實例化是否拉取新的副本。 還能夠指定更深刻的信息,例如容器的退出日誌的位置。容器可選的設置屬性包括:
name、image、command、args、workingDir、ports、env、resource、volumeMounts、livenessProbe、readinessProbe、livecycle、terminationMessagePath、imagePullPolicy、securityContext、stdin、stdinOnce、tty
(3)kubectl建立Pod
# kubectl create -f test_pod.yaml pod "kube100-site" created
(4)查看Pod狀態
# kubectl get pod NAME READY STATUS RESTARTS AGE kube100-site 2/2 Running 0 2m
名詞解釋
#test-pod apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中 kind: Pod #指定建立資源的角色/類型 metadata: #資源的元數據/屬性 name: test-pod #資源的名字,在同一個namespace中必須惟一 labels: #設定資源的標籤 k8s-app: apache version: v1 kubernetes.io/cluster-service: "true" annotations: #自定義註解列表 - name: String #自定義註解名字 spec: #specification of the resource content 指定該資源的內容 restartPolicy: Always #代表該容器一直運行,默認k8s的策略,在此容器退出後,會當即建立一個相同的容器 nodeSelector: #節點選擇,先給主機打標籤kubectl label nodes kube-node1 zone=node1 zone: node1 containers: - name: test-pod #容器的名字 image: 10.192.21.18:5000/test/chat:latest #容器使用的鏡像地址 imagePullPolicy: Never #三個選擇Always、Never、IfNotPresent,每次啓動時檢查和更新(從registery)images的策略, # Always,每次都檢查 # Never,每次都不檢查(無論本地是否有) # IfNotPresent,若是本地有就不檢查,若是沒有就拉取 command: ['sh'] #啓動容器的運行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT args: ["$(str)"] #啓動容器的命令參數,對應Dockerfile中CMD參數 env: #指定容器中的環境變量 - name: str #變量的名字 value: "/etc/run.sh" #變量的值 resources: #資源管理 requests: #容器運行時,最低資源需求,也就是說最少須要多少資源容器才能正常運行 cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值爲0.001核(1m) memory: 32Mi #內存使用量 limits: #資源限制 cpu: 0.5 memory: 1000Mi ports: - containerPort: 80 #容器開發對外的端口 name: httpd #名稱 protocol: TCP livenessProbe: #pod內容器健康檢查的設置 httpGet: #經過httpget檢查健康,返回200-399之間,則認爲容器正常 path: / #URI地址 port: 80 #host: 127.0.0.1 #主機地址 scheme: HTTP initialDelaySeconds: 180 #代表第一次檢測在容器啓動後多長時間後開始 timeoutSeconds: 5 #檢測的超時時間 periodSeconds: 15 #檢查間隔時間 #也能夠用這種方法 #exec: 執行命令的方法進行監測,若是其退出碼不爲0,則認爲容器正常 # command: # - cat # - /tmp/health #也能夠用這種方法 #tcpSocket: //經過tcpSocket檢查健康 # port: number lifecycle: #生命週期管理 postStart: #容器運行以前運行的任務 exec: command: - 'sh' - 'yum upgrade -y' preStop:#容器關閉以前運行的任務 exec: command: ['service httpd stop'] volumeMounts: #掛載持久存儲卷 - name: volume #掛載設備的名字,與volumes[*].name 須要對應 mountPath: /data #掛載到容器的某個路徑下 readOnly: True volumes: #定義一組掛載設備 - name: volume #定義一個掛載設備的名字 #meptyDir: {} hostPath: path: /opt #掛載設備類型爲hostPath,路徑爲宿主機下的/opt,這裏設備類型支持不少種 #nfs
(1)建立一個yaml文件
apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80
(2)建立deployment
[root@master-01 YAML_k8s]# kubectl create -f nginx-deployment.yaml deployment.apps "nginx-deployment" created [root@master-01 YAML_k8s]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deployment-6b7b4d57b4-26wzj 1/1 Running 0 2m 10.20.184.83 master-01 nginx-deployment-6b7b4d57b4-9w7tm 1/1 Running 0 2m 10.20.190.60 node-01 nginx-deployment-6b7b4d57b4-mhh8t 1/1 Running 0 2m 10.20.254.108 node-03 [root@master-01 YAML_k8s]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 3 3 3 3 2m
(3)查看標籤
[root@master-01 YAML_k8s]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-deployment-6b7b4d57b4-26wzj 1/1 Running 0 3m app=nginx,pod-template-hash=2636081360 nginx-deployment-6b7b4d57b4-9w7tm 1/1 Running 0 3m app=nginx,pod-template-hash=2636081360 nginx-deployment-6b7b4d57b4-mhh8t 1/1 Running 0 3m app=nginx,pod-template-hash=2636081360
(4)經過標籤查找Pod
[root@master-01 YAML_k8s]# kubectl get pod -l app=nginx NAME READY STATUS RESTARTS AGE nginx-deployment-6b7b4d57b4-26wzj 1/1 Running 0 6m nginx-deployment-6b7b4d57b4-9w7tm 1/1 Running 0 6m nginx-deployment-6b7b4d57b4-mhh8t 1/1 Running 0 6m
(5)deployment建立過程
Deployment 管理的是replicaset-controller,RC會建立Pod。Pod自身會下載鏡像並啓動鏡像
[root@master-01 YAML_k8s]# kubectl describe rs nginx-deployment ... ... ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 33m replicaset-controller Created pod: nginx-deployment-6b7b4d57b4-9w7tm Normal SuccessfulCreate 33m replicaset-controller Created pod: nginx-deployment-6b7b4d57b4-26wzj Normal SuccessfulCreate 33m replicaset-controller Created pod: nginx-deployment-6b7b4d57b4-mhh8t [root@master-01 YAML_k8s]# kubectl describe pod nginx-deployment-6b7b4d57b4-26wzj ... ... ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 36m default-scheduler Successfully assigned nginx-deployment-6b7b4d57b4-26wzj to master-01 Normal SuccessfulMountVolume 36m kubelet, master-01 MountVolume.SetUp succeeded for volume "default-token-v5vw9" Normal Pulled 36m kubelet, master-01 Container image "nginx:1.10" already present on machine Normal Created 36m kubelet, master-01 Created container Normal Started 36m kubelet, master-01 Started container
(6)升級鏡像(nginx1.10-->nginx1.11)
[root@master-01 YAML_k8s]# kubectl set image deploy/nginx-deployment nginx=nginx:1.11 deployment.apps "nginx-deployment" image updated [root@master-01 YAML_k8s]# kubectl exec -it nginx-deployment-b96c97dc-2pxjf bash root@nginx-deployment-b96c97dc-2pxjf:/# nginx -V nginx version: nginx/1.11.13
升級鏡像的過程是逐步進行的,pod不會一會兒所有關閉,而是一個一個升級
(7)查看發佈狀態
[root@master-01 ~]# kubectl rollout status deploy/nginx-deployment deployment "nginx-deployment" successfully rolled out
(8)查看deployment歷史修訂版本
[root@master-01 ~]# kubectl rollout history deploy/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 <none> 2 <none> # 顯示歷史有兩個版本 [root@master-01 ~]# kubectl rollout history deploy/nginx-deployment --revision=1 deployments "nginx-deployment" with revision #1 Pod Template: Labels: app=nginx pod-template-hash=2636081360 Containers: nginx: Image: nginx:1.10 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> [root@master-01 ~]# kubectl rollout history deploy/nginx-deployment --revision=2 deployments "nginx-deployment" with revision #2 Pod Template: Labels: app=nginx pod-template-hash=65275387 Containers: nginx: Image: nginx:1.11 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none>
(8)編輯deployment
[root@master-01 ~]# kubectl edit deploy/nginx-deployment # 將nginx版本改成1.12 ... ... ... spec: containers: - image: nginx:1.12 imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80
升級過程:
[root@master-01 ~]# kubectl rollout status deploy/nginx-deployment Waiting for rollout to finish: 1 out of 3 new replicas have been updated... Waiting for rollout to finish: 1 out of 3 new replicas have been updated... Waiting for rollout to finish: 1 out of 3 new replicas have been updated... Waiting for rollout to finish: 2 out of 3 new replicas have been updated... Waiting for rollout to finish: 2 out of 3 new replicas have been updated... Waiting for rollout to finish: 2 out of 3 new replicas have been updated... Waiting for rollout to finish: 1 old replicas are pending termination... Waiting for rollout to finish: 1 old replicas are pending termination... deployment "nginx-deployment" successfully rolled out
(10)擴容/縮容(指定--replicas的數量)
[root@master-01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-6b47cf4878-8mjkr 1/1 Running 0 1m nginx-deployment-6b47cf4878-kr978 1/1 Running 0 1m nginx-deployment-6b47cf4878-tvhvl 1/1 Running 0 1m [root@master-01 ~]# kubectl scale deploy/nginx-deployment --replicas=5 deployment.extensions "nginx-deployment" scaled [root@master-01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-6b47cf4878-6r5dz 0/1 ContainerCreating 0 4s nginx-deployment-6b47cf4878-7sjtt 0/1 ContainerCreating 0 4s nginx-deployment-6b47cf4878-8mjkr 1/1 Running 0 2m nginx-deployment-6b47cf4878-kr978 1/1 Running 0 2m nginx-deployment-6b47cf4878-tvhvl 1/1 Running 0 2m
(11)建立Service提供對外訪問的接口
apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: ports: - port: 88 targetPort: 80 selector: app: nginx #### apiVersion: 指定版本 kind: 類型 name: 指定服務名稱 labels: 標籤 port: Service 服務暴露的端口 targetPort: 容器暴露的端口 seletor: 關聯的Pod的標籤
建立service
# kubectl create -f nginx-service.yaml
查看service(訪問Pod是有負載均衡的)
[root@master-01 YAML_k8s]# kubectl get svc/nginx-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service ClusterIP 10.254.131.176 <none> 88/TCP 1m # curl 10.254.131.176:88 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
對service的描述
# kubectl describe svc/nginx-service Name: nginx-service Namespace: default Labels: app=nginx Annotations: <none> Selector: app=nginx Type: ClusterIP IP: 10.254.131.176 Port: <unset> 88/TCP TargetPort: 80/TCP Endpoints: 10.20.184.19:80,10.20.184.84:80,10.20.190.62:80 + 2 more... Session Affinity: None Events: <none
(12)回滾到之前的版本
# kubectl rollout history deploy/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 <none> # kubectl rollout history deploy/nginx-deployment --revision=3 deployments "nginx-deployment" with revision #3 Pod Template: Labels: app=nginx pod-template-hash=2603790434 Containers: nginx: Image: nginx:1.12 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> # 回滾到上一個版本 # kubectl rollout undo deploy/nginx-deployment deployment.apps "nginx-deployment" # 查看版本 # kubectl describe deploy/nginx-deployment ... ... Labels: app=nginx Containers: nginx: Image: nginx:1.11
(13)回滾到指定版本
# kubectl rollout history deploy/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 <none> 3 <none> 4 <none> # 指定版本 # kubectl rollout undo deploy/nginx-deployment --to-revision=1 deployment.apps "nginx-deployment"