1. 程式人生 > 其它 >K8S 入門基本操作體驗及 YAML 使用

K8S 入門基本操作體驗及 YAML 使用

k8s命令

一、安裝Tomcat

1、部署一個tomcat(主節點部署)

kubectl create deployment tomcat6  --image=tomcat:6.0.53-jre8
kubectl get pods -o wide  # 可以獲取到Tomcat資訊(Tomcat具體部署在哪個節點)

列印結果:
在這裡插入圖片描述
可以看到Tomcat已經部署在 k8s-node2 節點上了。在 k8s-node3 伺服器檢視映象,在主節點安裝的,已經在從節點上安裝好了。

2、暴露埠訪問

kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort  # 主節點執行
Pod 的 80 對映器的8080;service會代理 Pod 的80

檢視:kubectl get svc
在這裡插入圖片描述

kubectl get svc -o wide

在這裡插入圖片描述
可以看到,tomcat6的service暴露在了 32711 這個埠,然後可以通過 http://192.168.10.102:30925/ 訪問。

3、動態擴容測試

kubectl get deployment

應用升級:kubectl set image (–help 檢視幫助)
擴容:kubectl scale --replicas=3 deployment tomcat6
擴容了多份,所有無論訪問哪個node的指定埠,都可以訪問到 tocat6

4、刪除

kubectl get all
kubectl delete deploy/nginx
kubectl delete service/nginx-service

流程:建立deployment會管理replicas,replicas控制pod數量,有pod故障會自動拉起新的pod。

二、yaml基本使用

1、K8S 建立資源的方式

K8S有兩種建立資源的方式:kubectl 命令和 yaml 配置檔案。

kubectl命令列:最為簡單,一條命令就OK,但缺點也很明顯,你並不知道這條命令背後到底做了哪些事!
yaml配置檔案:提供了一種讓你知其然更知其所以然的方式。優勢如下:

  • 完整性:配置檔案描述了一個資源的完整狀態,可以很清楚地知道一個資源的建立背後究竟做了哪些事;
  • 靈活性:配置檔案可以建立比命令列更復雜的結構;
  • 可維護性:配置檔案提供了建立資源物件的模板,能夠重複使用;
  • 可擴充套件性:適合跨環境、規模化的部署。

yml模板:
在這裡插入圖片描述

2.檔案模板

 yaml格式的pod定義檔案完整內容:
apiVersion: v1       #必選,版本號,例如v1
kind: Pod       #必選,Pod
metadata:       #必選,元資料
  name: string       #必選,Pod名稱
  namespace: string    #必選,Pod所屬的名稱空間
  labels:      #自定義標籤
    - name: string     #自定義標籤名字
  annotations:       #自定義註釋列表
    - name: string
spec:         #必選,Pod中容器的詳細定義
  containers:      #必選,Pod中容器列表
  - name: string     #必選,容器名稱
    image: string    #必選,容器的映象名稱
    imagePullPolicy: [Always | Never | IfNotPresent] #獲取映象的策略 Alawys表示下載映象 IfnotPresent表示優先使用本地映象,否則下載映象,Nerver表示僅使用本地映象
    command: [string]    #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
    args: [string]     #容器的啟動命令引數列表
    workingDir: string     #容器的工作目錄
    volumeMounts:    #掛載到容器內部的儲存卷配置
    - name: string     #引用pod定義的共享儲存卷的名稱,需用volumes[]部分定義的的卷名
      mountPath: string    #儲存卷在容器內mount的絕對路徑,應少於512字元
      readOnly: boolean    #是否為只讀模式
    ports:       #需要暴露的埠庫號列表
    - name: string     #埠號名稱
      containerPort: int   #容器需要監聽的埠號
      hostPort: int    #容器所在主機需要監聽的埠號,預設與Container相同
      protocol: string     #埠協議,支援TCP和UDP,預設TCP
    env:       #容器執行前需設定的環境變數列表
    - name: string     #環境變數名稱
      value: string    #環境變數的值
    resources:       #資源限制和請求的設定
      limits:      #資源限制的設定
        cpu: string    #Cpu的限制,單位為core數,將用於docker run --cpu-shares引數
        memory: string     #記憶體限制,單位可以為Mib/Gib,將用於docker run --memory引數
      requests:      #資源請求的設定
        cpu: string    #Cpu請求,容器啟動的初始可用數量
        memory: string     #記憶體清楚,容器啟動的初始可用數量
    livenessProbe:     #對Pod內個容器健康檢查的設定,當探測無響應幾次後將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設定其中一種方法即可
      exec:      #對Pod容器內檢查方式設定為exec方式
        command: [string]  #exec方式需要制定的命令或指令碼
      httpGet:       #對Pod內個容器健康檢查方法設定為HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #對Pod內個容器健康檢查方式設定為tcpSocket方式
         port: number
       initialDelaySeconds: 0  #容器啟動完成後首次探測的時間,單位為秒
       timeoutSeconds: 0   #對容器健康檢查探測等待響應的超時時間,單位秒,預設1秒
       periodSeconds: 0    #對容器監控檢查的定期探測時間設定,單位秒,預設10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged:false
    restartPolicy: [Always | Never | OnFailure]#Pod的重啟策略,Always表示一旦不管以何種方式終止執行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
    nodeSelector: obeject  #設定NodeSelector表示將該Pod排程到包含這個label的node上,以key:value的格式指定
    imagePullSecrets:    #Pull映象時使用的secret名稱,以key:secretkey格式指定
    - name: string
    hostNetwork:false      #是否使用主機網路模式,預設為false,如果設定為true,表示使用宿主機網路
    volumes:       #在該pod上定義共享儲存卷列表
    - name: string     #共享儲存卷名稱 (volumes型別有很多種)
      emptyDir: {}     #型別為emtyDir的儲存卷,與Pod同生命週期的一個臨時目錄。為空值
      hostPath: string     #型別為hostPath的儲存卷,表示掛載Pod所在宿主機的目錄
        path: string     #Pod所在宿主機的目錄,將被用於同期中mount的目錄
      secret:      #型別為secret的儲存卷,掛載叢集與定義的secre物件到容器內部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:     #型別為configMap的儲存卷,掛載預定義的configMap物件到容器內部
        name: string
        items:
        - key: string

yaml例項檔案

apiVersion: extensions/v1beta1   #介面版本
kind: Deployment                 #介面型別
metadata:
  name: ptengine-demo               #Deployment名稱
  namespace: ptengine-prd           #namespace 名稱
  labels:
    app: ptengine-demo              #標籤
spec:
  replicas: 3
   strategy:
    rollingUpdate:  ##由於replicas為3,則整個升級,pod個數在2-4個之間
      maxSurge: 1       #滾動升級時會先啟動1個pod
      maxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數
  template:         
    metadata:
      labels:
        app: ptengine-demo  #模板名稱必填
    sepc: #定義容器模板,該模板可以包含多個容器
      containers:                                                                   
        - name: ptengine-demo                                                           #映象名稱
          image: reg.pt1.com/ptengine-prd/ptengine-demo:0.0.1-SNAPSHOT #映象地址
          CMD: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ]    #啟動CMD
          args:                                                                #啟動引數
            - '-storage.local.retention=$(STORAGE_RETENTION)'
。。。。。。。。
            - '-web.external-url=$(EXTERNAL_URL)'

          imagePullPolicy: IfNotPresent  #如果不存在則拉取
          livenessProbe:       #表示container是否處於live狀態。如果LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨後kubelet將kill掉container,並根據RestarPolicy進行進一步的操作。預設情況下LivenessProbe在第一次檢測之前初始化值為Success,如果container沒有提供LivenessProbe,則也認為是Success;
            httpGet:
              path: /health #如果沒有心跳檢測介面就為/
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60 ##啟動後延時多久開始執行檢測
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 5
            readinessProbe:
          readinessProbe:
            httpGet:
              path: /health #如果沒有健康檢測介面就為/
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 30 ##啟動後延時多久開始執行檢測
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 5
          resources:              ##CPU記憶體限制
            requests:
              cpu: 2
              memory: 2048Mi
            limits:
              cpu: 2
              memory: 2048Mi
          env:                    ##通過環境變數的方式,直接傳遞pod=自定義Linux OS環境變數
            - name: LOCAL_KEY     #本地Key
              value: value
            - name: CONFIG_MAP_KEY  #local策略可使用configMap的配置Key,
              valueFrom:
                configMapKeyRef:
                  name: special-config   #configmap中找到name為special-config
                  key: special.type      #找到name為special-config裡data下的key
          ports:
            - name: http
              containerPort: 8080 #對service暴露埠
          volumeMounts:     #掛載volumes中定義的磁碟
          - name: log-cache
            mount: /tmp/log
          - name: sdb       #普通用法,該卷跟隨容器銷燬,掛載一個目錄
            mountPath: /data/media    
          - name: nfs-client-root    #直接掛載硬碟方法,如掛載下面的nfs目錄到/mnt/nfs
            mountPath: /mnt/nfs
          - name: example-volume-config  #高階用法第1種,將ConfigMap的log-script,backup-script分別掛載到/etc/config目錄下的一個相對路徑path/to/...下,如果存在同名檔案,直接覆蓋。
            mountPath: /etc/config       
          - name: rbd-pvc                #高階用法第2中,掛載PVC(PresistentVolumeClaim)

#使用volume將ConfigMap作為檔案或目錄直接掛載,其中每一個key-value鍵值對都會生成一個檔案,key為檔名,value為內容,
  volumes:  # 定義磁碟給上面volumeMounts掛載
  - name: log-cache
    emptyDir: {}
  - name: sdb  #掛載宿主機上面的目錄
    hostPath:
      path: /any/path/it/will/be/replaced
  - name: example-volume-config  # 供ConfigMap檔案內容到指定路徑使用
    configMap:
      name: example-volume-config  #ConfigMap中名稱
      items:
      - key: log-script           #ConfigMap中的Key
        path: path/to/log-script  #指定目錄下的一個相對路徑path/to/log-script
      - key: backup-script        #ConfigMap中的Key
        path: path/to/backup-script  #指定目錄下的一個相對路徑path/to/backup-script
  - name: nfs-client-root         #供掛載NFS儲存型別
    nfs:
      server: 10.42.0.55          #NFS伺服器地址
      path: /opt/public           #showmount -e 看一下路徑
  - name: rbd-pvc                 #掛載PVC磁碟
    persistentVolumeClaim:
      claimName: rbd-pvc1         #掛載已經申請的pvc磁碟

kubernetes建立pod的yaml檔案,引數說明:

apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中  
kind: Pod #指定建立資源的角色/型別  
metadata: #資源的元資料/屬性  
  name: web04-pod #資源的名字,在同一個namespace中必須唯一  
  labels: #設定資源的標籤,詳情請見http://blog.csdn.net/liyingke112/article/details/77482384
    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: web04-pod #容器的名字  
    image: web:apache #容器使用的映象地址  
    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: #資源管理,請求請見http://blog.csdn.net/liyingke112/article/details/77452630
      requests: #容器執行時,最低資源需求,也就是說最少需要多少資源容器才能正常執行  
        cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m)
        memory: 32Mi #記憶體使用量  
      limits: #資源限制  
        cpu: 0.5  
        memory: 32Mi  
    ports:  
    - containerPort: 80 #容器開發對外的埠
      name: httpd  #名稱
      protocol: TCP  
    livenessProbe: #pod內容器健康檢查的設定,詳情請見http://blog.csdn.net/liyingke112/article/details/77531584
      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:  #詳情請見http://blog.csdn.net/liyingke112/article/details/76577520
    - name: volume #掛載裝置的名字,與volumes[*].name 需要對應    
      mountPath: /data #掛載到容器的某個路徑下  
      readOnly: True  
  volumes: #定義一組掛載裝置  
  - name: volume #定義一個掛載裝置的名字  
    #meptyDir: {}  
    hostPath:  
      path: /opt #掛載裝置型別為hostPath,路徑為宿主機下的/opt,這裡裝置型別支援很多種

4、示例

部署(Deployment):
在上邊我們使用 kubectl 命令來建立了 Tomcat:

kubectl create deployment tomcat6  --image=tomcat:6.0.53-jre8

下邊我們使用yml來看如何建立:

# 使用該命令來建立yaml檔案,--dry-run 測試,不真正執行。
kubectl create deployment tomcat6  --image=tomcat:6.0.53-jre8 --dry-run -o yaml

執行以上命令即可輸出yaml檔案:

[[email protected]-node2 vagrant]# kubectl create deployment tomcat6  --image=tomcat:6.0.53-jre8 --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: tomcat6
  name: tomcat6
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat6
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: tomcat6
    spec:
      containers:
      - image: tomcat:6.0.53-jre8
        name: tomcat
        resources: {}
status: {}

上邊輸出的檔案就是我們要部署的Tomcat6檔案的yaml詳細資訊,或者也可以將上邊的列印輸出到yaml檔案,然後對這個檔案進行修改,執行操作:

# kubectl create deployment tomcat6  --image=tomcat:6.0.53-jre8 --dry-run -o yaml > tomcat6.yaml   # 重定向檔案
kubectl apply -f tomcat6.yaml   # 執行yaml檔案

埠暴露(service):
上邊的暴露埠命令我們也可以使用yaml檔案來執行。

[[email protected] k8s]# kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml

列印:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: tomcat6
  name: tomcat6
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: tomcat6
  type: NodePort
status:
  loadBalancer: {}

可以看到,kind型別為 service,這裡相當於暴露服務。
定義pod:

[[email protected] k8s]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
tomcat6-5f7ccf4cb9-xljrm   1/1     Running   2          15h
[[email protected] k8s]# kubectl get pod tomcat6-5f7ccf4cb9-xljrm 
NAME                       READY   STATUS    RESTARTS   AGE
tomcat6-5f7ccf4cb9-xljrm   1/1     Running   2          15h
[[email protected] k8s]# kubectl get pod tomcat6-5f7ccf4cb9-xljrm -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-09-21T13:12:49Z"
  generateName: tomcat6-5f7ccf4cb9-
  labels:
    app: tomcat6
    pod-template-hash: 5f7ccf4cb9
  name: tomcat6-5f7ccf4cb9-xljrm
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: tomcat6-5f7ccf4cb9
    uid: 81b504a0-c4d1-4bc7-a637-f7e42c1a16dd
  resourceVersion: "51703"
  selfLink: /api/v1/namespaces/default/pods/tomcat6-5f7ccf4cb9-xljrm
  uid: 5b91ec85-b2de-4c95-b480-974a5a68037a
spec:
  containers:
  - image: tomcat:6.0.53-jre8
    imagePullPolicy: IfNotPresent
    name: tomcat
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-rhqrl
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: k8s-node3
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: default-token-rhqrl
    secret:
      defaultMode: 420
      secretName: default-token-rhqrl
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2020-09-21T13:12:49Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2020-09-22T04:30:41Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2020-09-22T04:30:41Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2020-09-21T13:12:49Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://daa3d00931e7548c9bcdf93e1b80cc68e81caf9350e6495fefbbd589af29ceb7
    image: tomcat:6.0.53-jre8
    imageID: docker-pullable://[email protected]:8c643303012290f89c6f6852fa133b7c36ea6fbb8eb8b8c9588a432beb24dc5d
    lastState:
      terminated:
        containerID: docker://47f0ae5eb452fd05ae1172a9489fc8bb929aac863365ac3eaecaaeb3cee7e41c
        exitCode: 143
        finishedAt: "2020-09-21T15:12:59Z"
        reason: Error
        startedAt: "2020-09-21T13:37:25Z"
    name: tomcat
    ready: true
    restartCount: 2
    started: true
    state:
      running:
        startedAt: "2020-09-22T04:30:40Z"
  hostIP: 10.0.2.5
  phase: Running
  podIP: 10.244.1.4
  podIPs:
  - ip: 10.244.1.4
  qosClass: BestEffort
  startTime: "2020-09-21T13:12:49Z"