k8s-YAML配置文件(轉)

轉自http://www.cnblogs.com/bigberg/p/9203619.html

1、YAML基礎

  YAML是專門用來寫配置文件的語言,很是簡潔和強大,使用比json更方便。它實質上是一種通用的數據串行化格式。html

YAML語法規則:node

  • 大小寫敏感
  • 使用縮進表示層級關係
  • 縮進時不容許使用Tal鍵,只容許使用空格
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊便可
  • 」#」 表示註釋,從這個字符一直到行尾,都會被解析器忽略  

在Kubernetes中,只須要知道兩種結構類型便可:nginx

  • Lists
  • Maps

  1.1 YAML Mapsweb

  Map顧名思義指的是字典,即一個Key:Value 的鍵值對信息。例如:  apache

---
apiVersion: v1
kind: Pod

  

 注:---爲可選的分隔符 ,當須要在一個文件中定義多個結構的時候須要使用。上述內容表示有兩個鍵apiVersion和kind,分別對應的值爲v1和Pod。json

  Maps的value既可以對應字符串也可以對應一個Maps。例如:flask

---
apiVersion: v1
kind: Pod
metadata:
  name: kube100-site
  labels:
    app: web

  

 注:上述的YAML文件中,metadata這個KEY對應的值爲一個Maps,而嵌套的labels這個KEY的值又是一個Map。實際使用中可視狀況進行多層嵌套。api

  YAML處理器根據行縮進來知道內容之間的關聯。上述例子中,使用兩個空格做爲縮進,但空格的數據量並不重要,只是至少要求一個空格而且全部縮進保持一致的空格數 。例如,name和labels是相同縮進級別,所以YAML處理器知道他們屬於同一map;它知道app是lables的值由於app的縮進更大。數組

  注意:在YAML文件中絕對不要使用tab鍵bash

  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"
            }]
        }]
  }
}

  

 

2、說明

  • 定義配置時,指定最新穩定版API
  • 配置文件應該存儲在集羣以外的版本控制倉庫中。若是須要,能夠快速回滾配置、從新建立和恢復
  • 應該使用YAML格式編寫配置文件,而不是json。YAML對用戶更加友好
  • 能夠將相關對象組合成單個文件,一般會更容易管理
  • 不要不必指定默認值,簡單和最小配置減少錯誤
  • 在註釋中說明一個對象描述更好維護

 

3、使用YAML建立Pod 

---
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,這個版本號須要根據安裝的Kubernetes版本和資源類型進行變化,記住不是寫死的。
  • kind:此處建立的是Pod,根據實際狀況,此處資源類型能夠是Deployment、Job、Ingress、Service等。
  • metadata:包含Pod的一些meta信息,好比名稱、namespace、標籤等信息。
  • spe:包括一些container,storage,volume以及其餘Kubernetes須要的參數,以及諸如是否在容器失敗時從新啓動容器的屬性。可在特定Kubernetes API找到完整的Kubernetes Pod的屬性。

  (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

  

 4、建立Deployment

  名詞解釋 

#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"
相關文章
相關標籤/搜索