網(wǎng)站首頁 編程語言 正文
什么是Pod?
pod是kubernetes中最小的單元,由一組、一個(gè)或多個(gè)容器組成,每個(gè)pod中包含了一個(gè)pause容器。
pause容器是pod的父容器,主要負(fù)責(zé)僵尸進(jìn)程的回收管理,通過pause容器可以使同一個(gè)pod中多個(gè)容器共享存儲(chǔ)、網(wǎng)絡(luò)、PID、IPC等,同一個(gè)Pod中多容器間訪問僅通過localhost就可以通信。
為什么要引入Pod?
將有強(qiáng)依賴性的容器放在同一個(gè)Pod里,例如要求低延遲性,容器A與容器B之間文件上的聯(lián)系等,引入Pod的概念是可以提高性能、便于管理。
從k8s角度說,docker是容器,但是容器卻不只是docker,引入pod可以使容器間工作更協(xié)調(diào)。
定義一個(gè)Pod:pod.yaml
下面這個(gè)yaml文件可能復(fù)制有問題,你也可以使用下面命令生成一個(gè)yaml文件作為模板進(jìn)行修改:
kubectl create deployment nginx --image=nginx -o yaml --dry-run=client >nginx.yaml
apiVersion: v1 # 必選,API的版本號(hào) kind: Pod # 必選,類型Pod metadata: # 必選,元數(shù)據(jù) name: nginx # 必選,符合RFC 1035規(guī)范的Pod名稱 # namespace: default # 可選,Pod所在的命名空間,不指定默認(rèn)為default,可以使用-n 指定namespace labels: # 可選,標(biāo)簽選擇器,一般用于過濾和區(qū)分Pod app: nginx role: frontend # 可以寫多個(gè) annotations: # 可選,注釋列表,可以寫多個(gè) app: nginx spec: # 必選,用于定義容器的詳細(xì)信息 # initContainers: # 初始化容器,在容器啟動(dòng)之前執(zhí)行的一些初始化操作 # - command: # - sh # - -c # - echo "I am InitContainer for init some configuration" # image: busybox # imagePullPolicy: IfNotPresent # name: init-container containers: # 必選,容器列表 - name: nginx # 必選,符合RFC 1035規(guī)范的容器名稱 image: nginx:1.15.2 # 必選,容器所用的鏡像的地址 imagePullPolicy: IfNotPresent # 可選,鏡像拉取策略, IfNotPresent: 如果宿主機(jī)有這個(gè)鏡像,那就不需要拉取了. Always: 總是拉取, Never: 不管是否存儲(chǔ)都不拉去 command: # 可選,容器啟動(dòng)執(zhí)行的命令 ENTRYPOINT, arg --> cmd - nginx - -g - "daemon off;" workingDir: /usr/share/nginx/html # 可選,容器的工作目錄 # volumeMounts: # 可選,存儲(chǔ)卷配置,可以配置多個(gè) # - name: webroot # 存儲(chǔ)卷名稱 # mountPath: /usr/share/nginx/html # 掛載目錄 # readOnly: true # 只讀 ports: # 可選,容器需要暴露的端口號(hào)列表 - name: http # 端口名稱 containerPort: 80 # 端口號(hào) protocol: TCP # 端口協(xié)議,默認(rèn)TCP env: # 可選,環(huán)境變量配置列表 - name: TZ # 變量名 value: Asia/Shanghai # 變量的值 - name: LANG value: en_US.utf8 # resources: # 可選,資源限制和資源請(qǐng)求限制 # limits: # 最大限制設(shè)置 # cpu: 1000m # memory: 1024Mi # requests: # 啟動(dòng)所需的資源 # cpu: 100m # memory: 512Mi # startupProbe: # 可選,檢測(cè)容器內(nèi)進(jìn)程是否完成啟動(dòng)。注意三種檢查方式同時(shí)只能使用一種。 # httpGet: # httpGet檢測(cè)方式,生產(chǎn)環(huán)境建議使用httpGet實(shí)現(xiàn)接口級(jí)健康檢查,健康檢查由應(yīng)用程序提供。 # path: /api/successStart # 檢查路徑 # port: 80 # readinessProbe: # 可選,健康檢查。注意三種檢查方式同時(shí)只能使用一種。 # httpGet: # httpGet檢測(cè)方式,生產(chǎn)環(huán)境建議使用httpGet實(shí)現(xiàn)接口級(jí)健康檢查,健康檢查由應(yīng)用程序提供。 # path: / # 檢查路徑 # port: 80 # 監(jiān)控端口 # livenessProbe: # 可選,健康檢查 #exec: # 執(zhí)行容器命令檢測(cè)方式 #command: #- cat #- /health #httpGet: # httpGet檢測(cè)方式 # path: /_health # 檢查路徑 # port: 8080 # httpHeaders: # 檢查的請(qǐng)求頭 # - name: end-user # value: Jason # tcpSocket: # 端口檢測(cè)方式 # port: 80 # initialDelaySeconds: 60 # 初始化時(shí)間 # timeoutSeconds: 2 # 超時(shí)時(shí)間 # periodSeconds: 5 # 檢測(cè)間隔 # successThreshold: 1 # 檢查成功為2次表示就緒 # failureThreshold: 2 # 檢測(cè)失敗1次表示未就緒 # lifecycle: # postStart: # 容器創(chuàng)建完成后執(zhí)行的指令, 可以是exec httpGet TCPSocket # exec: # command: # - sh # - -c # - 'mkdir /data/ ' # preStop: # httpGet: # path: / # port: 80 # exec: # command: # - sh # - -c # - sleep 9 restartPolicy: Always # 可選,默認(rèn)為Always,容器故障或者沒有啟動(dòng)成功,那就自動(dòng)該容器,Onfailure: 容器以不為0的狀態(tài)終止,自動(dòng)重啟該容器, Never:無論何種狀態(tài),都不會(huì)重啟 #nodeSelector: # 可選,指定Node節(jié)點(diǎn) # region: subnet7 # imagePullSecrets: # 可選,拉取鏡像使用的secret,可以配置多個(gè) # - name: default-dockercfg-86258 # hostNetwork: false # 可選,是否為主機(jī)模式,如是,會(huì)占用主機(jī)端口 # volumes: # 共享存儲(chǔ)卷列表 # - name: webroot # 名稱,與上述對(duì)應(yīng) # emptyDir: {} # 掛載目錄 # hostPath: # 掛載本機(jī)目錄 # path: /etc/hosts
apiserver
:定義API的版本號(hào)
kind
:創(chuàng)建資源類型,如pod、deployment等
metadata
:元數(shù)據(jù),如pod的一些基本信息
spec
:用于定義容器的詳細(xì)信息
執(zhí)行yaml文件創(chuàng)建Pod:
kubectl create -f pod.yaml
完成后查看Pod:
kubectl get pod
注意:生產(chǎn)中基本不會(huì)直接使用pod進(jìn)行部署,但是yaml文件大同小異。需要熟悉yaml文件的格式和配置項(xiàng)。
Pod探針:
StartupProbe
:1.16版本后增加的探針方式,用于判斷容器內(nèi)應(yīng)用程序是否已經(jīng)啟動(dòng),如果配置了StartupProbe,就會(huì)先禁止其他探測(cè),直到成功,成功后將不在進(jìn)程探測(cè)。
LivenessProbe
:用于探測(cè)容器是否運(yùn)行,如果探測(cè)失敗,kubelet會(huì)根據(jù)配置的重啟策略進(jìn)行相應(yīng)的處理。若沒有配置該探針,默認(rèn)就是success。
ReadinessProbe
:一般用于探測(cè)容器內(nèi)的程序是否健康,它的返回值如果為success,那么代表這個(gè)容器已經(jīng)啟動(dòng)成功,并且程序已經(jīng)是可以接受流量的狀態(tài)。
Pod探針檢測(cè)方式:
以上探針均可配置以下方式:
ExecAction
:在容器內(nèi)執(zhí)行一個(gè)命令,如果返回值為0,則認(rèn)為容器健康(類似于執(zhí)行一個(gè)命令后,執(zhí)行echo $?返回值為0代表成功是一樣的)
livenessProbe: exec: command: - cat - /tmp/health
TCPSocketAction
:通過TCP連接檢查容器內(nèi)的端口是否通的,如果是通的則認(rèn)為容器健康(類似于telnet 127.0.0.1 3306,執(zhí)行成功的話判斷為容器健康)
livenessProbe: tcpSocket: port: 80
HTTPGetAction:通過應(yīng)用程序暴露的API地址來檢查程序是否正常,如果狀態(tài)碼為200~400之間,則認(rèn)為容器健康。(生產(chǎn)使用最多)
livenessProbe: httpGet: path: /status/health port: 80
探針檢查的幾個(gè)參數(shù):
initialDelaySeconds
:初始化時(shí)間(比如程序啟動(dòng)慢,我要多少秒后才會(huì)檢查)
timeoutSeconds
:超時(shí)時(shí)間(1-2秒)
periodSeconds
:檢測(cè)間隔,多長時(shí)間檢測(cè)一次(5秒)
successThreshold
:檢測(cè)成功次數(shù),比如檢測(cè)成功幾次代表就緒(1-2次)
failureThreshold
:檢測(cè)失敗次數(shù),比如檢測(cè)失敗幾次代表未就緒(2次)
重啟策略:timeoutSecondsperiodSecondsfailureThreshold
我們可以看以下coredns的探針配置:
# 查看pod名稱 [root@k8s-master01 ~]# kubectl get deployment -n kube-system coredns 1/1 1 1 5d18h # 在線編譯coredns的yaml文件 [root@k8s-master01 ~]# kubectl edit deployment coredns -n kube-system livenessProbe: failureThreshold: 5 httpGet: path: /health port: 8080 scheme: HTTP initialDelaySeconds: 60 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5 # 上面代表請(qǐng)求8080的/health接口,如果訪問成功則保留容器不會(huì)被殺死 readinessProbe: failureThreshold: 3 httpGet: path: /ready port: 8181 scheme: HTTP periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 # 上面配置代表請(qǐng)求8181的/ready接口成功,說明容器可以正常開始工作了
Pod退出流程
Prestop:先去請(qǐng)求eureka接口,把自己的IP地址和端口號(hào),進(jìn)行下線,eureka從注冊(cè)表中該應(yīng)用的IP地址。然后容器進(jìn)行sleep 90,kill ‘進(jìn)程’;(注意90不是確定值,而是根據(jù)實(shí)際情況進(jìn)行變化的)
原文鏈接:https://yyang.blog.csdn.net/article/details/122804451
相關(guān)推薦
- 2022-10-21 Go?Ticker?周期性定時(shí)器用法及實(shí)現(xiàn)原理詳解_Golang
- 2022-03-19 Docker之自定義網(wǎng)絡(luò)實(shí)現(xiàn)_docker
- 2022-10-30 C#實(shí)現(xiàn)單例模式的6種方法小結(jié)_C#教程
- 2023-06-18 詳解Go語言中make和new的區(qū)別_Golang
- 2022-11-20 使用Docker部署openGauss國產(chǎn)數(shù)據(jù)庫的操作方法_docker
- 2022-12-13 sql索引失效的情況以及超詳細(xì)解決方法_MsSql
- 2022-09-18 Python中Parser的超詳細(xì)用法實(shí)例_python
- 2022-10-27 在Rust?web服務(wù)中使用Redis的方法_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支