一 kubernetes 基礎(chǔ)
Kubernetes是谷歌以Borg為前身,基于谷歌15年生產(chǎn)環(huán)境經(jīng)驗的基礎(chǔ)上開源的一個項目,Kubernetes致力于提供跨主機集群的自動部署、擴展、高可用以及運行應(yīng)用程序容器的平臺。
二 Master 節(jié)點
- kube-APIServer:集群的控制中樞,各個模塊之間信息交互都需要經(jīng)過Kube-APIServer,同時它也是集群管理、資源配置、整個集群安全機制的入口。
- kube-controller-manager:集群的狀態(tài)管理器,保證Pod或其他資源達到期望值,也是需要和APIServer進行通信,在需要的時候創(chuàng)建、更新或刪除它所管理的資源。
- kube-scheduler:集群的調(diào)度中心,它會根據(jù)指定的一系列條件,選擇一個或一批最佳的節(jié)點,然后部署我們的Pod。
- etcd:鍵值數(shù)據(jù)庫,報錯一些集群的信息,一般生產(chǎn)環(huán)境中建議部署三個以上節(jié)點(奇數(shù)個。生產(chǎn)環(huán)境建議用SSD存儲以提高性能)。
三 Node 節(jié)點
- Kubelet:負責(zé)監(jiān)聽節(jié)點上Pod的狀態(tài),同時負責(zé)上報節(jié)點和節(jié)點上面Pod的狀態(tài),負責(zé)與Master節(jié)點通信,并管理節(jié)點上面的Pod。
- Kube-proxy:負責(zé)Pod之間的通信和負載均衡,將指定的流量分發(fā)到后端正確的機器上。查看Kube-proxy工作模式:curl 127.0.0.1:10249/proxyMode,Ipvs:監(jiān)聽Master節(jié)點增加和刪除service以及endpoint的消息,調(diào)用Netlink接口創(chuàng)建相應(yīng)的IPVS規(guī)則。通過IPVS規(guī)則,將流量轉(zhuǎn)發(fā)至相應(yīng)的Pod上。
- Calico:符合CNI標(biāo)準(zhǔn)的網(wǎng)絡(luò)插件,給每個Pod生成一個唯一的IP地址,并且把每個節(jié)點當(dāng)做一個路由器。
- CoreDNS:用于Kubernetes集群內(nèi)部Service的解析,可以讓Pod把Service名稱解析成IP地址,然后通過Service的IP地址進行連接到對應(yīng)的應(yīng)用上。
- Docker:容器引擎,負責(zé)對容器的管理。(或者用containerd)
四 什么是pod
Pod可簡單地理解為是一組、一個或多個容器,具有共享存儲/網(wǎng)絡(luò)及如何運行容器的規(guī)范。Pad包含一個或多個相對緊密耦合的應(yīng)用程序容器,處于同一個Pod中的容器共享同樣的存儲空間(Volume,卷或存儲卷)、IP地址和Port端口,容器之間使用localhost:port相互訪問。根據(jù)Docker的構(gòu)造,Pod可被建模為一組具有共享命令空間、卷、IP地址和Port端口的Docker容器。
Pod包含的容器最好是一個容器只運行一個進程。每個Pod包含一個pause容器,pause容器是Pod的父容器,它主要負責(zé)僵尸進程的回收管理。
Kubernetes為每個Pod都分配一個唯一的IP地址,這樣就可以保證應(yīng)用程序使用同一端口,避免了發(fā)生沖突的問題。
nginx pod
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,類型Pod
metadata: # 必選,元數(shù)據(jù)
name: nginx # 必選,符合RFC 1035規(guī)范的Pod名稱
namespace: app # 可選,Pod所在的命名空間,不指定默認為default,可以使用-n 指定namespace
labels: # 可選,標(biāo)簽選擇器,一般用于過濾和區(qū)分Pod
app: nginx
role: frontend # 可以寫多個
annotations: # 可選,注釋列表,可以寫多個
app: nginx
spec: # 必選,用于定義容器的詳細信息
initContainers: # 初始化容器,在容器啟動之前執(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:latest # 必選,容器所用的鏡像的地址
imagePullPolicy: Always # 可選,鏡像拉取策略
command: # 可選,容器啟動執(zhí)行的命令
- 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 # 端口協(xié)議,默認TCP
env: # 可選,環(huán)境變量配置列表
- name: TZ # 變量名
value: Asia/Shanghai # 變量的值
- name: LANG
value: en_US.utf8
resources: # 可選,資源限制和資源請求限制
limits: # 最大限制設(shè)置
cpu: 1000m
memory: 1024Mi
requests: # 啟動所需的資源
cpu: 1000m
memory: 512Mi
startupProbe: # 可選,檢測容器內(nèi)進程是否完成啟動。注意三種檢查方式同時只能使用一種。
httpGet: # httpGet檢測方式,生產(chǎn)環(huán)境建議使用httpGet實現(xiàn)接口級健康檢查,健康檢查由應(yīng)用程序提供。
path: /api/successStart # 檢查路徑
port: 80
readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
httpGet: # httpGet檢測方式,生產(chǎn)環(huán)境建議使用httpGet實現(xiàn)接口級健康檢查,健康檢查由應(yīng)用程序提供。
path: / # 檢查路徑
port: 80 # 監(jiān)控端口
livenessProbe: # 可選,健康檢查
#exec: # 執(zhí)行容器命令檢測方式
#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: # 容器創(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 # 可選,容器重啟策略,默認為Always
nodeSelector: # 可選,指定Node節(jié)點
region: subnet7
imagePullSecrets: # 可選,拉取鏡像使用的secret,可以配置多個
- name: default-dockercfg-86258
hostNetwork: false # 可選,是否為主機模式,如是,會占用主機端口
volumes: # 共享存儲卷列表
- name: webroot # 名稱,與上述對應(yīng)
emptyDir: {} # 掛載目錄
hostPath: # 掛載本機目錄
path: /etc/hosts
五 Pod 生命周期
Pod 自身不具有自愈能力。如果 Pod 被調(diào)度到某節(jié)點而該節(jié)點之后失效, Pod 會被刪除;類似地,Pod 無法在因節(jié)點資源耗盡或者節(jié)點維護而被驅(qū)逐期間繼續(xù)存活。 Kubernetes 使用一種高級抽象來管理這些相對而言可隨時丟棄的 Pod 實例, 稱作控制器。
pod生命周期分類:
- Pending(等待) Pod 已被 Kubernetes 系統(tǒng)接受,但有一個或者多個容器尚未創(chuàng)建亦未運行。此階段包括等待 Pod 被調(diào)度的時間和通過網(wǎng)絡(luò)下載鏡像的時間。
- Running(運行中) Pod 已經(jīng)綁定到了某個節(jié)點,Pod 中所有的容器都已被創(chuàng)建。至少有一個容器仍在運行,或者正處于啟動或重啟狀態(tài)。
- Succeeded(成功) Pod 中的所有容器都已成功終止,并且不會再重啟。
- Failed(失?。?Pod 中的所有容器都已終止,并且至少有一個容器是因為失敗終止。也就是說,容器以非 0 狀態(tài)退出或者被系統(tǒng)終止。
- Unknown(未知) 因為某些原因無法取得 Pod 的狀態(tài)。這種情況通常是因為與 Pod 所在主機通信失敗。
- Terminated(已終止)Pod 處于 Terminated 狀態(tài)的容器已經(jīng)開始執(zhí)行并且或者正常結(jié)束或者因為某些原因失敗。 如果你使用 kubectl 來查詢包含 Terminated 狀態(tài)的容器的 Pod 時, 你會看到容器進入此狀態(tài)的原因、退出代碼以及容器執(zhí)行期間的起止時間。(如果容器配置了 preStop 回調(diào),則該回調(diào)會在容器進入 Terminated 狀態(tài)之前執(zhí)行)
六 容器重啟策略
Pod 的 spec 中包含一個 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默認值是 Always。
- Always:當(dāng)容器終止退出后,總是重啟容器,默認策略
- OnFailure:當(dāng)容器異常退出(退出狀態(tài)碼非0)時,重啟容器
- Never:當(dāng)容器終止退出,從不重啟容器。
當(dāng) kubelet 根據(jù)配置的重啟策略處理容器重啟時,僅適用于同一 Pod 內(nèi)替換容器并在同一節(jié)點上運行的重啟。當(dāng) Pod 中的容器退出時,kubelet 會按指數(shù)回退方式計算重啟的延遲(10s、20s、40s、…),其最長延遲為 5 分鐘。 一旦某容器執(zhí)行了 10 分鐘并且沒有出現(xiàn)問題,kubelet 對該容器的重啟回退計時器執(zhí)行重置操作。 Sidecar 容器和 Pod 生命周期中解釋了 init containers 在指定 restartpolicy 字段時的行為。
七 Init 容器
每個 Pod 中可以包含多個容器, 應(yīng)用運行在這些容器里面,同時 Pod 也可以有一個或多個先于應(yīng)用容器啟動的 Init 容器。
Init 容器與普通的容器非常像,除了如下兩點:
- 它們總是運行到完成。
- 每個都必須在下一個啟動之前成功完成。
如果 Pod 的 Init 容器失敗,kubelet 會不斷地重啟該 Init 容器直到該容器成功為止。 然而,如果 Pod 對應(yīng)的 restartPolicy 值為 “Never”,并且 Pod 的 Init 容器失敗, 則 Kubernetes 會將整個 Pod 狀態(tài)設(shè)置為失敗。
Init 容易與主應(yīng)用容器的區(qū)別
- 在 Pod 初始化期間完成運行的容器,即先運行init容器結(jié)束后運行應(yīng)用容器。
- Init 容器支持應(yīng)用容器的全部字段和特性,包括資源限制、 數(shù)據(jù)卷和安全設(shè)置。
- 常規(guī)的 Init 容器(即不包括邊車容器)不支持 lifecycle、livenessProbe、readinessProbe 或 startupProbe 字段。
- 如果為一個 Pod 指定了多個 Init 容器,這些容器會按順序逐個運行。 每個 Init 容器必須運行成功,下一個才能夠運行。當(dāng)所有的 Init 容器運行完成時, Kubernetes 才會為 Pod 初始化應(yīng)用容器并像平常一樣運行。
使用 Init 容器
init 容器特點:(總結(jié)一下就是為了初始化應(yīng)用容器的一個方式,優(yōu)化應(yīng)用容器的體積。)
-
Init 容器可以包含一些安裝過程中應(yīng)用容器中不存在的實用工具或個性化代碼。 例如,沒有必要僅為了在安裝過程中使用類似 sed、awk、python 或 dig 這樣的工具而去 FROM 一個鏡像來生成一個新的鏡像。
-
應(yīng)用鏡像的創(chuàng)建者和部署者可以各自獨立工作,而沒有必要聯(lián)合構(gòu)建一個單獨的應(yīng)用鏡像。
-
與同一 Pod 中的多個應(yīng)用容器相比,Init 容器能以不同的文件系統(tǒng)視圖運行。因此,Init 容器可以被賦予訪問應(yīng)用容器不能訪問的 Secret 的權(quán)限。
-
由于 Init 容器必須在應(yīng)用容器啟動之前運行完成,因此 Init 容器提供了一種機制來阻塞或延遲應(yīng)用容器的啟動,直到滿足了一組先決條件。 一旦前置條件滿足,Pod 內(nèi)的所有的應(yīng)用容器會并行啟動。
-
Init 容器可以安全地運行實用程序或自定義代碼,而在其他方式下運行這些實用程序或自定義代碼可能會降低應(yīng)用容器鏡像的安全性。 通過將不必要的工具分開,你可以限制應(yīng)用容器鏡像的被攻擊范圍。
示例:
下面的例子定義了一個具有 2 個 Init 容器的簡單 Pod。 第一個 啟動 init-myservice, 第二個啟動 init-mydb。這兩個init容器啟動完成以后,Pod 將啟動 spec 節(jié)中的 myapp-container 應(yīng)用容器。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
八 邊車容器
邊車容器是與主應(yīng)用容器在同一個 Pod 中運行的輔助容器。 這些容器通過提供額外的服務(wù)或功能(如日志記錄、監(jiān)控、安全性或數(shù)據(jù)同步)來增強或擴展主應(yīng)用容器的功能, 而無需直接修改主應(yīng)用代碼。
與主應(yīng)用容器的區(qū)別
-
邊車容器與同一 Pod 中的常規(guī)容器并行運行。不過邊車容器不執(zhí)行主應(yīng)用邏輯,而是為主應(yīng)用提供支持功能。
-
邊車容器具有獨立的生命周期。它們可以獨立于常規(guī)容器啟動、停止和重啟。 這意味著你可以更新、擴展或維護邊車容器,而不影響主應(yīng)用
-
邊車容器與主容器共享相同的網(wǎng)絡(luò)和存儲命名空間。這種共存使它們能夠緊密交互并共享資源。
與init 容器的區(qū)別
- 邊車容器與主容器并行工作,擴展其功能并提供附加服務(wù),Init 容器不會持續(xù)與主容器一起運行。
- 邊車容器與主應(yīng)用容器同時運行。它們在整個 Pod 的生命周期中都處于活動狀態(tài),并且可以獨立于主容器啟動和停止。 與 Init 容器不同, 邊車容器支持所有探針來控制其生命周期。
- 這些邊車容器可以直接與主應(yīng)用容器進行交互,共享相同的網(wǎng)絡(luò)命名空間、文件系統(tǒng)和環(huán)境變量。 所有這些容器緊密合作,提供額外的功能。
- 書寫格式上面有帶呢區(qū)別,縮緊不一樣。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: alpine:latest
command: ['sh', '-c', 'echo "logging" > /opt/logs.txt']
volumeMounts:
- name: data
mountPath: /opt
initContainers:
- name: logshipper
image: alpine:latest
restartPolicy: Always
command: ['sh', '-c', 'tail /opt/logs.txt']
volumeMounts:
- name: data
mountPath: /opt
volumes:
- name: data
emptyDir: {}
九 Pod 探針
- StartupProbe:k8s1.16版本后新加的探測方式,用于判斷容器內(nèi)應(yīng)用程序是否已經(jīng)啟動。如果配置了startupProbe,就會先禁止其他的探測,直到它成功為止,成功后將不在進行探測。
- LivenessProbe:用于探測容器是否運行,如果探測失敗,kubelet會根據(jù)配置的重啟策略進行相應(yīng)的處理。若沒有配置該探針,默認就是success。
- ReadinessProbe:一般用于探測容器內(nèi)的程序是否健康,它的返回值如果為success,那么久代表這個容器已經(jīng)完成啟動,并且程序已經(jīng)是可以接受流量的狀態(tài)。
探針檢測方式
- ExecAction:在容器內(nèi)執(zhí)行一個命令,如果返回值為0,則認為容器健康。
- TCPSocketAction:通過TCP連接檢查容器內(nèi)的端口是否是通的,如果是通的就認為容器健康。
- HTTPGetAction:通過應(yīng)用程序暴露的API地址來檢查程序是否是正常的,如果狀態(tài)碼為200~400之間,則認為容器健康。
ExecAction 探測舉例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
TCPSocketAction 舉例:
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: registry.k8s.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
HTTPGetAction 舉例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: registry.k8s.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
探針參數(shù)配置
initialDelaySeconds: 60 # 初始化時間
timeoutSeconds: 2 # 超時時間
periodSeconds: 5 # 檢測間隔
successThreshold: 1 # 檢查成功為1次表示就緒
failureThreshold: 2 # 檢測失敗2次表示未就緒
十 定義 postStart 和 preStop 處理函數(shù)
創(chuàng)建一個包含一個容器的 Pod,該容器為 postStart 和 preStop 事件提供對應(yīng)的處理函數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-852605.html
在下面的配置文件中,你可以看到 postStart 命令在容器的 /usr/share 目錄下寫入文件 message。 命令 preStop 負責(zé)優(yōu)雅地終止 nginx 服務(wù)。當(dāng)因為失效而導(dǎo)致容器終止時,這一處理方式很有用。文章來源地址http://www.zghlxwxcb.cn/news/detail-852605.html
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
到了這里,關(guān)于K8S基本概念+pod生命周期+容器重啟策略+Init容器和邊車容器+pod探針+postStart和preStop的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!