在k8s集群中任意節(jié)點使用kubectl
# 1.將master節(jié)點中/etc/kubernetes/admin.conf拷貝到node1和node2的/etc/kubernetes目錄中
scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes
scp /etc/kubernetes/admin.conf root@k8s-node2:/etc/kubernetes
# 2.在node1和node2上配置環(huán)境變量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
kubectl常用命令
# k8s命令大全:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
# 可以使用kubectl --help 以及kubectl xxx --help獲取命令以及參數(shù)信息
# 獲取xxx資源的信息,如po、deploy、svc、ns等
kubectl get xxx
# kubectl命令中可以使用po代替pods,deploy代替deployments,svc代替services,ns代替namespace,no代替nodes
# 獲取pods
kubectl get po
#獲取命名空間
kubectl get ns
# 獲取deployments
kubectl get deploy
# 獲取services
kubectl get svc
# 獲取nodes
kubectl get no
# 獲取pods的詳細信息
kubectl get po -o wide
# 刪除某個deploy,刪除pods、services、namespaces、nodes同理
kubectl delete deploy xxx
# 查看pod資源的資源清單屬性
kubectl explain pod
kubectl create -f xxx.yaml
K8S資源清單
1.必選字段
| 參數(shù)名 | 字段類型 | 說明 |
|---|---|---|
| version | String | 指 K8s API 的版本,目前基本上是 v1 ,可以用 kubectl api-versions 命令查詢 |
| kind | String | 指 yaml 文件定義的資源類型和角色,比如:Pod |
| metadata | Object | 元數(shù)據(jù)對象 |
| metadata.name | String | 元數(shù)據(jù)對象的名字,比如命名 Pod 的名字 |
| metadata.namespace | String | 元數(shù)據(jù)對象的命名空間(默認default) |
| spec | Object | 詳細定義對象 |
| spec.containers[] | List | 容器列表的定義 |
| spec.containers[].name | String | 容器的名字 |
| spec.containers[].image | String | 容器鏡像的名稱 |
2.主要字段
| 參數(shù)名 | 字段類型 | 說明 |
|---|---|---|
| spec.containers[].imagePullPolicy | String | 定義鏡像的拉取策略,有Always、Never、IfNotPresent三個值可選,(1)Always:意思是每次都嘗試重新拉取鏡像,(2)Never:表示僅使用本地鏡像,(3)IfNotPresent:如果本地有鏡像就使用本地鏡像,沒有就拉取在線鏡像。上面三個值都沒設置的話,默認是Always。 |
| spec.containers[].command[] | List | 指定容器啟動命令,因為是數(shù)組可以指定多個,不指定則使用鏡像打包時使用的啟動命令。 |
| spec.containers[].args[] | List | 批定容器啟動命令參數(shù),因為是數(shù)組可以指定多個。 |
| spec.containers[].workingDir | String | 指定容器的工作目錄 |
| spec.containers[].volumeMounts[] | List | 指定容器內(nèi)部的存儲卷位置 |
| spec.containers[].volumeMounts[].name | String | 指定可以被容器掛載的存儲卷的名稱 |
| spec.containers[].volumeMounts[].mountPath | String | 指定可以被掛載的存儲卷的路徑 |
| spec.containers[].volumeMounts[].readOnly | String | 設置存儲卷路徑的讀寫模式,true或者false,默認為讀寫模式 |
| spec.containers[].ports[] | List | 指定容器需要用到的端口列表 |
| spec.containers[].ports[].name | String | 指定端口名稱 |
| spec.containers[].ports[].containerPort | String | 指定容器需要監(jiān)聽的端口號 |
| spec.containers[].ports[].hostPort | String | 指定容器所在主機需要監(jiān)聽的端口號,默認跟上面containerPort相同,注意設置了hostPort同一臺主機無法啟動該容器的相同副本(會端口沖突) |
| spec.containers[].ports[].protocol | String | 指定端口協(xié)議,支持TCP和UDP,默認為TCP |
| spec.containers[].env[] | List | 指定容器運行前需要設置的環(huán)境變量列表 |
| spec.containers[].env[].name | String | 指定環(huán)境變量名稱 |
| spec.containers[].env[].value | String | 指定環(huán)境變量值 |
| spec.containers[].resources | Object | 指定資源限制和資源請求的值(這里開始就是設置容器的資源上限) |
| spec.containers[].resources.limits | Object | 指定設置容器運行時資源的運行上限 |
| spec.containers[].resources.limits.cpu | String | 指定CPU限制,單位為core數(shù),將用于docker run --cpu-shares參數(shù) |
| spec.containers[].resources.limits.memory | String | 指定MEM內(nèi)存的限制,單位為MIB、GiB |
| spec.containers[].resources.requests | Object | 指定容器啟動和調(diào)度時的限制設置 |
| spec.containers[].resources.requests.cpu | String | CPU請求,單位為core數(shù),容器啟動時初始化可用數(shù)量 |
| spec.containers[].resources.requests.memory | String | 內(nèi)存請求,單位為MIB、GiB,容器啟動時初始化可用數(shù)量 |
3.額外字段
| 參數(shù)名 | 字段類型 | 說明 |
|---|---|---|
| spec.restartPolicy | String | 定義Pod的重啟策略,可選值為Always、OnFailure、默認為Always。 1. Always:Pod一旦終止運行,則無論容器是如何終止的,kubelet服務都將重啟它 2.OnFailure:只有Pod以非零退出碼終止時,kubelet才會重啟該容器。如果容器正常結(jié)束(退出碼為0),則kubelet不會重啟它。 3.Never:Pod終止后,kubelet將退出碼報告給master,不會重啟該Pod |
| spec.nodeSelector | Object | 定義Node的Label過濾標簽,以key:value格式指定 |
| spec.imagePullSecrets | Object | 定義pull鏡像時使用secret名稱,以name:secretkey格式指定 |
| spec.hostNetwork | Boolean | 定義是否使用主機網(wǎng)絡模式,默認值是false,設置true表示使用主機網(wǎng)絡,不使用docker網(wǎng)橋,同時設置了true將無法在同一臺宿主機上啟動第二個副本 |
Pod資源清單詳解
# yaml格式的pod定義文件完整內(nèi)容:
apiVersion: v1 #必選,版本號,例如v1
kind: Pod #必選,Pod
metadata: #必選,元數(shù)據(jù)
name: string #必選,Pod名稱
namespace: string #必選,Pod所屬的命名空間
labels: #自定義標簽
- name: string #自定義標簽名字
annotations: #自定義注釋列表
- name: string
spec: #必選,Pod中容器的詳細定義
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱
image: string #必選,容器的鏡像名稱
imagePullPolicy: [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優(yōu)先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
command: [string] #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
args: [string] #容器的啟動命令參數(shù)列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內(nèi)部的存儲卷配置
- name: string #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名
mountPath: string #存儲卷在容器內(nèi)mount的絕對路徑,應少于512字符
readOnly: boolean #是否為只讀模式
ports: #需要暴露的端口庫號列表
- name: string #端口號名稱
containerPort: int #容器需要監(jiān)聽的端口號
hostPort: int #容器所在主機需要監(jiān)聽的端口號,默認與Container相同
protocol: string #端口協(xié)議,支持TCP和UDP,默認TCP
env: #容器運行前需設置的環(huán)境變量列表
- name: string #環(huán)境變量名稱
value: string #環(huán)境變量的值
resources: #資源限制和請求的設置
limits: #資源限制的設置
cpu: string #Cpu的限制,單位為core數(shù),將用于docker run --cpu-shares參數(shù)
memory: string #內(nèi)存限制,單位可以為Mib/Gib,將用于docker run --memory參數(shù)
requests: #資源請求的設置
cpu: string #Cpu請求,容器啟動的初始可用數(shù)量
memory: string #內(nèi)存清楚,容器啟動的初始可用數(shù)量
livenessProbe: #對Pod內(nèi)個容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可
exec: #對Pod容器內(nèi)檢查方式設置為exec方式
command: [string] #exec方式需要制定的命令或腳本
httpGet: #對Pod內(nèi)個容器健康檢查方法設置為HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對Pod內(nèi)個容器健康檢查方式設置為tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啟動完成后首次探測的時間,單位為秒
timeoutSeconds: 0 #對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒
periodSeconds: 0 #對容器監(jiān)控檢查的定期探測時間設置,單位秒,默認10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure]#Pod的重啟策略,Always表示一旦不管以何種方式終止運行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
nodeSelector: obeject #設置NodeSelector表示將該Pod調(diào)度到包含這個label的node上,以key:value的格式指定
imagePullSecrets: #Pull鏡像時使用的secret名稱,以key:secretkey格式指定
- name: string
hostNetwork:false #是否使用主機網(wǎng)絡模式,默認為false,如果設置為true,表示使用宿主機網(wǎng)絡
volumes: #在該pod上定義共享存儲卷列表
- name: string #共享存儲卷名稱 (volumes類型有很多種)
emptyDir: {} #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值
hostPath: string #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
path: string #Pod所在宿主機的目錄,將被用于同期中mount的目錄
secret: #類型為secret的存儲卷,掛載集群與定義的secre對象到容器內(nèi)部
scretname: string
items:
- key: string
path: string
configMap: #類型為configMap的存儲卷,掛載預定義的configMap對象到容器內(nèi)部
name: string
items:
- key: string
path: string
K8S探針
探針類型
Kubernetes(k8s)中的探針是一種健康檢查機制,用于監(jiān)測Pod內(nèi)容器的運行狀況。主要包括以下三種類型的探針:
1、存活探針(Liveness Probe)
2、就緒探針(Readiness Probe)
3、啟動探針(Startup Probe)
探針功能
啟動探針(StartupProbe)
Kubernetes (k8s) 的啟動探針(StartupProbe)主要用于檢測容器內(nèi)的應用是否已經(jīng)成功啟動并完成初始化任務。它的主要作用有以下幾點:
延緩其他探針生效: 在容器啟動初期,啟動探針先于存活探針(LivenessProbe)和就緒探針(ReadinessProbe)生效。當啟動探針配置存在時,kubelet不會執(zhí)行存活和就緒探針,直到啟動探針成功為止。這對于某些啟動時間較長或者啟動過程中有復雜初始化序列的應用程序來說非常重要,可以避免在應用還未完全啟動時就被誤判為不健康或就緒,進而被錯誤地重啟或流量過早涌入。
防止頻繁重啟: 若應用啟動期間,存活探針或就緒探針就開始工作,而此時應用可能還沒有完全啟動成功,這兩個探針可能會因為應用未能及時響應而觸發(fā)容器重啟,造成不必要的服務中斷和循環(huán)重啟。啟動探針的存在可以有效地防止此類情況的發(fā)生。
確保應用穩(wěn)定: 啟動探針使得Kubernetes能夠在應用真正啟動完畢后才將其視為健康的,并開始接受流量,從而保障了集群中應用服務的穩(wěn)定性。
就緒探針(Readiness Probe)
Kubernetes(k8s)中的就緒探針(Readiness Probe)主要作用是檢測容器是否已經(jīng)準備好對外提供服務。具體來說:
狀態(tài)評估: 就緒探針會定期對容器進行檢查,以確定容器內(nèi)應用程序是否完成了必要的初始化工作,并且能夠處理來自外部的請求或流量。
流量路由控制: 當就緒探針成功時,表示該容器內(nèi)部的應用程序已處于可接受請求的狀態(tài),此時kubelet會將該容器標記為“就緒”狀態(tài),Service將會將其IP地址添加到后端服務列表中,允許Service開始將網(wǎng)絡流量轉(zhuǎn)發(fā)至這個Pod。
避免無效請求: 如果就緒探針失敗,則意味著容器可能還在啟動過程中、正在重啟服務、或者由于某種原因暫時無法正常響應請求。在這種情況下,kubelet會將容器從Service的后端池中移除,確保不會向其發(fā)送任何用戶請求,從而避免了因應用未準備完畢而引起的錯誤響應和用戶體驗下降。
平滑過渡: 通過就緒探針,Kubernetes可以實現(xiàn)滾動更新或部署過程中的平滑過渡,新版本的容器在通過就緒探針驗證前,不會承擔任何實際流量,直到它們完全啟動并做好處理請求的準備。
存活探針(Readiness Probe)
Kubernetes(k8s)中的存活探針(Liveness Probe)主要作用是檢測容器內(nèi)主進程或服務是否仍然運行正常且響應健康檢查。具體來說:
監(jiān)控狀態(tài): 存活探針會定期對容器內(nèi)的應用進行檢查,以判斷其是否處于“存活”狀態(tài),即應用程序沒有崩潰、死鎖或其他不可恢復的錯誤。
自動恢復: 當存活探針檢測失敗時,kubelet將認為該容器內(nèi)的主進程已經(jīng)不再健康或者已停止提供預期的服務。此時,kubelet會根據(jù)Pod的重啟策略來決定是否應該重新啟動這個容器。通過這種方式,存活探針可以幫助實現(xiàn)故障自愈,及時恢復服務的可用性。
避免僵死進程: 如果一個容器由于內(nèi)部錯誤而進入不可用狀態(tài)但并未退出,存活探針能夠識別出這種情況,并觸發(fā)容器重啟,從而避免資源被僵死進程占用。
保持服務質(zhì)量: 通過持續(xù)監(jiān)控和及時重啟不健康的容器,存活探針有助于確保整個集群的服務質(zhì)量,減少因單個容器異常導致的整體服務失效的可能性。
探針探測周期
-
啟動探針(Startup Probe):
啟動探針僅在容器啟動階段執(zhí)行,探測成功后就不在探測。
在容器啟動后等待
initialDelaySeconds開始探測。當容器成功通過啟動探針檢查,即連續(xù)成功達到
successThreshold次數(shù)時,kubelet會停止執(zhí)行啟動探針,并開始執(zhí)行存活探針和就緒探針。
-
存活探針(Liveness Probe):
在容器啟動并完成啟動探針之后開始執(zhí)行。
在容器啟動后等待
initialDelaySeconds開始執(zhí)行。如果配置了啟動探針(Startup Probe),在啟動探針成功后等待initialDelaySeconds開始探測。存活探針在整個容器生命周期內(nèi)持續(xù)進行健康檢查,除非被暫時禁用或容器重啟。
-
就緒探針(Readiness Probe):
與存活探針類似,也是在容器啟動并可能完成啟動探針之后開始執(zhí)行。
在容器啟動后等待
initialDelaySeconds開始執(zhí)行。如果配置了啟動探針(Startup Probe),在啟動探針成功后等待initialDelaySeconds開始探測。就緒探針在整個容器生命周期內(nèi)持續(xù)進行健康檢查,除非被暫時禁用或容器重啟。
探針的實現(xiàn)方式
- HTTP GET 請求: Kubernetes通過向容器內(nèi)指定的端口發(fā)送一個HTTP GET請求來檢查應用的狀態(tài)。如果收到的HTTP響應碼在200-399范圍內(nèi),則認為該探測成功。
livenessProbe:
httpGet:
path: /health-check
port: 8080
httpHeaders: # 可選,用于設置自定義HTTP頭部
- name: Custom-Header
value: Value
- TCP Socket 檢查: Kubernetes嘗試與容器上指定的端口建立TCP連接。如果能夠成功建立連接,則說明探測成功。
livenessProbe:
tcpSocket:
port: 8080
- 執(zhí)行命令: 在容器內(nèi)部執(zhí)行一個命令,并根據(jù)命令退出時返回的狀態(tài)碼判斷容器是否正常運行。通常情況下,如果命令返回0,則表示成功。
livenessProbe:
exec:
command:
- cat
- /tmp/health
探針的配置參數(shù)
livenessProbe:
# 類型選擇器,可以選擇 httpGet、tcpSocket 或 exec 中的一種
httpGet: # HTTP GET 請求方式
path: /health # 要請求的路徑
port: 8080 # 要請求的端口
httpHeaders: # 可選,HTTP 請求頭列表
- name: X-Custom-Header
value: Awesome
tcpSocket: # TCP Socket 檢查方式
port: 8080 # 要連接的端口
exec: # 執(zhí)行命令檢查方式
command:
- cat
- /tmp/healthy
# 基本探測間隔參數(shù):
initialDelaySeconds: 30 # 容器啟動后延遲多少秒開始執(zhí)行第一次探測,默認為0秒
periodSeconds: 10 # 探測的時間間隔,即每隔多少秒執(zhí)行一次,默認為10秒(最小值1秒)
# 控制何時判斷容器健康或不健康的閾值參數(shù):
timeoutSeconds: 1 # 探測超時時間,默認為1秒(最小值1秒)
successThreshold: 1 # 在連續(xù)失敗之后需要多少次連續(xù)成功才能認為容器是健康的,默認為1
failureThreshold: 3 # 連續(xù)失敗多少次才觸發(fā)相應動作(如重啟容器對于存活探針)
readinessProbe: # 就緒探針配置類似
startupProbe: # 啟動探針配置也相似,不過主要用于檢測應用是否完成啟動過程
Pod的生命周期
Kubernetes 為容器提供了生命周期回調(diào)。 回調(diào)使容器能夠了解其管理生命周期中的事件,并在執(zhí)行相應的生命周期回調(diào)時運行在處理程序中實現(xiàn)的代碼。Kubernetes 支持 PostStart 和 PreStop 事件。 當一個容器啟動后,Kubernetes 將立即發(fā)送 PostStart 事件;在容器被終結(jié)之前, Kubernetes 將發(fā)送一個 PreStop 事件。

PostStart
PostStart回調(diào)在容器創(chuàng)建后立即執(zhí)行,但是PostStart并不能保證在容器ENTRYPOINT之前運行,所以PostStart的執(zhí)行相對于容器的代碼執(zhí)行是異步的。
PostStart主要用于資源部署、環(huán)境準備等。
只有 PostStart 處理函數(shù)執(zhí)行完畢,容器的狀態(tài)才會變成 RUNNING。
PreStop
PreStop在容器終止前立即被調(diào)用,它是阻塞的,所以它必須在刪除容器的調(diào)用觸發(fā)之前完成。
PreStop主要用于優(yōu)雅關(guān)閉應用程序、通知其他系統(tǒng)等。
如果鉤子在執(zhí)行期間掛起,Pod階段將停留在Running狀態(tài)并且不會達到failed狀態(tài)。
另外,PreStop的執(zhí)行現(xiàn)對于SIGTERM信息,也是異步的,k8s也不會等待PreStop執(zhí)行完成。
Pod終止過程
【第一步】用戶發(fā)出刪除 pod 命令
【第二步】K8S 會給舊POD發(fā)送SIGTERM信號;將 pod 標記為“Terminating”狀態(tài);pod 被視為“dead”狀態(tài),此時將不會有新的請求到達舊的pod;
【第三步】并且等待寬限期(
pod.spec.terminationGracePeriodSeconds參數(shù)定義,默認情況下30秒)這么長的時間與第三步同時運行,監(jiān)控到 pod 對象為“Terminating”狀態(tài)的同時啟動 pod 關(guān)閉過程
與第三步同時進行,endpoints 控制器監(jiān)控到 pod 對象關(guān)閉,將pod與service匹配的 endpoints 列表中刪除
如果 pod 中定義了
preStop處理程序,則 pod 被標記為“Terminating”狀態(tài)時以同步的方式啟動執(zhí)行preStop;若寬限期結(jié)束后,preStop 仍未執(zhí)行結(jié)束,第二步會重新執(zhí)行并額外獲得一個2秒的小寬限期(最后的寬限期,所以定義preStop 注意時間,和terminationGracePeriodSeconds 參數(shù)配合使用),Pod 內(nèi)對象的容器收到 TERM 信號
寬限期結(jié)束之后,若存在任何一個運行的進程,pod 會收到 SIGKILL 信號
Kubelet 請求 API Server 將此 Pod 資源寬限期設置為0從而完成刪除操作