二進制部署K8s集羣第16節kubectl-聲明式資源管理

1、聲明式資源管理

聲明式資源管理方法:html

  • 聲明式資源管理方法依賴於一資源配置清單(yaml/json)文件對資源進行管理
  • 對資源的管理,是經過事先定義在統一資源配置清單內,再經過陳述式命令應用到K8s集羣裏
  • 語法格式:kubectl create/apply/delete/edit -f /path/to/yaml

1.1 查看資源配置清單的方法

kubectl get svc nginx-dp -o yaml -n kube-public

1.2 解釋資源配置清單

kubectl explain service

1.3 建立資源配置清單

vi /root/nginx-ds-svc.yaml

1.4 修改資源配置清單

vi nginx-ds-svc.yaml文件,並用kubectl apply -f nginx-ds-svc.yaml文件使之生效 # 離線修改
kubectl edit service nginx-ds # 在線修改

1.5 應用資源配置清單

kubectl apply -f nginx-ds-svc.yaml

1.6 刪除資源配置清單

kubectl delete service nginx-ds -n kube-public # 陳述式刪除
kubectl delete -f nginx-ds-svc.yaml # 聲明式刪除

1.7 YAML文件建立講解

資源類型與apiVersion對照表node

Kind apiVersion
ClusterRoleBinding rbac.authorization.k8s.io/v1
ClusterRole rbac.authorization.k8s.io/v1
ConfigMap v1
CronJob batch/v1beta1
DaemonSet extensions/v1beta1
Node v1
Namespace v1
Secret v1
PersistentVolume v1
PersistentVolumeClaim v1
Pod v1
Deployment v一、apps/v一、apps/v1beta一、apps/v1beta2
Service v1
Ingress extensions/v1beta1
ReplicaSet apps/v一、apps/v1beta2
Job batch/v1
StatefulSet apps/v一、apps/v1beta一、apps/v1beta2
vi create_namespace.yml
apiVersion: v1  # 必選,api版本號
kind: pod # 必選,類型爲pod
metadata: # 必選,定義元數據
  name: string # 必選,pod名稱
  namespace: string #  pod所屬的命名空間,默認在default的namespace
  lables: # 自定義標籤 
    - name: string # 自定義標籤名字
  annotations: # 自定義註釋列表
    - name: string 
spec: # pod中容器的詳細定義(指望)
  nodeName: node1 # 經過nodeName調度到node1節點
  nodeSelector: # nodeSelector節點選擇器
    bussiness: game # 指定調度到標籤爲bussiness=game的節點
  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:  # exec方式須要制定的命令或腳本
          - cat 
          - /tmp/healthy
      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 # 容器啓動完成後首次探測的時間,單位爲秒,# pod啓動延遲5秒後探測
        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的存儲卷,掛載集羣與定義的secret對象到容器內部
        scretname: string 
        items:    
        - key: string
          path: string
      configMap: # 類型爲configMap的存儲卷,掛載預約義的configMap對象到容器內部
        name: string
        items:
        - key: string
          path: string

1.7.1 HealthCheck健康檢查

  • 當Pod啓動時,容器可能會由於某種錯誤(服務未啓動或端口不正確)而沒法
    訪問等。
  • kubelet擁有兩個檢測器,它們分別對應不一樣的觸發器(根據觸發器的結構
    執行進一步的動做)
1.7.1.1 Health Check方式

二進制部署K8s集羣第16節kubectl-聲明式資源管理

1.7.1.2 Probe探測方式

二進制部署K8s集羣第16節kubectl-聲明式資源管理

1.7.1.3 案例1: liveness-exec
vim pod-liveness-exec.yml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  namespace: default
spec:
  containers:
  - name: liveness
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy;
    sleep 600
  livenessProbe:
    exec:
      command:
      - cat
      - /tmp/healthy
      initialDelaySeconds: 5 # pod啓動延遲5秒後探測
      periodSeconds: 5 # 每5秒探測1次
kubectl apply -f pod-liveness-exec.yml
kubectl describe pod liveness-exec
1.7.1.4 案例2: liveness-httpget
vim pod-liveness-httpget.yml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget
  namespace: default
spec:
  containers:
  - name: liveness
    image: nginx:1.15-alpine
    imagePullPolicy: IfNotPresent
  ports:   # 指定容器端口,這一段不寫也行,端口由鏡像決定
  - name: http # 自定義名稱,不須要與下面的port: http對應
    containerPort: 80 # 相似dockerfile裏的expose 80
  livenessProbe:
    httpGet: # 使用httpGet方式
      port: http # http協議,也能夠直接寫80端口
      path: /index.html  # 探測家目錄下的index.html
      initialDelaySeconds: 3 # 延遲3秒開始探測
      periodSeconds: 5 # 每隔5s鍾探測一次
kubectl apply -f pod-liveness-httpget.yml
kubectl get pods
kubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.html
kubectl describe pod liveness-http | tail
1.7.1.5 案例3: liveness-tcp
vim pod-liveness-tcp.yml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp
  namespace: default
spec:
  containers:
  - name: liveness
    image: nginx:1.15-alpine
    imagePullPolicy: IfNotPresent
   ports:
   - name: http
     containerPort: 80
  livenessProbe:
    tcpSocket: # 使用tcp鏈接方式
    port: 80 # 鏈接80端口進行探測
    initialDelaySeconds: 3
    periodSeconds: 5
kubectl apply -f pod-liveness-tcp.yml
kubectl get pod
kubectl exec -it liveness-tcp --/usr/sbin/nginx -s stop
kubectl describe pod liveness-http | tail -8
1.7.1.6 案例4: readiness
vim pod-readiness-httpget.yml
apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget
  namespace: default
spec:
  containers:
  - name: readiness
    image: nginx:1.15-alpine
    imagePullPolicy: IfNotPresent
    ports:
  - name: http
    containerPort: 80
    readinessProbe: # 這裏由liveness換成了readiness
    httpGet:
      port: http
      path: /index.html
     initialDelaySeconds: 3
     periodSeconds: 5
kubectl apply -f pod-readiness-httpget.yml
kubectl get pod
kubectl exec -it readiness-httpget -- rm-rf /usr/share/nginx/html/index.html
kubectl get pod
kubectl exec -it readiness-httpget --touch /usr/share/nginx/html/index.html
1.7.1.7 案例5: readiness+liveness綜合
vim pod-readiness-liveiness.yml
apiVersion: v1
kind: Pod
metadata:
  name: readiness-liveness-httpget
  namespace: default
spec:
  containers:
  - name: readiness-liveness
    image: nginx:1.15-alpine
    imagePullPolicy: IfNotPresent
    ports:
  - name: http
    containerPort: 80
  livenessProbe:
    httpGet:
      port: http
      path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
  readinessProbe:
    httpGet:
      port: http
      path: /index.html
      initialDelaySeconds: 5
      periodSeconds: 5
kubectl apply -f pod-readiness-liveiness.yml
kubectl get pod # 十秒前執行
kubectl get pod # 十秒後執行
相關文章
相關標籤/搜索