4、kubernetes基礎概念


本文章參考:http://www.kubeasy.com/

一、基礎概念

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次表示未就緒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM