kubernets(k8s)使用-Pod篇

1. Pod定義

1.1 pod yaml格式

apiVersion: v1		# 版本號
kind: Pod
metadata:			# 元數據
  name: string		# pod的名稱
  namespace: string	# pod所屬的命名空間,默認值爲default
  labels:			# 自定義標籤
    - name: string
  annotations:		# 自定義標籤註釋
    - name: string	
spec:				# pod中容器的詳細定義
  containers:		# pod中的容器列表
  - name: string	# 容器的名稱
    image: string	# 容器的鏡像名稱
    # Always: 表示每次都嘗試重新拉取鏡像
    # Never: 表示僅使用本地鏡像
    # IfNotPresent: 如果本地有該鏡像,則使用本地的鏡像,本地不存在時拉取鏡像
    imagePullPolicy: [Always | Never | IfNotPresent]
    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 port相同。設置hostPort時,同一宿主機將無法啓動該容器的第二份副本
      protocol: string		# 端口協議,支持TCP和UDP,默認值爲TCP
    env:					# 容器運行前需設置的環境變量列表 
    - name: string			# 環境變量名稱
      value: string			# 環境變量的值
    resources:				# 資源限制和資源請求的設置
      limits:				# 資源限制的設置
        cpu: string			# CPU限制,單位爲core數,將用於docker run --cpu-share 參數
        memory: string		# 內存限制,單位可以爲MiB,GiB等,將用於docker run --memiry 參數
      requests:				# 資源請求的設置
        cpu: string			# CPU請求,單位爲core數,容器啓動的初始可用數量
        memory: string		# 內存請求,單位可以爲MiB,GiB等,容器啓動的初始可用數量
    livenessProbe:			# 對pod內各容器健康檢查的設置,當探測無響應幾次之後,系統將自動重啓該容器。可以設置的方法包括exec、httpGet、tcpSocket。對一個容器僅需設置一種健康檢查方法。
      exec:
        command: [string]	# exec方式需要指定命令或者腳本,返回值爲0則表示容器正常
      httpGet:				# 對pod內個容器健康檢查設置,需要指定path、port,任何大於200小於400的返回碼都會認定是成功的返回碼
        path: string		# 訪問的HTTP server的path
        port: number		# 訪問的容器的端口名字或者端口號
        host: string		# 連接的主機名,默認連接到pod的IP
        scheme: string		# 連接使用的schema,默認HTTP
        httpHeaders:		# 自定義請求的header
        - name: string	
          value: string
      tcpSocket:
        port: number
      initialDelaySeconds: 0	# 容器啓動後第一次執行探測是需要等待多少秒
      timeoutSeconds: 0			# 對容器健康監測的探測等待響應的超時時間設置,默認爲1s。若超過該設置,則認爲容器不健康,會重啓該容器
      periodSeconds: 0			# 對容器健康檢查的定期探測時間設置。默認是10秒,最小1秒
      successThreshold: 0		# 探測失敗後,最少連續探測成功多少次才被認定爲成功。默認是1。對於liveness必須是1。最小值是1。
      failureThreshold: 0		# 探測成功後,最少連續探測失敗多少次才被認定爲失敗。默認是3。最小值是1。
    securitycontext:
      privileged: false
  # pod重啓策略
  # Always: pod一旦終止運行,無論容器時如何終止的,kubelet都將重啓它
  # Never: pod終止後,kubelet將退出碼報告給master,不會重啓該pod
  # OnFailure: 只有pod以非零退出碼終止時,kubelet纔會重啓該容器。如果容器正常結束,則kubelet將不會重啓它。
  restartPolicy: [Always | Never | OnFailure]
  nodeSelector: object			# 設置node的label,以key:value格式指定,pod將被調度到具備有這些label的node上 
  imagePullSecrets:
  - name: string
  hostNetwork: false			# 是否使用主機網絡模式,默認值爲false。設置爲ture表示容器使用宿主機網絡,不再使用Docker網橋,該pod將無法再同一臺宿主機上啓動第2個副本
  volumes:						# 在該pod上定義的共享存儲卷列表
  - name: string				# 共享存儲卷的名稱,在一個pod中每個存儲卷定義一個名稱。容器定義部分的containers[].volumeMounts[].name將引用共享存儲卷的名稱
    emptyDir: {}				# 類型爲emptyDir的存儲卷,表示與pod同生命週期的一個臨時目錄,其值爲一個空對象
    hostPath:					# 類型爲hostPath表示掛載pod所在宿主機的目錄
      path: string				# pod所在主機的目錄。將被用於容器中的mount目錄containers[].volumeMounts[].mountPath
    secret:						# 類型爲secret的存儲卷,表示掛載集羣預定義的secret對象到容器內部
      secretNarae: string
      items:
      - key: string
        path: string
    configMap:					# 類型爲configMap的存儲卷,表示掛載集羣預定義的configMap對象到容器內部
      name: string
      items:
      - key: string
        path: string

2. Pod的基本用法

2.1 啓動一個容器組成的pod

創建pod:kubectl create -f php-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: php-nginx
  namespace: pod-test
  labels:
    name: mysql
spec:                   
  containers:           
  - name: php-nginx        # 容器的名稱
    image: docker.io/webdevops/php-nginx       # 容器的鏡像名稱
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      protocol: TCP

檢查pod創建過程:kubectl describe pod -n pod-test php-nginx
查看pod創建過程
查看pod運行狀態:kubectl get pod -n pod-test php-nginx
查看pod狀態
刪除pod:kubectl delete pod -n pod-test php-nginx

2.2 啓動由多個容器組成的pod

創建pod:kubectl create -f php-redis-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: php-redis
  namespace: pod-test
  labels:
    name: php
spec:
  containers:
  - name: php-nginx        # 容器的名稱
    image: docker.io/webdevops/php-nginx       # 容器的鏡像名稱
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      protocol: TCP
  - name: redis
    image: docker.io/redis
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 6379
      protocol: TCP

檢查pod創建過程:kubectl describe pod -n pod-test php-redis
查看pod創建過程

4. Pod hostPath Volume

這裏只介紹hostPath模式,一般用於日誌落盤操作。
hostpath模式會將pod所在宿主機的目錄映射到pod內部,如下yaml就將宿主機的/logs目錄映射到了php pod的/data/logs下

4.1 創建pod

創建podkubectl create -f volume-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: php
  namespace: pod-test
  labels:
    name: php
spec:                   
  containers:           
  - name: php-nginx        # 容器的名稱
    image: docker.io/webdevops/php-nginx       # 容器的鏡像名稱
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: php-logs
      mountPath: /data/logs
  volumes:              
    - name: php-logs       # 共享存儲卷的名稱,在一個pod中每個存儲卷定義一個名稱。容器定義部分的containers[].volumeMounts[].name將引用共享存儲卷的名稱
      hostPath:
        path: /logs

查看創建詳情:kubectl describe pod -n pod-test php
查看pod創建過程

4.2 驗證日誌落盤是否成功

在pod內掛載目錄寫入文件
驗證日誌落盤
根據kubectl describe pod -n pod-test php查看到的信息可以得出,此pod在node2的宿主機上
驗證日誌落盤

5. pod的配置管理(ConfigMap)

5.1 ConfigMap概述

ConfigMap以一個或多個key:value的形式保存在Kubernetes系統中供應用使用,既可以用於表示一個變量的值,也可以用於表示一個完整配置文件的內容

ConfigMap供容器使用的典型用法如下:

  1. 生成爲容器內的環境變量
  2. 設置容器啓動命令的啓動參數(需設置爲環境變量)
  3. 以Volume的形式掛載爲容器內部的文件或目錄

5.2 創建ConfigMap資源對象

5.2.1 通過YAML配置文件方式創建

【例1】:將幾個應用所需的變量定義爲ConfigMap的用法
創建ConfigMapkubectl create -f test-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-configmap
  namespace: pod-test
  labels:
    name: config
data:
  appname: tce
  appdir: /data/tce

查看ConfigMap的詳細信息:kubectl get configmap test-configmap -n pod-test -o yaml
查看configmap的詳細信息
kubectl describe configmap -n pod-test在這裏插入圖片描述
【例2】:將兩個配置文件a.configb.config定義爲ConfigMap的用法,設置key爲配置文件的別名,value則是配置文件的全部文本內容
創建ConfigMap:kubectl create -f file-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: file-configmap
  namespace: pod-test
  labels:
    name: config
data:
  a.config: |
    a=1
    b=2 
  b.config: |
    c=1
    d=2 

查看ConfigMap的詳細信息:kubectl get configmap file-configmap -n pod-test -o yaml
在這裏插入圖片描述

5.2.2 通過kubectl命令方式創建

可以使用參數--from-file或--from-literal指定內容,並且可以在一行命令中指定多個參數

5.2.2.1 通過--from-file參數從文件中進行創建

通過命令行創建ConfigMap:kubectl create configmap cli-file-configmap --from-file=a.txt -n pod-test
查看創建的ConfigMap:kubectl get configmap cli-file-configmap -o yaml -n pod-test
kubectl get configmap

5.2.2.2 通過--from-file參數從目錄中進行創建

該目錄下的每個配置文件的名都被設置爲key,文件的內容被設置爲value
準備好配置文件存放的文件夾
在這裏插入圖片描述
根據配置文件夾創建ConfigMap:kubectl create configmap cli-files-configmap --from-file=configfile
查看ConfigMap詳情:kubectl get configmap cli-files-configmap -o yaml
在這裏插入圖片描述

5.2.2.3 使用--from-literal參數創建k-v類型的ConfigMap內容

使用--from-literal創建:kubectl create configmap cli-k-v-configmap --from-literal=data=nihao --from-literal=logfile=/data/logs
查看ConfigMap信息:kubectl get configmap cli-k-v-configmap -o yaml
在這裏插入圖片描述

5.3 在pod中使用ConfigMap

5.3.1 通過環境變量方式使用ConfigMap

這裏使用5.2.1例1ConfigMap進行掛載
創建pod:kubectl create -f conf-php-pod.yaml(1.6版本的k8s有更簡單掛載方法envFrom,以後再說)

apiVersion: v1
kind: Pod
metadata:
  name: conf-php
  namespace: pod-test
  labels:
    name: configmap-test
spec:                   
  containers:           
  - name: php-nginx        # 容器的名稱
    image: docker.io/webdevops/php-nginx       # 容器的鏡像名稱
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      protocol: TCP
    env:
    - name: app_name 			# 自定義環境變量名稱
      valueFrom:
        configMapKeyRef:
          name: test-configmap  # 取自於哪一個ConfigMap
          key: appname 			# ConfigMap內的key
    - name: app_dir 			# 自定義環境變量名稱
      valueFrom:
        configMapKeyRef:
          name: test-configmap  # 取自於哪一個ConfigMap
          key: appdir 			# ConfigMap內的key

查看pod創建過程:kubectl describe pod -n pod-test conf-php
在這裏插入圖片描述
檢測環境變量是否傳遞成功
在這裏插入圖片描述

5.3.2 通過volumeMount使用ConfigMap

這裏使用5.2.1例2ConfigMap進行掛載
創建pod:kubectl create -f c-v-php-pod.yaml
查看pod創建信息:kubectl describe pod c-v-php -n pod-test
在這裏插入圖片描述
檢測是否掛載成功
在這裏插入圖片描述

5.4 使用ConfigMap的限制條件

  1. ConfigMap必須在pod之前創建
  2. ConfigMap受Namespace限制,只有處於相同Namespace中的pod纔可以應用它
  3. ConfigMap暫未實現配額管理

6. 在容器中獲取Pod信息

6.1 環境變量方式

6.1.1 將pod信息注入爲環境變量

【例】:將pod的ip、名稱和所在Namespace注入容器的環境變量中

apiVersion: v1
kind: Pod
metadata:
  name: downward-api
  namespace: pod-test
  labels:
    name: downward-api
spec:
  containers:
  - name: redis
    image: docker.io/redis
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 6379
      protocol: TCP
    env:
    - name: pod_name
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: pod_namespace
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: pod_ip
      valueFrom:
        fieldRef:
          fieldPath: status.podIP

可以使用kubectl get pod downward-api -n pod-test -o yaml去獲取fieldPath的值,例如:status.hostIP
在這裏插入圖片描述
檢測pod信息是否導入容器內
在這裏插入圖片描述

6.1.2 將容器資源信息注入爲環境變量

apiVersion: v1
kind: Pod
metadata:
  name: container-downward-api 
  namespace: pod-test
  labels:
    name: downward-api
spec:                   
  containers:           
  - name: redis
    image: docker.io/redis 
    imagePullPolicy: IfNotPresent
    resources:
      requests:				
        memory: "64Mi"		# 容器內存請求值
        cpu: "0.5"			# 容器cpu請求值  0.5=500m
      limits:				
        memory: "128Mi"		# 容器內存限制值
        cpu: "1"			# 容器cpu限制值
    env:
    - name: container_requests_memory
      valueFrom:
        resourceFieldRef:
          containerName: redis
          resource: requests.memory
    - name: container_requests_cpu
      valueFrom:
        resourceFieldRef:
          containerName: redis
          resource: requests.cpu
    - name: container_limits_memory
      valueFrom:
        resourceFieldRef:
          containerName: redis
          resource: limits.cpu
    - name: container_limits_cpu
      valueFrom:
        resourceFieldRef:
          containerName: redis
          resource: limits.cpu

在這裏插入圖片描述

6.2 Volume掛載方式

通過掛載的方式將metadata.labelsmetadata.annotations的信息掛載爲容器內的一個文件
創建pod:kubectl create -f volume-downward-api.yaml

apiVersion: v1
kind: Pod
metadata:
  name: v-downward-api 
  namespace: pod-test
  labels:
    zone: home
    tag: more
  annotations:
    version: v6.6
spec:                   
  containers:           
  - name: redis
    image: docker.io/redis 
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 6379
      protocol: TCP
    volumeMounts:
      - name: podinfo
        mountPath: /data
        readOnly: false

  volumes:
  - name: podinfo
    downwardAPI:
      items:
      - path: "labels"
        fieldRef:
          fieldPath: metadata.labels
      - path: "annotations"
        fieldRef:
          fieldPath: metadata.annotations

查看pod創建詳細信息kubectl describe pod v-downward-api -n pod-test
在這裏插入圖片描述

驗證掛載是否成功
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章