Kubernetes ---- 資源配置清單格式及Label標籤、標籤選擇器、Pod生命週期、Pod存活性探測及就緒型探測...

 

大部分資源的配置清單:

  apiVersion: group/version

  # 查看所支持的版本.
  $ kubectl api-versions

  kind: 資源類別(Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob,Service....)

  metadata: 元數據
    name(同一類別中名稱要唯一,不同的namespace中name可以重名)
    namespace
    labels: 標籤,方便控制器及Service進行管理.
    annotations: 資源註解

每個的資源的引用PATH:
  /api/v1/namespaces/default/pods/client
  /組名/版本/名稱空間/default的名稱空間/pods(資源類型)/資源名稱 

  spec: 定義目標期望的狀態,讓當前狀態像期望狀態靠近(副本數量)

  status: 當前狀態,本字段由kubernetes集羣維護,用戶無法刪除定義.

  # 查看Pod的定義規範
  $ kubectl explain pod

  # 二級字段查詢定義規範(查詢Pod下的metadata如何定義)
  $ kubectl explain pod.metadata

  # 查看spec如何定義
  $ kubectl explain pod.spec

Pod資源:

  spec.containers []<object>

    - name <string>
    image <string>
    imagePullPolicy <string> # 鏡像獲取策略(Always, Never, IfNotPresent(如果本地不存在就去下載))

 

  如果要覆蓋默認的 Entrypoint 與 Cmd,需要遵循如下規則:
  1. 如果在容器配置中沒有設置command或者args那麼將使用Docker鏡像自帶的命令及其入參。
  2. 如果在容器配置中只設置了command但是沒有設置args那麼容器啓動時只會執行該命令,Docker 鏡像中自帶的命令及其入參會被忽略。
  3. 如果在容器配置中只設置了args那麼Docker鏡像中自帶的命令會使用該新入參作爲其執行時的入參。
  4. 如果在容器配置中同時設置了command與args,那麼Docker鏡像中自帶的命令及其入參會被忽略。容器啓動時只會執行配置中設置的命令,並使用配置中設置的入參作爲命令的入參。
  幫助來源:https://kubernetes.io/zh/docs/tasks/inject-data-application/define-command-argument-container/
  args <[]string>

  command <[]string>

  標籤
  # 鍵值對兒的長度不能超過63個字符
  key = value
  key: 字母、數字、_、-、.
  value: 可以爲空,只能以字母或數字開頭及結尾,中間可用字母、數字、_、-、.

# 顯示pod中標籤爲app的pod
$ kubectl get pods -l app --show-labels

# 另外一種絕對性查詢,key=value
等值關係: =、==、!=
$ kubectl get pods -l app[=|==|!=]myapp --show-labels

# 集合關係: KEY in (VALUE1,VALUE2...)
KEY not in (VALUE1,VALUE2...)
KEY
!KEY
$ kubectl get pods -l "release in (canary,beta,alpha)"
$ kubectl get pods -l "release notin (canary,beta,alpha)"

# 給資源對象增加標籤
$ kubectl label pod pod-demo release=canary

# 修改資源對象的標籤
$ kubectl label pod pod-demo release=stable --overwrite

# 刪除資源對象的標籤
$ kubectl label pod pod-demo release-

 

許多資源支持內嵌字段定義其使用的標籤選擇器:
  matchLabels: 直接給定鍵值(Service只能用這種)
  matchExpressions:基於給定的表達式來定義使用的標籤選擇器,{key:"KEY",operator:"OPERATOR",values:[VALUE1,VALUE2,VALUE3...]},鍵與值使用operator定義的格式符進行比較
    操作符(operator):
      In, NotIn: values字段的值必須爲非空列表;
      Exists, NotExists: values字段的值必須爲空列表;


  pod.spec.nodeSelector <map[string]string>
  節點標籤選擇器: 指定Pod運行在哪類節點上(給節點打上標籤)

# 給節點增加標籤
$ kubectl label node node1 disktype=ssd
$ vim pod-demo.yaml
  apiVersion: v1
  kind: Pod
  metadata:
    name: pod-demo
    namespace: default
    labels:
      app: myapp
      tier: frontend
  spec:
    containers:
    - name: myapp
     image: ikubernetes/myapp:v1
     ports:
     - name: http
     containerPort: 80
     - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command:
      - "/bin/sh"
      - "-c"
      - "sleep 3600"
# 這裏定義了標籤,那麼Pod只會運行到node1節點上,因爲只有node1節點有"disktype=ssd"標籤
nodeSelector:
disktype: ssd


pod.spec.nodeName <string>

pod.metadata.annotations:
  與label不同的是,不能用於挑選資源對象,僅用於爲對象提供"元數據";
  metadata:
  annotations:
    kaikai.com/created-by: "cluster admin"

Pod的生命週期:

  1. 初始化容器完成初始化,線性完成;
  2. 主容器啓動時候,可以做啓動後鉤子;
  3. 主容器結束前,可以做結束前鉤子;
  4. 可在容器運行過程中做容器探測(liveness probe和readiness probe)支持三中探測行爲(1.執行自定義命令;2.像指定的tcp套接字發請求;3.像指定的http服務發請求)

Pod探測:    

    livenessProbe(存活性探測): 探測主容器是否處於運行狀態;
    readinessProbe(就緒型探測): 用於判定容器中的主進程是否已經就緒,並可以對外提供服務;

 

livenessProbe探測中的ExecAction(自定義命令探測):
apiversion: v1
kind: Pod
metadata:
  name: liveness-exec
  namespace: default
spec:
  containers:
  - name: liveness-exec-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command:
    - "/bin/sh"
    - "-c"
    - "touch /tmp/healthy;sleep 30;rm -f /tmp/healthy;sleep 3600"
    livenessProbe:
      exec:
        command:
        - "test"
        - "-e"
        - "/tmp/healthy"
      initialDelaySeconds: 1
      periodSeconds: 3

#註釋:
  livenessProbe: 對Pod做存活性檢測;
  exec: 使用存活性檢測方法中的ExecAction(自定義命令檢測)方法進行檢測;
  command: 使用哪個命令;
  initialDelaySeconds: 當Pod啓動1秒後進行檢測;
  periodSeconds: 執行探測的頻率。默認是10秒,此處設爲3秒;

$ kubectl describe pod liveness-exec (由於沒有做重啓策略,所以會不斷的重啓Pod,Last State的狀態還是Terminated,所以Pod有問題,檢測驗證成功)

 

livenessProbe探測中的HTTPGetAction(像指定的http服務發請求探測):

 

apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-container
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
       containerPort: 80
    livenessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
#註釋:
  livenessProbe: 對Pod進行存活性探測
  httpGet:採用HttpGetAction方法探測
  port: 要探測Pod的哪個端口
path: 請求的URL路徑

$ kubectl create -f liveness-httpget.yaml
$ kubectl describe pod liveness-httpget-pod(如下圖,沒有發現問題)

 


# 創建問題,發現是否會產生異常

$ kubectl exec -it liveness-httpget-pod -- /bin/sh

/ # rm /usr/share/nginx/html/index.html

鍵盤同時按住Ctrl + P + Q 不終止容器運行退出容器

$ kubecget describe pod liveness-httpget-pod (會發現已經出現了異常)

 

 

 

readinessProbe(就緒型探測)中的HTTPGetAction(像指定的http服務發請求探測):其他探測方法類似此httpGet方法!

apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: default
spec:
  containers:
  - name: readiness-httpget-container
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
     readinessProbe:
       httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
#註釋:
  readinessProbe: 使用就緒型探測
  httpGet: 就緒型探測中的HTTPGet方法

# 此時查看Pod狀態爲Running狀態,且已經就緒,(READY字段下的第一個1代表已就緒,後邊兒的1代表幾個容器)
$ kubectl get pods
NAME                            READY   STATUS             RESTARTS   AGE
readiness-httpget-pod           1/1     Running            0          10s

# 製造問題,驗證探測是否有效
$ kubectl exec -it readiness-httpget-pod -- /bin/sh
/ # rm /usr/share/nginx/html/index.html
Ctrl+P+Q不中斷容器退出
# 再次查詢Pod的狀態,發現已經左側1已經變爲0,說明容器此時未就緒;
$ kubectl get pods
NAME                            READY   STATUS             RESTARTS   AGE
readiness-httpget-pod           0/1     Running            0          32s
# 查看詳細信息
$ kubectl describe pod readiness-httpget-pod (ready狀態爲False,且日誌爲404;)

 

 # 解決此問題

 $ kubectl exec -it readiness-httpget-pod -- /bin/sh

 / # echo "hi" >> /usr/share/nginx/html/index.html

 $ kubecget get pods (會發現狀態還原了)

  NAME                            READY   STATUS             RESTARTS   AGE

  readiness-httpget-pod           1/1     Running            0          14m

Pod啓動後操作:

  pod.spec.containers.lifecycle.postStart <Object>

apiVersion: v1
kind: Pod
metadata:
  name: poststart-pod
  namespace: default
spec:
  containers:
  - name: busybox-httpd
     image: busybox:latest
     imagePullPolicy: IfNotPresent
     lifecycle:
       postStart:
         exec:
           command: ['mkdir','-p','/data/web/html']
       command: ['/bin/sh','-c','sleep 3600']
# 註釋:
  lifecycle: 生命週期(包含了postStart(容器啓動後操作)和preStop(容器停止前操作).)
  postStart: 容器啓動後操作
exec: 當容器啓動後,要執行的命令
command: 具體shell
最下面的command: 是容器的命令
注意:postStart要執行的命令必須在容器已經啓動了之後纔會執行,也就是說最後一個command如果命令無法執行,那麼postStart也是無法執行的!

pod.spec.containers.lifecycle.preStop <Object> 與上述類似,不再舉例

狀態:

  1. Pending: 掛起,沒有節點能夠滿足調度條件;
  2. Running: 運行
  3. Failed: 失敗
  4. Succeeded: 成功
  5. Unknow: Pod狀態是API Server與運行這個Pod的節點上的kubelet通信獲取狀態信息的,如果kubelet有問題了,那麼就有可能unknown;

創建Pod:
  1. 將請求提交給API Server;
  2. API Server請求的目標狀態保存到ETCD中;
  3. API Server請求Scheduler進行調度,如果調度成功,則將調度結果保存到ETCD中;
  4. 目標節點的kubelet通過API Server當中的狀態編號會收到Pod請求,隨後kubelet拿到用戶創建Pod的清單進行創建啓動;
  5. 創建成功或失敗會有狀態,返還給API Server中,再次更新到ETCD中;

  restartPolicy:
    Always, OnFailure(錯誤才重啓), Never. Default to Always.

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