1. 程式人生 > 其它 >k8s 微服務pod

k8s 微服務pod

pod初始

K8s有很多技術概念,同時對應很多API物件,最重要的也是最基礎的是微服務Pod。Pod是在K8s叢集中執行部署應用或服務的最小單元,它是可以支援多容器的。Pod的設計理念是支援多個容器在一個Pod中共享網路地址和檔案系統,可以通過程序間通訊和檔案共享這種簡單高效的方式組合完成服務。Pod對多容器的支援是K8s最基礎的設計理念。比如你執行一個作業系統發行版的軟體倉庫,一個Nginx容器用來發布軟體,另一個容器專門用來從源倉庫做同步,這兩個容器的映象不太可能是一個團隊開發的,但是他們一塊兒工作才能提供一個微服務;這種情況下,不同的團隊各自開發構建自己的容器映象,在部署的時候組合成一個微服務對外提供服務。這就是K8S中的POD。

Pod是K8s叢集中所有業務型別的基礎,可以看作執行在K8s叢集中的小機器人,不同型別的業務就需要不同型別的小機器人去執行。目前K8s中的業務主要可以分為長期伺服型(long-running)、批處理型(batch)、節點後臺支撐型(node-daemon)和有狀態應用型(stateful application);分別對應的小機器人控制器為Deployment、Job、DaemonSet和StatefulSet。

Pod的初體驗

apiVersion: v1
kind: Pod
metadata:
  name: first-pod
  labels:
    app: bash
spec:
  containers:
    - name: bash-container
      image: busybox
      command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10']

執行結果

# 建立k8s資源服務
[root@master1 ~/k8s_test]# kubectl apply -f pod.yaml 
pod/first-pod created

# 檢視檔案啟動的服務
[root@master1 ~/k8s_test]# kubectl get -f pod.yaml 
NAME        READY   STATUS              RESTARTS   AGE
first-pod   0/1     ContainerCreating   0          33s

Pod帶來的好處

  1. Pod做為一個可以獨立執行的服務單元,簡化了應用部署的難度,以更高的抽象層次為應用部署管提供了極大的方便。

  2. Pod做為最小的應用例項可以獨立執行,因此可以方便的進行部署、水平擴充套件和收縮、方便進行排程管理與資源的分配。

  3. Pod中的容器共享相同的資料和網路地址空間,Pod之間也進行了統一的資源管理與分配。

Pod是如何管理多個容器的

Pod中可以同時執行多個程序(作為容器執行)協同工作。同一個Pod中的容器會自動的分配到同一個 node 上。同一個Pod中的容器共享資源、網路環境和依賴,所以它們總是被同時排程。在一個Pod中同時執行多個容器是一種比較高階的用法。只有當你的容器需要緊密配合協作的時候才考慮用這種模式。

Pod中的資料永續性

Pod在設計⽀持就不是作為持久化實體的。在排程失敗、節點故障、缺少資源或者節點維護的狀態下都會死掉會被驅逐。通常,我們是需要藉助類似於Docker儲存卷這樣的資源來做Pod的資料持久化的

Pod的生命週期和重啟策略

Pod 在整個生命週期過程中被系統定義為各種狀態,熟悉 Pod 各種狀態對於我 理解如何設定 Pod的排程策略、重啟策略是很有必要的。

Pod的狀態

狀態值 描述
掛起(Pending) API Server建立了pod資源物件已存入etcd中,但它尚未被排程完成,或者仍處於從倉庫下載映象的過程中。
執行中(Running) Pod已經被排程至某節點,並且所有容器都已經被kubelet建立完成
成功(Succeeded) Pod中的所有容器都已經成功終止並且不會被重啟
失敗(Failed) Pod中的所有容器都已終止了,並且至少有一個容器是因為失敗終止。即容器以非0狀態退出或者被系統禁止。
未知(Unknown) Api Server無法正常獲取到Pod物件的狀態資訊,通常是由於無法與所在工作節點的kubelet通訊所致。

Pod的重啟策略

Pod 重啟策略( RestartPolicy )應用於 Pod 內的所有容器,井且僅在 Pod 所處的 Node 上由kubelet 進行判斷和重啟操作。當某個容器異常退出或者健康檢查失敗時, kubelet將根據 RestartPolicy 設定來進行相應的操作。Pod的重啟策略包括:Always、OnFailure和Never,預設值為Always

  1. Always:當容器失效時,由kubelet自動重啟該容器。

  2. OnFailure:當容器終止執行且退出碼不為0時,由kubelet自動重啟該容器

  3. Never:不論容器執行狀態如何,kubelet都不會重啟該容器。

kubelet 重啟失效容器的時間間隔以 sync-frequency 乘以 2n 來計算;例如1、2、4、8倍等,最長延時 5min ,並且在成功重啟後的 10 min 後重置該時間。

Pod的重啟策略與控制方式息息相關,當前可用於管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接通過kubelet管理(靜態Pod)。每種控制器對Pod的重啟策略要求如下:

  1. RC和DaemonSet:必須設定為Always,需要保證該容器持續執行。
  2. Job和CronJob:OnFailure或Never,確保容器執行完成後不再重啟。
  3. kubelet:在Pod失效時自動重啟它,不論將RestartPolicy設定什麼值,也不會對Pod進行健康檢查。

Pod的資源清單詳解

apiVersion: v1 						# 必選,API的版本號
kind: Pod    						# 必選,型別Pod
metadata:    						# 必選,元資料
  name: nginx    		 			# 必選,符合RFC 1035規範的Pod名稱
  namespace: web-testing 			        # 可選,不指定預設為default,
                                                        # Pod所在的名稱空間

  labels:    						# 可選,標籤選擇器,一般用於Selector
    - app: nginx                 	                # 應用名稱
  annotations:    		        	        # 可選,註釋列表 解釋資訊
    - app: nginx
spec:    		        	   		# 必選,用於定義容器的詳細資訊 說明
  containers:           	    	                # 必選,容器列表
  - name: nginx         	    	                # 必選,符合RFC 1035規範的容器名稱
    image: nginx:v1     				# 必選,容器所用的映象的地址
    imagePullPolicy: Always      		        # 可選,映象拉取策略
    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					# cpu資源
        memory: 1024MiB					# 記憶體資源
      requests:    					# 表示容器希望被分配到的、
                                                        # 可完全保證的資源量

        cpu: 100m					# cpu資源
        memory: 512MiB					# 記憶體資源
    readinessProbe: 					# 可選,容器狀態檢查 就緒行探測
      httpGet:    					# 檢測方式
        path: /    					# 檢查路徑
        port: 80    					# 監控埠
      timeoutSeconds: 2    				# 超時時間 
      initialDelaySeconds: 60    		        # 初始化時間
    livenessProbe:    					# 可選,監控狀態檢查 活性探測
      exec:    						# 檢測方式
        command: 					# 命令
        - cat
        - /health
      httpGet:    					# 檢測方式
        path: /_health
        port: 8080
        httpHeaders:
        - name: end-user
          value: jason
      tcpSocket:    					# 檢測方式
        port: 80
      initialDelaySeconds: 60    		        # 初始化時間
      timeoutSeconds: 2    				# 超時時間
      periodSeconds: 5    				# 檢測間隔
      successThreshold: 2			        # 檢查成功為2次表示就緒
      failureThreshold: 1 				# 檢測失敗1次表示未就緒
    securityContext:    			        # 可選,限制容器不可信的行為
      provoleged: false
  restartPolicy: Always                                 # 可選,重啟策略 預設為Always
  nodeSelector:                                         # 可選,指定Node節點
    region: subnet7
  imagePullSecrets:    				        # 可選,拉取映象使用的secret
  - name: default-dockercfg-86258
  hostNetwork: false    			        # 可選,是否為主機模式,
                                                        # 如是,會佔用主機端

  volumes:    						# 共享儲存卷列表
  - name: webroot 					# 名稱,與上述對應
    emptyDir: {}    				        # 共享卷型別,空
    hostPath:        				        # 共享卷型別,本機目錄
      path: /etc/hosts
    secret:    						# 共享卷型別,secret模式,一般用於密碼
      secretName: default-token-tf2jp # 名稱
      defaultMode: 420 				        # 許可權
      configMap:    				        # 一般用於配置檔案
      name: nginx-conf
      defaultMode: 420

  
  
  
  
  
# 補充說明
cpu:200m
表示佔用0.2個cpu資源
按照1000m的1個cpu資源進行計算。
這裡設定的是初始值,若初始值過小可能分到資源不充足的機器,不能向上佔用資源了

記憶體,
java 參考jvm虛擬機器資源設定
golang 不用設定記憶體,靠應用自己去佔用

生產環境CPU設定:
最小設定500m
一般設定1000m
較高設定2000
極高設定3000~4000m

explain檢視屬性的定義和用法
檢視service資源下metadata的定義及用法
kubectl explain service.metadata