4、kubernetes基礎概念

晚風A發表於2021-08-28

一、基礎概念

1、Master節點

整個叢集的控制中樞。Master節點是Kubernetes叢集的控制節點,在生產環境中不建議部署叢集核心元件外的任何Pod,公司業務的Pod更是不建議部署到Master節點上,以免升級或者維護時對業務造成影響。

  • Kube-APIServer:叢集的控制中樞,各個模組之間資訊互動都需要經過Kube-APIServer,同時它也是叢集管理、資源配置、整個叢集安全機制的入口。
  • Controller-Manager:叢集的狀態管理器,保證Pod或其他資源達到期望值,也是需要和APIServer進行通訊,在需要的時候建立、更新或刪除它所管理的資源。
  • Scheduler:叢集的排程中心,它會根據指定的一系列條件,選擇一個或一批最佳的節點,然後部署我們的Pod。
  • Etcd:鍵值資料庫,報錯一些叢集的資訊,一般生產環境中建議部署三個以上節點(奇數個)

2、Node節點

也叫Worker、Node節點、Minion節點

  • Kubelet:負責監聽節點上Pod的狀態,同時負責上報節點和節點上面Pod的狀態,負責與Master節點通訊,並管理節點上面的Pod。
  • Kube-proxy:負責Pod之間的通訊和負載均衡,將指定的流量分發到後端正確的機器上。
  • 檢視Kube-proxy工作模式:curl 127.0.0.1:10249/proxyMode
    • Ipvs:監聽Master節點增加和刪除service以及endpoint的訊息,呼叫Netlink介面建立相應的IPVS規則。通過IPVS規則,將流量轉發至相應的Pod上。
    • Iptables:監聽Master節點增加和刪除service以及endpoint的訊息,對於每一個Service,他都會場景一個iptables規則,將service的clusterIP代理到後端對應的Pod。

注意:kubelet,kube-proxy也可以部署在master節點上,kubernetes叢集並沒有規定master和node節點。只是我們抽象邏輯出來的概念。


3、

Pod是Kubernetes中最小的單元,Pod資源物件是一種集合了一到多個應用容器、儲存資源、專用IP及支撐容器執行的其他選項的邏輯元件。Pod代表著Kubernetes的部署單元及原子執行單元,即一個應用程式的單一執行例項,它通常由共享資源且關係緊密的一個或多個應用容器組成每個Pod還包含了一個Pause容器,Pause容器是Pod的父容器,為整個Pod提供網路基礎設施設定的,主要負責殭屍程式的回收管理,通過Pause容器可以使同一個Pod裡面的多個容器共享儲存、PID、IPC等

3.1、Pod基礎
  1. 自主式pod
  2. 控制器管理的pod
    • Replication Controller (複製控制器)
    • ReplicaSet(複製集)
    • Deployment (無狀態應用)
    • StatefulSet (有狀態應用)
    • DeamonSet (守護程式)
    • HPA(HorizontalPodAutoscaler),水平pod自動伸縮控制器
    • Job,Ctonjob
3.2、定義一個pod

建立pod的方式有很多,可以直接run執行,也可以定義一個yaml檔案建立。

3.2.1、直接執行的方式建立一個Pod,--image代表指定映象
[root@master yaml]# kubectl run --image=tomcat tomcat-app
pod/tomcat-app created

[root@master yaml]# kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
nginx-app    1/1     Running   0          31m
tomcat-app   1/1     Running   0          22s
3.2.2、用yaml檔案建立
[root@master yaml]# kubectl create -f nginx.yaml 
pod/nginx-yaml created

[root@master yaml]# kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
nginx-app    1/1     Running   0          35m
nginx-yaml   1/1     Running   0          10s
tomcat-app   1/1     Running   0          4m5s

#yaml檔案放在下邊供大家參考,yaml檔案的欄位資訊說明也已經標上註釋
3.2.3、nginx-app1.yaml
# cat nginx-app.yaml
apiVersion: v1 # 必選,API的版本號
kind: Pod       # 必選,型別Pod
metadata:       # 必選,後設資料
  name: nginx   # 必選,符合RFC 1035規範的Pod名稱
  namespace: default # 可選,Pod所在的名稱空間,不指定預設為default,可以使用-n 指定namespace 
  labels:       # 可選,標籤選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend # 可以寫多個
  annotations:  # 可選,註釋列表,可以寫多個
    app: nginx
spec:   # 必選,用於定義容器的詳細資訊
  initContainers: # 初始化容器,在容器啟動之前執行的一些初始化操作
  - command:
    - sh
    - -c
    - echo "I am InitContainer for init some configuration"
    image: busybox
    imagePullPolicy: IfNotPresent
    name: init-container
  containers:   # 必選,容器列表
  - name: nginx # 必選,符合RFC 1035規範的容器名稱
    image: nginx:latest    # 必選,容器所用的映象的地址
    imagePullPolicy: Always     # 可選,映象拉取策略
    command: # 可選,容器啟動執行的命令
    - nginx 
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
    volumeMounts:   # 可選,儲存卷配置,可以配置多個
    - name: webroot # 儲存卷名稱
      mountPath: /usr/share/nginx/html # 掛載目錄
      readOnly: true        # 只讀
    ports:  # 可選,容器需要暴露的埠號列表
    - name: http    # 埠名稱
      containerPort: 80     # 埠號
      protocol: TCP # 埠協議,預設TCP
    env:    # 可選,環境變數配置列表
    - name: TZ      # 變數名
      value: Asia/Shanghai # 變數的值
    - name: LANG
      value: en_US.utf8
    resources:      # 可選,資源限制和資源請求限制
      limits:       # 最大限制設定
        cpu: 1000m
        memory: 1024Mi
      requests:     # 啟動所需的資源
        cpu: 100m
        memory: 512Mi
#    startupProbe: # 可選,檢測容器內程式是否完成啟動。注意三種檢查方式同時只能使用一種。
#      httpGet:      # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
#            path: /api/successStart # 檢查路徑
#            port: 80
    readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
      httpGet:      # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
            path: / # 檢查路徑
            port: 80        # 監控埠
    livenessProbe:  # 可選,健康檢查
      #exec:        # 執行容器命令檢測方式
            #command: 
            #- cat
            #- /health
    #httpGet:       # httpGet檢測方式
    #   path: /_health # 檢查路徑
    #   port: 8080
    #   httpHeaders: # 檢查的請求頭
    #   - name: end-user
    #     value: Jason 
      tcpSocket:    # 埠檢測方式
            port: 80
      initialDelaySeconds: 60       # 初始化時間
      timeoutSeconds: 2     # 超時時間
      periodSeconds: 5      # 檢測間隔
      successThreshold: 1 # 檢查成功為2次表示就緒
      failureThreshold: 2 # 檢測失敗1次表示未就緒
    lifecycle:
      postStart: # 容器建立完成後執行的指令, 可以是exec httpGet TCPSocket
        exec:
          command:
          - sh
          - -c
          - 'mkdir /data/ '
      preStop:
        httpGet:      
              path: /
              port: 80
      #  exec:
      #    command:
      #    - sh
      #    - -c
      #    - sleep 9
  restartPolicy: Always   # 可選,預設為Always
  #nodeSelector: # 可選,指定Node節點
  #      region: subnet7
  imagePullSecrets:     # 可選,拉取映象使用的secret,可以配置多個
  - name: default-dockercfg-86258
  hostNetwork: false    # 可選,是否為主機模式,如是,會佔用主機埠
  volumes:      # 共享儲存卷列表
  - name: webroot # 名稱,與上述對應
    emptyDir: {}    # 掛載目錄
        #hostPath:              # 掛載本機目錄
        #  path: /etc/hosts
3.2.4、nginx-app2.yaml
# cat nginx-app2.yaml
apiVersion: v1 # 必選,API的版本號
kind: Pod       # 必選,型別Pod
metadata:       # 必選,後設資料
  name: nginx   # 必選,符合RFC 1035規範的Pod名稱
  # namespace: default # 可選,Pod所在的名稱空間,不指定預設為default,可以使用-n 指定namespace 
  labels:       # 可選,標籤選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend # 可以寫多個
  annotations:  # 可選,註釋列表,可以寫多個
    app: nginx
spec:   # 必選,用於定義容器的詳細資訊
#  initContainers: # 初始化容器,在容器啟動之前執行的一些初始化操作
#  - command:
#    - sh
#    - -c
#    - echo "I am InitContainer for init some configuration"
#    image: busybox
#    imagePullPolicy: IfNotPresent
#    name: init-container
  containers:   # 必選,容器列表
  - name: nginx # 必選,符合RFC 1035規範的容器名稱
    image: nginx:1.15.2    # 必選,容器所用的映象的地址
    imagePullPolicy: IfNotPresent     # 可選,映象拉取策略, IfNotPresent: 如果宿主機有這個映象,那就不需要拉取了. Always: 總是拉取, Never: 不管是否儲存都不拉去
    command: # 可選,容器啟動執行的命令 ENTRYPOINT, arg --> cmd
    - nginx 
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
#    volumeMounts:   # 可選,儲存卷配置,可以配置多個
#    - name: webroot # 儲存卷名稱
#      mountPath: /usr/share/nginx/html # 掛載目錄
#      readOnly: true        # 只讀
    ports:  # 可選,容器需要暴露的埠號列表
    - name: http    # 埠名稱
      containerPort: 80     # 埠號
      protocol: TCP # 埠協議,預設TCP
    env:    # 可選,環境變數配置列表
    - name: TZ      # 變數名
      value: Asia/Shanghai # 變數的值
    - name: LANG
      value: en_US.utf8
#    resources:      # 可選,資源限制和資源請求限制
#      limits:       # 最大限制設定
#        cpu: 1000m
#        memory: 1024Mi
#      requests:     # 啟動所需的資源
#        cpu: 100m
#        memory: 512Mi
#    startupProbe: # 可選,檢測容器內程式是否完成啟動。注意三種檢查方式同時只能使用一種。
#      httpGet:      # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
#            path: /api/successStart # 檢查路徑
#            port: 80
#    readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
#      httpGet:      # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
#            path: / # 檢查路徑
#            port: 80        # 監控埠
#    livenessProbe:  # 可選,健康檢查
      #exec:        # 執行容器命令檢測方式
            #command: 
            #- cat
            #- /health
    #httpGet:       # httpGet檢測方式
    #   path: /_health # 檢查路徑
    #   port: 8080
    #   httpHeaders: # 檢查的請求頭
    #   - name: end-user
    #     value: Jason 
#      tcpSocket:    # 埠檢測方式
#            port: 80
#      initialDelaySeconds: 60       # 初始化時間
#      timeoutSeconds: 2     # 超時時間
#      periodSeconds: 5      # 檢測間隔
#      successThreshold: 1 # 檢查成功為2次表示就緒
#      failureThreshold: 2 # 檢測失敗1次表示未就緒
#    lifecycle:
#      postStart: # 容器建立完成後執行的指令, 可以是exec httpGet TCPSocket
#        exec:
#          command:
#          - sh
#          - -c
#          - 'mkdir /data/ '
#      preStop:
#        httpGet: 
#              path: /
#              port: 80
      #  exec:
      #    command:
      #    - sh
      #    - -c
      #    - sleep 9
  restartPolicy: Always   # 可選,預設為Always,容器故障或者沒有啟動成功,那就自動該容器,Onfailure: 容器以不為0的狀態終止,自動重啟該容器, Never:無論何種狀態,都不會重啟
  #nodeSelector: # 可選,指定Node節點
  #      region: subnet7
#  imagePullSecrets:     # 可選,拉取映象使用的secret,可以配置多個
#  - name: default-dockercfg-86258
#  hostNetwork: false    # 可選,是否為主機模式,如是,會佔用主機埠
#  volumes:      # 共享儲存卷列表
#  - name: webroot # 名稱,與上述對應
#    emptyDir: {}    # 掛載目錄
#        #hostPath:              # 掛載本機目錄
#        #  path: /etc/hosts
#
3.3、Pod探針
  • StartupProbe:k8s 1.16版本後新加的探測方式,用於判斷容器內應用程式是否已經啟動。如果配置了startupProbe,就會先禁止其他的探測,直到它成功為止,成功後將不在進行探測。
  • LivenessProbe:用於探測容器是否執行,如果探測失敗,kubelet會根據配置的重啟策略進行相應的處理。若沒有配置該探針,預設就是success。
  • ReadinessProbe:一般用於探測容器內的程式是否健康,它的返回值如果為success,那麼久代表這個容器已經完成啟動,並且程式已經是可以接受流量的狀態。
3.4、Pod探針方式
  • ExecAction:在容器內執行一個命令,如果返回值為0,則認為容器健康。
  • TCPSocketAction:通過TCP連線檢查容器內的埠是否是通的,如果是通的就認為容器健康。
  • HTTPGetAction:通過應用程式暴露的API地址來檢查程式是否是正常的,如果狀態碼為200~400之間,則認為容器健康。
3.5、Pod探針檢查引數配置
  • initialDelaySeconds: 60 # 初始化時間
  • timeoutSeconds: 2 # 超時時間
  • periodSeconds: 5 # 檢測間隔
  • successThreshold: 1 # 檢查成功為1次表示就緒
  • failureThreshold: 2 # 檢測失敗2次表示未就緒

相關文章