大部分資源的配置清單:
apiVersion: group/version
# 查看所支持的版本.
$ kubectl api-versions
kind: 資源類別(Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob,Service....)
metadata: 元數據
name(同一類別中名稱要唯一,不同的namespace中name可以重名)
namespace
labels: 標籤,方便控制器及Service進行管理.
annotations: 資源註解
每個的資源的引用PATH:
/api/v1/namespaces/default/pods/client
/組名/版本/名稱空間/default的名稱空間/pods(資源類型)/資源名稱
spec: 定義目標期望的狀態,讓當前狀態像期望狀態靠近(副本數量)
status: 當前狀態,本字段由kubernetes集羣維護,用戶無法刪除定義.
# 查看Pod的定義規範
$ kubectl explain pod
# 二級字段查詢定義規範(查詢Pod下的metadata如何定義)
$ kubectl explain pod.metadata
# 查看spec如何定義
$ kubectl explain pod.spec
Pod資源:
spec.containers []<object>
- name <string>
image <string>
imagePullPolicy <string> # 鏡像獲取策略(Always, Never, IfNotPresent(如果本地不存在就去下載))
如果要覆蓋默認的 Entrypoint 與 Cmd,需要遵循如下規則:
1. 如果在容器配置中沒有設置command或者args那麼將使用Docker鏡像自帶的命令及其入參。
2. 如果在容器配置中只設置了command但是沒有設置args那麼容器啓動時只會執行該命令,Docker 鏡像中自帶的命令及其入參會被忽略。
3. 如果在容器配置中只設置了args那麼Docker鏡像中自帶的命令會使用該新入參作爲其執行時的入參。
4. 如果在容器配置中同時設置了command與args,那麼Docker鏡像中自帶的命令及其入參會被忽略。容器啓動時只會執行配置中設置的命令,並使用配置中設置的入參作爲命令的入參。
幫助來源:https://kubernetes.io/zh/docs/tasks/inject-data-application/define-command-argument-container/
args <[]string>
command <[]string>
標籤:
# 鍵值對兒的長度不能超過63個字符
key = value
key: 字母、數字、_、-、.
value: 可以爲空,只能以字母或數字開頭及結尾,中間可用字母、數字、_、-、.
# 顯示pod中標籤爲app的pod $ kubectl get pods -l app --show-labels # 另外一種絕對性查詢,key=value 等值關係: =、==、!= $ kubectl get pods -l app[=|==|!=]myapp --show-labels # 集合關係: KEY in (VALUE1,VALUE2...) KEY not in (VALUE1,VALUE2...) KEY !KEY $ kubectl get pods -l "release in (canary,beta,alpha)" $ kubectl get pods -l "release notin (canary,beta,alpha)" # 給資源對象增加標籤 $ kubectl label pod pod-demo release=canary # 修改資源對象的標籤 $ kubectl label pod pod-demo release=stable --overwrite # 刪除資源對象的標籤 $ kubectl label pod pod-demo release-
許多資源支持內嵌字段定義其使用的標籤選擇器:
matchLabels: 直接給定鍵值(Service只能用這種)
matchExpressions:基於給定的表達式來定義使用的標籤選擇器,{key:"KEY",operator:"OPERATOR",values:[VALUE1,VALUE2,VALUE3...]},鍵與值使用operator定義的格式符進行比較
操作符(operator):
In, NotIn: values字段的值必須爲非空列表;
Exists, NotExists: values字段的值必須爲空列表;
pod.spec.nodeSelector <map[string]string>
節點標籤選擇器: 指定Pod運行在哪類節點上(給節點打上標籤)
# 給節點增加標籤 $ kubectl label node node1 disktype=ssd $ vim pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
# 這裏定義了標籤,那麼Pod只會運行到node1節點上,因爲只有node1節點有"disktype=ssd"標籤
nodeSelector:
disktype: ssd
pod.spec.nodeName <string>
pod.metadata.annotations:
與label不同的是,不能用於挑選資源對象,僅用於爲對象提供"元數據";
metadata:
annotations:
kaikai.com/created-by: "cluster admin"
Pod的生命週期:
1. 初始化容器完成初始化,線性完成;
2. 主容器啓動時候,可以做啓動後鉤子;
3. 主容器結束前,可以做結束前鉤子;
4. 可在容器運行過程中做容器探測(liveness probe和readiness probe)支持三中探測行爲(1.執行自定義命令;2.像指定的tcp套接字發請求;3.像指定的http服務發請求)
Pod探測:
livenessProbe(存活性探測): 探測主容器是否處於運行狀態;
readinessProbe(就緒型探測): 用於判定容器中的主進程是否已經就緒,並可以對外提供服務;
livenessProbe探測中的ExecAction(自定義命令探測):
apiversion: v1 kind: Pod metadata: name: liveness-exec namespace: default spec: containers: - name: liveness-exec-container image: busybox:latest imagePullPolicy: IfNotPresent command: - "/bin/sh" - "-c" - "touch /tmp/healthy;sleep 30;rm -f /tmp/healthy;sleep 3600" livenessProbe: exec: command: - "test" - "-e" - "/tmp/healthy" initialDelaySeconds: 1 periodSeconds: 3
#註釋:
livenessProbe: 對Pod做存活性檢測;
exec: 使用存活性檢測方法中的ExecAction(自定義命令檢測)方法進行檢測;
command: 使用哪個命令;
initialDelaySeconds: 當Pod啓動1秒後進行檢測;
periodSeconds: 執行探測的頻率。默認是10秒,此處設爲3秒;
$ kubectl describe pod liveness-exec (由於沒有做重啓策略,所以會不斷的重啓Pod,Last State的狀態還是Terminated,所以Pod有問題,檢測驗證成功)
livenessProbe探測中的HTTPGetAction(像指定的http服務發請求探測):
apiVersion: v1 kind: Pod metadata: name: liveness-httpget-pod namespace: default spec: containers: - name: liveness-httpget-container image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 livenessProbe: httpGet: port: 80 path: /index.html initialDelaySeconds: 1 periodSeconds: 3
#註釋:
livenessProbe: 對Pod進行存活性探測
httpGet:採用HttpGetAction方法探測
port: 要探測Pod的哪個端口
path: 請求的URL路徑
$ kubectl create -f liveness-httpget.yaml
$ kubectl describe pod liveness-httpget-pod(如下圖,沒有發現問題)
# 創建問題,發現是否會產生異常
$ kubectl exec -it liveness-httpget-pod -- /bin/sh
/ # rm /usr/share/nginx/html/index.html
鍵盤同時按住Ctrl + P + Q 不終止容器運行退出容器
$ kubecget describe pod liveness-httpget-pod (會發現已經出現了異常)
readinessProbe(就緒型探測)中的HTTPGetAction(像指定的http服務發請求探測):其他探測方法類似此httpGet方法!
apiVersion: v1 kind: Pod metadata: name: readiness-httpget-pod namespace: default spec: containers: - name: readiness-httpget-container image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 readinessProbe: httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
#註釋:
readinessProbe: 使用就緒型探測
httpGet: 就緒型探測中的HTTPGet方法
# 此時查看Pod狀態爲Running狀態,且已經就緒,(READY字段下的第一個1代表已就緒,後邊兒的1代表幾個容器)
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
readiness-httpget-pod 1/1 Running 0 10s
# 製造問題,驗證探測是否有效
$ kubectl exec -it readiness-httpget-pod -- /bin/sh
/ # rm /usr/share/nginx/html/index.html
Ctrl+P+Q不中斷容器退出
# 再次查詢Pod的狀態,發現已經左側1已經變爲0,說明容器此時未就緒;
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
readiness-httpget-pod 0/1 Running 0 32s
# 查看詳細信息
$ kubectl describe pod readiness-httpget-pod (ready狀態爲False,且日誌爲404;)
# 解決此問題
$ kubectl exec -it readiness-httpget-pod -- /bin/sh
/ # echo "hi" >> /usr/share/nginx/html/index.html
$ kubecget get pods (會發現狀態還原了)
NAME READY STATUS RESTARTS AGE
readiness-httpget-pod 1/1 Running 0 14m
Pod啓動後操作:
pod.spec.containers.lifecycle.postStart <Object>
apiVersion: v1 kind: Pod metadata: name: poststart-pod namespace: default spec: containers: - name: busybox-httpd image: busybox:latest imagePullPolicy: IfNotPresent lifecycle: postStart: exec: command: ['mkdir','-p','/data/web/html'] command: ['/bin/sh','-c','sleep 3600']
# 註釋:
lifecycle: 生命週期(包含了postStart(容器啓動後操作)和preStop(容器停止前操作).)
postStart: 容器啓動後操作
exec: 當容器啓動後,要執行的命令
command: 具體shell
最下面的command: 是容器的命令
注意:postStart要執行的命令必須在容器已經啓動了之後纔會執行,也就是說最後一個command如果命令無法執行,那麼postStart也是無法執行的!
pod.spec.containers.lifecycle.preStop <Object> 與上述類似,不再舉例
狀態:
- Pending: 掛起,沒有節點能夠滿足調度條件;
- Running: 運行
- Failed: 失敗
- Succeeded: 成功
- Unknow: Pod狀態是API Server與運行這個Pod的節點上的kubelet通信獲取狀態信息的,如果kubelet有問題了,那麼就有可能unknown;
創建Pod:
1. 將請求提交給API Server;
2. API Server請求的目標狀態保存到ETCD中;
3. API Server請求Scheduler進行調度,如果調度成功,則將調度結果保存到ETCD中;
4. 目標節點的kubelet通過API Server當中的狀態編號會收到Pod請求,隨後kubelet拿到用戶創建Pod的清單進行創建啓動;
5. 創建成功或失敗會有狀態,返還給API Server中,再次更新到ETCD中;
restartPolicy:
Always, OnFailure(錯誤才重啓), Never. Default to Always.