API server 接受和返回的所有 JSON 對(duì)象都遵循同一個(gè)模式,它們都具有 "kind" 和 "apiVersion" 字段,用于標(biāo)識(shí)對(duì)象所屬的資源類型、API 的群組及相關(guān)版本
大多數(shù)的對(duì)象或列表類型的資源還需要具有三個(gè)嵌套型的字段 metadata、spec 和 status
metadata 字段為資源提供元數(shù)據(jù)信息,例如名稱、隸屬的名稱空間和標(biāo)簽等
spec 用于定義用戶期望的狀態(tài),不同的資源類型,其狀態(tài)的意義各有不同,例如 Pod 資源最為核心的功能在于運(yùn)行容器;
status 則記錄著活動(dòng)獨(dú)享的當(dāng)前狀態(tài)信息,它由 Kubernetes 系統(tǒng)自行維護(hù),對(duì)用戶來(lái)說為只讀字段;
"kubectl api-resources" 命令可以獲取集群支持使用的所有資源類型
<pre data-language="plain" id="88a19dad" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#使用陳述式對(duì)象配置
創(chuàng)建一個(gè)名稱空間
~]# kubectl create -f develop-n.yaml
namespace/develop created
~]# cat develop-n.yaml
apiVersion: v1
kind: Namespace
metadata:
name: develop
使用聲明式對(duì)象配置
創(chuàng)建一個(gè)名稱空間
~]# kubectl delete ns develop
namespace "develop" deleted
~]# kubectl apply -f develop-n.yaml
namespace/develop created
~]# cat develop-n.yaml
apiVersion: v1
kind: Namespace
metadata:
name: develop
聲明式可以更改配置文件后直接重新執(zhí)行
~]# cat develop-n.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
~]# kubectl get ns
NAME STATUS AGE
default Active 13h
develop Active 112s
kube-node-lease Active 13h
kube-public Active 13h
kube-system Active 13h
~]# kubectl apply -f develop-n.yaml
namespace/test created
~]# kubectl get ns
NAME STATUS AGE
default Active 13h
develop Active 118s
kube-node-lease Active 13h
kube-public Active 13h
kube-system Active 13h
test Active 2s</pre>
pod yaml官方寫法
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.16/#pod-v1-core
<pre data-language="plain" id="32fa4b62" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#可以查看啟動(dòng)的pod作為模板
~]# kubectl get pods ngx-dep-d554574bd-fq6kq -o yaml --export
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
apiVersion: v1 #api版本一般不變
kind: Pod #類型為Pod
metadata: #標(biāo)準(zhǔn)對(duì)象的元數(shù)據(jù)。
creationTimestamp: null #CreationTimestamp是表示創(chuàng)建此對(duì)象時(shí)服務(wù)器時(shí)間的時(shí)間戳。不能保證在單獨(dú)的操作中按事前發(fā)生的順序進(jìn)行設(shè)置。客戶可能未設(shè)置此值。它以RFC3339形式表示且采用UTC。由系統(tǒng)填充。
generateName: ngx-dep-d554574bd- #僅當(dāng)未提供“名稱”字段時(shí),GenerateName是服務(wù)器使用的可選前綴,用于生成唯一名稱。如果使用此字段,則返回給客戶端的名稱將與傳遞的名稱不同。該值還將與一個(gè)唯一的后綴結(jié)合在一起。提供的值具有與“名稱”字段相同的驗(yàn)證規(guī)則,并且可能會(huì)被截短以使該值在服務(wù)器上唯一所需的后綴長(zhǎng)度。如果指定了此字段并且生成的名稱存在,則服務(wù)器將不會(huì)返回409-而是將返回201 Created或500,且Reason ServerTimeout指示在分配的時(shí)間內(nèi)找不到唯一名稱,客戶端應(yīng)重試。
labels: #字符串鍵和值的映射,可用于組織和分類(范圍和選擇)對(duì)象。可以匹配復(fù)制控制器和Service的選擇器。
app: ngx-dep
pod-template-hash: d554574bd
ownerReferences: #該對(duì)象所依賴的對(duì)象列表。 如果已刪除列表中的所有對(duì)象,則將垃圾回收該對(duì)象。 如果此對(duì)象由控制器管理,則此列表中的條目將指向該控制器,并且控制器字段設(shè)置為true。 最多只能有一個(gè)管理控制器。
- apiVersion: apps/v1
blockOwnerDeletion: true #如果為true,并且擁有者具有“ foregroundDeletion”終結(jié)器,則只有在刪除此引用之前,才能從鍵值存儲(chǔ)中刪除擁有者。 默認(rèn)為false。 要設(shè)置此字段,用戶需要所有者的“刪除”權(quán)限,否則將返回422(不可處理實(shí)體)。
controller: true #如果為true,則此引用指向管理控制器。
kind: ReplicaSet #所指對(duì)象的種類。
name: ngx-dep-d554574bd #引用對(duì)象的名稱。
uid: eaa5bc36-c7d8-4073-b703-3ece6e58deb3 #參考對(duì)象的UID。
selfLink: /api/v1/namespaces/default/pods/ngx-dep-d554574bd-fq6kq
spec: #指定cron作業(yè)的期望行為,包括時(shí)間表。控制器期望的狀態(tài)。
containers: #屬于該容器的容器列表。 當(dāng)前無(wú)法添加或刪除容器。 容器中必須至少有一個(gè)容器。 無(wú)法更新。 - image: nginx:1.14-alpine #Docker映像名稱。
imagePullPolicy: IfNotPresent #鏡像拉動(dòng)策略。 Always,Never, IfNotPresent。 Always:永遠(yuǎn)從遠(yuǎn)端拉取最新的鏡像使用。Nerver:只從本都拉取,如果沒有就不啟動(dòng)。ifNotPresent:如果本地沒有就從遠(yuǎn)端拉取。
name: nginx #指定為DNS_LABEL的臨時(shí)容器的名稱。 該名稱在所有容器,初始化容器和臨時(shí)容器中必須唯一。
resources: {} #臨時(shí)容器不允許使用資源。 臨時(shí)容器使用已分配給容器的備用資源。
terminationMessagePath: /dev/termination-log #可選:要將容器終止消息寫入的文件的路徑安裝到容器的文件系統(tǒng)中。 編寫的消息旨在成為簡(jiǎn)短的最終狀態(tài),例如斷言失敗消息。 如果大于4096個(gè)字節(jié),將被節(jié)點(diǎn)截?cái)唷?所有容器上的總消息長(zhǎng)度將限制為12kb。 默認(rèn)為/ dev / termination-log。 無(wú)法更新。
terminationMessagePolicy: File #指示如何填充終止消息。 文件將使用TerminationMessagePath的內(nèi)容來(lái)填充成功和失敗時(shí)的容器狀態(tài)消息。 如果終止消息文件為空并且容器退出并出現(xiàn)錯(cuò)誤,F(xiàn)allbackToLogsOnError將使用容器日志輸出的最后一塊。 日志輸出限制為2048字節(jié)或80行,以較小者為準(zhǔn)。 默認(rèn)為文件。 無(wú)法更新。
volumeMounts: #Pod卷掛載到容器的文件系統(tǒng)中。 無(wú)法更新。- mountPath: /var/run/secrets/kubernetes.io/serviceaccount #容器內(nèi)應(yīng)安裝卷的路徑。 不得包含“:”。
name: default-token-9frr5 #這必須與卷名匹配。
readOnly: true #如果為true,則安裝為只讀,否則為讀寫(false或未指定)。 默認(rèn)為false。
dnsPolicy: ClusterFirst #設(shè)置Pod的DNS策略。 默認(rèn)為“ ClusterFirst”。 有效值為“ ClusterFirstWithHostNet”,“ ClusterFirst”,“默認(rèn)”或“無(wú)”。 DNSConfig中提供的DNS參數(shù)將與通過DNSPolicy選擇的策略合并。 要與hostNetwork一起設(shè)置DNS選項(xiàng),必須將DNS策略明確指定為'ClusterFirstWithHostNet'。
enableServiceLinks: true #EnableServiceLinks指示是否應(yīng)將與服務(wù)相關(guān)的信息注入到pod的環(huán)境變量中,以匹配Docker鏈接的語(yǔ)法。 可選:默認(rèn)為true。
nodeName: node1 #NodeName是將此pod調(diào)度到特定節(jié)點(diǎn)上的請(qǐng)求。 如果它是非空的,則調(diào)度程序會(huì)簡(jiǎn)單地將此Pod調(diào)度到該節(jié)點(diǎn)上,前提是它符合資源需求。
priority: 0 #優(yōu)先級(jí)值。 各種系統(tǒng)組件都使用此字段來(lái)查找窗格的優(yōu)先級(jí)。 啟用優(yōu)先錄入控制器后,它將阻止用戶設(shè)置此字段。 準(zhǔn)入控制器從PriorityClassName填充此字段。 值越高,優(yōu)先級(jí)越高。
restartPolicy: Always #重新啟動(dòng)容器中所有容器的策略。 永遠(yuǎn),失敗,永不失敗之一。 默認(rèn)為始終。
schedulerName: default-scheduler #如果指定,則將由指定的調(diào)度程序調(diào)度pod。 如果未指定,則默認(rèn)調(diào)度程序?qū)⒄{(diào)度pod。
securityContext: {} #SecurityContext擁有Pod級(jí)安全屬性和通用容器設(shè)置。 可選:默認(rèn)為空。 有關(guān)每個(gè)字段的默認(rèn)值,請(qǐng)參見類型說明。
serviceAccount: default #DeprecatedServiceAccount是ServiceAccountName的已貶值別名。 不推薦使用:改為使用serviceAccountName。
serviceAccountName: default #ServiceAccountName是用于運(yùn)行此pod的ServiceAccount的名稱。
terminationGracePeriodSeconds: 30 #Pod需要正常終止的可選持續(xù)時(shí)間(以秒為單位)。 在刪除請(qǐng)求中可能會(huì)減少。 值必須是非負(fù)整數(shù)。 零值表示立即刪除。 如果此值為nil,則將使用默認(rèn)寬限期。 寬限期是指在Pod中運(yùn)行的進(jìn)程被發(fā)送終止信號(hào)后的持續(xù)時(shí)間(以秒為單位),以及進(jìn)程被終止信號(hào)強(qiáng)制終止的時(shí)間。 將此值設(shè)置為比您的進(jìn)程的預(yù)期清除時(shí)間長(zhǎng)。 默認(rèn)為30秒。
tolerations: #如果指定,則為吊艙的公差。
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount #容器內(nèi)應(yīng)安裝卷的路徑。 不得包含“:”。
- effect: NoExecute #需要。 異味對(duì)不容許異味的豆莢的影響。 有效效果是NoSchedule,PreferNoSchedule和NoExecute。
key: node.kubernetes.io/not-ready #必須的。要應(yīng)用于使節(jié)點(diǎn)破壞的。
operator: Exists #運(yùn)算符表示鍵與值的關(guān)系。 有效運(yùn)算符為“存在”和“等于”。 默認(rèn)為相等。 存在與值的通配符等效,因此窗格可以容忍特定類別的所有污點(diǎn)。
tolerationSeconds: 300 #TolerationSeconds表示公差(該效果必須為NoExecute,否則將忽略此字段)允許污點(diǎn)的時(shí)間段。 默認(rèn)情況下,它沒有設(shè)置,這意味著永遠(yuǎn)容忍異味(不要撤離)。 零和負(fù)值將被系統(tǒng)視為0(立即退出)。 - effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes: - name: default-token-9frr5
secret:
defaultMode: 420
secretName: default-token-9frr5
status: # 計(jì)劃任務(wù)的當(dāng)前狀態(tài)。
phase: Pending #Pod的階段是Pod在其生命周期中所處位置的簡(jiǎn)單概括。條件數(shù)組,原因和消息字段以及各個(gè)容器狀態(tài)數(shù)組包含有關(guān)容器狀態(tài)的更多詳細(xì)信息。可能有五個(gè)相位值:待處理:Kubernetes系統(tǒng)已接受Pod,但尚未創(chuàng)建一個(gè)或多個(gè)容器映像。這包括計(jì)劃之前的時(shí)間以及通過網(wǎng)絡(luò)下載圖像所花費(fèi)的時(shí)間,這可能需要一段時(shí)間。運(yùn)行:吊艙已綁定到節(jié)點(diǎn),并且所有容器均已創(chuàng)建。至少一個(gè)容器仍在運(yùn)行,或者正在啟動(dòng)或重新啟動(dòng)。成功:容器中的所有容器已成功終止,并且不會(huì)重新啟動(dòng)。失敗:容器中的所有容器均已終止,并且至少一個(gè)容器因故障而終止。容器以非零狀態(tài)退出或被系統(tǒng)終止。未知:由于某種原因,無(wú)法獲得Pod的狀態(tài),通常是由于與Pod的主機(jī)通信時(shí)出錯(cuò)。
qosClass: BestEffort #根據(jù)資源需求分配給Pod的服務(wù)質(zhì)量(QOS)分類,請(qǐng)參閱PodQOSClass類型以獲取可用的QOS類。</pre>
示例
<pre data-language="plain" id="314bd789" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">~]# cat pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: pod-demo
namespace: develop
spec:
containers:
- image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
name: myapp
resources: {}
dnsPolicy: ClusterFirst
enableServiceLinks: true
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
status:
phase: Pending
qosClass: BestEffort
~]# kubectl get pods -n develop
NAME READY STATUS RESTARTS AGE
pod-demo 1/1 Running 0 89s
~]# cat pod-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:- protocol: TCP
containerPort: 80
name: http
hostPort: 8080
~]# cat pod-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: prod
spec:
containers:
- protocol: TCP
- name: myapp
image: ikubernetes/myapp:v1 - name: bbox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 86400"]
查看Pod中的定義
~]# kubectl explain Pods.spec
進(jìn)入Pod中的容器
~]# kubectl exec -it pod-demo -c nginx -n prod -- sh
查看Pod中容器日志
~]# kubectl logs pod-demo -c myapp -n prod
10.244.0.0 - - [05/Oct/2019:08:15:16 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"
10.244.0.0 - - [05/Oct/2019:08:15:31 +0000] "GET /hostname.html HTTP/1.1" 200 9 "-" "curl/7.29.0" "-"
hostNetwork: true #表示共享宿主機(jī)名稱空間,一般使用Port映射</pre>
管理Pod對(duì)象的容器
鏡像獲取策略:imagePullPolicy
定義暴露的端口:ports
自定義運(yùn)行的容器命令:command和args
環(huán)境變量:env
共享節(jié)點(diǎn)的網(wǎng)絡(luò)名稱空間:hostNetwork
安全上下文:securityContext
Pod中有一個(gè)以上容器,各容器共享網(wǎng)絡(luò)名稱空間
Node Network:與外部網(wǎng)絡(luò)接口
Service Network:鏈路層的網(wǎng)絡(luò),做路由和調(diào)度
Pod Network:Pod內(nèi)部網(wǎng)絡(luò)
Service:
NodePort:隨機(jī)映射Node端口
HostPort:
HostNetwork
標(biāo)簽(Label)
標(biāo)簽就是“鍵值”類型的數(shù)據(jù),它們可于資源創(chuàng)建時(shí)直接指定,也可隨時(shí)按需添加于活動(dòng)對(duì)象,而后即可由標(biāo)簽選擇器進(jìn)行匹配度檢查從而完成資源挑選
一個(gè)對(duì)象可擁有不止一個(gè)標(biāo)簽,而同一個(gè)標(biāo)簽也可被添加至多個(gè)資源之上
實(shí)踐中,可以為資源附加多個(gè)不同緯度的標(biāo)簽以實(shí)現(xiàn)靈活的資源分組管理功能,例如版本標(biāo)簽、環(huán)境標(biāo)簽、分層架構(gòu)標(biāo)簽等,用于交叉標(biāo)識(shí)同一個(gè)資源所屬的不同版本、環(huán)境及架構(gòu)層級(jí)等
標(biāo)簽中的鍵名稱通常由鍵前綴和鍵名組成,其中鍵前綴可選,其格式形如 "KEY-PREFIX/KEY_NAME"
鍵名至多能使用63個(gè)字符,可使用字母、數(shù)字、連接號(hào)(-)、下劃線(_)、點(diǎn)號(hào)(.)等字符,且只能以字母或數(shù)字開頭
鍵前綴必須為DNS子域名格式,且不能超過253個(gè)字符。省略鍵前綴時(shí),鍵將被視為用戶的私有數(shù)據(jù),不過由Kubernetes系統(tǒng)組件或第三方組件自動(dòng)為用戶資源添加的鍵必須使用鍵前綴,而'kubernetes.io/'前綴預(yù)留給kubernetes的核心組件使用
標(biāo)簽中的鍵值必須不能多于63個(gè)字符,它要么為空,要么是以字母或數(shù)字開頭及結(jié)尾,且僅適用字母、數(shù)字、連接號(hào)(-)、下劃線(_)、點(diǎn)號(hào)(.)等字符的數(shù)據(jù)
標(biāo)簽選擇器(Label Slector)
標(biāo)簽選擇器用于表達(dá)標(biāo)簽的查詢條件或選擇標(biāo)準(zhǔn),Kubernetes API目前支持兩個(gè)選擇器:
基于等值關(guān)系(equality—based )
操作符有 = 、== 和 != 三種,其中前兩個(gè)意義相同,都表示"等值"關(guān)系,最后一個(gè)表示"不等"關(guān)系
基于集合關(guān)系(set-based)
KEY in (VALUE 1,VALUE2,…)
KEY not in (VALUE1 ,VALUE2,…)
KEY:所有存在此鍵名標(biāo)簽的資源;
!KEY:所有不存在此鍵名標(biāo)簽的資源。
使用標(biāo)簽選擇器時(shí)還將遵循以下邏輯:
同時(shí)指定的多個(gè)選擇器之間的邏輯關(guān)系為“與"操作;
使用空值的標(biāo)簽選擇器意味著每個(gè)資源對(duì)象都將被選中;
空的標(biāo)簽選擇器將無(wú)法選出任何資源。
定義標(biāo)簽選擇器的方式
kubernetes的諸多資源對(duì)象必須以標(biāo)簽選擇器的方式關(guān)聯(lián)到Pod資源對(duì)象,例如Service、Deployment和ReplicaSet類型的資源等,它們?cè)趕pec字段中嵌套使用嵌套的"selector"字段,通過"matchLabels"來(lái)指定標(biāo)簽選擇器,有的甚至還支持使用"matchExpressions",構(gòu)造復(fù)雜的標(biāo)簽選擇機(jī)制
matchLabels:通過直接給定鍵值對(duì)指定標(biāo)簽選擇器;
matchExpressions:基于表達(dá)式指定的標(biāo)簽選擇器列表,每個(gè)選擇器形如"{key: KEY_NAME, operator: OPERATOR, values:[VALUEl,VALUE2,...]}" 選擇器列表間為"邏輯與"關(guān)系;
使用In或NotIn操作符時(shí),其values非必須為非空的字符串列表,而使用Exists 或DostNotExist時(shí),其values必須為空。
<pre data-language="plain" id="bab7e13d" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 創(chuàng)建時(shí)指定標(biāo)簽
~]# cat pod-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: prod
labels:
app: pod-demo
rel: stable
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1 - name: bbox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 86400"]
~]# kubectl apply -f pod-demo-1.yaml
~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 13s app=pod-demo,rel=stable
使用label命令來(lái)添加標(biāo)簽
~]# kubectl label pods pod-demo -n prod tier=frontend
pod/pod-demo labeled
~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 4m23s app=pod-demo,rel=stable,tier=frontend
basic]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 4m23s app=pod-demo,rel=stable,tier=frontend
使用label命令來(lái)重寫標(biāo)簽
~]# kubectl label --overwrite pods pod-demo -n prod tier=test
pod/pod-demo labeled
~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 5m47s app=pod-demo,rel=stable,tier=test
使用label命令來(lái)刪除標(biāo)簽
~]# kubectl label pods pod-demo -n prod tier-
pod/pod-demo labeled
~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 7m18s app=pod-demo,rel=stable
使用Kubectl -l 過濾標(biāo)簽
~]# kubectl get pods --show-labels -l app=myapp
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
~]# kubectl get pods --show-labels -l app!=myapp
NAME READY STATUS RESTARTS AGE LABELS
mypod 1/1 Running 0 3d5h <none>
ngx-dep-d554574bd-fq6kq 1/1 Running 0 8d app=ngx-dep,pod-template-hash=d554574bd
~]# kubectl get pods --show-labels -l "app in (myapp,ngx-dep)"
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
ngx-dep-d554574bd-fq6kq 1/1 Running 0 8d app=ngx-dep,pod-template-hash=d554574bd
~]# kubectl get pods --show-labels -l "app notin (ngx-dep)"
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
mypod 1/1 Running 0 3d5h <none>
~]# kubectl get pods --show-labels -l '!app'
NAME READY STATUS RESTARTS AGE LABELS
mypod 1/1 Running 0 3d5h <none>
~]# kubectl get pods --show-labels -l 'app'
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
ngx-dep-d554574bd-fq6kq 1/1 Running 0 8d app=ngx-dep,pod-template-hash=d554574bd</pre>
資源注解(annotation)
注解也是“鍵值”類型的數(shù)據(jù),不過它不能用于標(biāo)簽及挑選kubernetes對(duì)象,僅用于為資源提供“元數(shù)據(jù)"信息
注解中的元數(shù)據(jù)不受字符數(shù)量的限制,它可大可小,可以為結(jié)構(gòu)化或非結(jié)構(gòu)化形式,也支持使用在標(biāo)簽中禁止使用的其他字符
在kubernetes的新版本中(Alpha或Beta階段)為某資源引入新字段時(shí), 常以注解方式提供以避免其增刪等變動(dòng)給用戶帶去困擾,一旦確定支持使用它們,這些新增字段再引入到資源中并淘汰相關(guān)的注解
<pre data-language="plain" id="2d7865e9" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 添加及查看注解,apply就是通過比較注解來(lái)添加新的資源
~]# cat pod-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: prod
labels:
app: pod-demo
rel: stable
annotations:
ik8s.io/project: test-info
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1 - name: bbox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 86400"]
~]# kubectl apply -f pod-demo-1.yaml
~]# kubectl describe pods -n prod pod-demo
Name: pod-demo
Namespace: prod
Priority: 0
Node: node2/10.8.250.21
Start Time: Tue, 08 Oct 2019 22:01:55 +0800
Labels: app=pod-demo
rel=stable
Annotations: ik8s.io/project: test-info
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"ik8s.io/project":"test-info"},"labels":{"app":"pod-demo","rel":"stable"},"name...
Status: Running
IP: 10.244.3.6</pre>
Pod的生命周期
第一階段:init container
第二階段:main container
第一階段:post start hook(容器啟動(dòng)前的自定義操作)
第二階段:livenessProbe、readinessProbe(存活及就緒檢測(cè))
第三階段:pre stop hook(容器停止前的自定義操作)
livenessProbe(健康狀態(tài)監(jiān)測(cè)可以重啟容器)
readinessProbe(就緒狀態(tài)監(jiān)測(cè)不可以重啟容器)
<pre data-language="plain" id="51dc924a" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># lifecycle具體使用查看使用方法
~]# kubectl explain pods.spec.containers.lifecycle
hook的使用示例
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"]</pre>
<pre data-language="plain" id="ceb73371" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># livenessProbe健康狀態(tài)監(jiān)測(cè)具體使用查看使用方法
~]# kubectl explain pods.spec.containers.livenessProbe
livenessProbe使用示例
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- args:
- /server
image: k8s.gcr.io/liveness
ports:- name: http
containerPort: 80
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- 'echo Healthy > /usr/share/nginx/html/healthz'
livenessProbe:
httpGet:當(dāng)沒有定義 "host" 時(shí),使用 "PodIP"
host: my-host
當(dāng)沒有定義 "scheme" 時(shí),使用 "HTTP" scheme 只允許 "HTTP" 和 "HTTPS"
scheme: HTTPS
path: /healthz
port: 8080
httpHeaders:- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 15
timeoutSeconds: 1
name: liveness</pre>
- name: X-Custom-Header
- name: http
- /server
<pre data-language="plain" id="bcf59432" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># readinessProbe就緒狀態(tài)監(jiān)測(cè)具體使用查看使用方法
~]# kubectl explain pods.spec.containers.readinessProbe
readinessProbe示例
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- args:
- /server
image: k8s.gcr.io/liveness
readinessProbe:
exec:
command: ["test","-e","/tmp/ready"]
initalDelaySeconds: 5
name: liveness
- /server
主要體現(xiàn)在READY狀態(tài)上,就緒監(jiān)測(cè)同樣為周期監(jiān)測(cè)。只要為0就不會(huì)被service所引用。
~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
myapp-5c6976696c-7p7dp 0/1 Running 0 9d</pre>
Pod對(duì)象的相位
Pod對(duì)象總是應(yīng)該處于其生命進(jìn)程中以下幾個(gè)相位(phase)之一
Pending: API Server創(chuàng)建了Pod資源對(duì)象并已存入etcd中,但它尚未被調(diào)度完成,或仍處于從倉(cāng)庫(kù)中下載鏡像的過程中;
Running: Pod已經(jīng)被調(diào)度至某節(jié)點(diǎn),并且所有容器都已經(jīng)被kubelet創(chuàng)建完成;
Succeeded: Pod中的所有容器都已經(jīng)成功終止并且不會(huì)被重啟;
Failed:所有容器都已經(jīng)終止,但至少有一個(gè)容器終止失敗,即容器返回了非0值的退出狀態(tài)或已經(jīng)被系統(tǒng)終止;
Unknown: API Server無(wú)法正常獲取到Pod對(duì)象的狀態(tài)信息,通常是由于其無(wú)法與所在工作節(jié)點(diǎn)的kubelet?信所致。
Pod對(duì)象的創(chuàng)建過程
容1
Pod對(duì)象因容器程序崩潰或容器申請(qǐng)超出限制的資源等原因都可能導(dǎo)致其被終止,此時(shí)是否應(yīng)該重建此它則取決于其重啟策略(restartPolicy)屬性的定義
Always:但凡Pod對(duì)象終止就將其重啟,此為默認(rèn)設(shè)定;
OnFailure:僅在Pod對(duì)象出現(xiàn)錯(cuò)誤時(shí)方才將其重啟;
Never:從不重啟;
Pod的終止過程
Pod Security安全
兩個(gè)級(jí)別
pods.spec.securityContext
pods.spec.containers.[].securityContext
capabilities #添加刪除內(nèi)核能力
<pre data-language="plain" id="f03c6481" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers: - name: sec-ctx-demo
image: busybox
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
- name: sec-ctx-vol
在配置文件中,該runAsUser字段指定對(duì)于Pod中的任何容器,所有進(jìn)程都以用戶ID 1000運(yùn)行。
該runAsGroup字段為Pod中的任何容器中的所有進(jìn)程指定主組ID 3000。如果省略此字段,則容器的主要組ID將為root(0)。
runAsGroup指定時(shí),用戶1000和組3000也將擁有所有創(chuàng)建的文件。由于fsGroup指定了字段,因此容器的所有進(jìn)程也是補(bǔ)充組ID 2000的一部分。
卷的所有者/data/demo和在該卷中創(chuàng)建的任何文件都將是組ID 2000。</pre>
資源需求及資源限制
容器的計(jì)算資源配額
CPU屬于可壓縮(compressible)型資源,即資源額度可按需收縮,而內(nèi)存(當(dāng)前)則是不可壓縮型資源,對(duì)其執(zhí)行收縮操作可能會(huì)導(dǎo)致某種程度的問題
CPU資源的計(jì)量方式
一個(gè)核心相當(dāng)于1000個(gè)微核心,即1=1000m,0.5=500m
內(nèi)存資源的計(jì)量方式
-
默認(rèn)單位為字節(jié),也可以使用E、P、T、G、M和K后綴單位,或Ei、Pi、Ti、Gi、Mi和Ki形式的單位后綴 image
<pre data-language="plain" id="be3a36f2" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#以下 Pod 有兩個(gè)容器。每個(gè)容器的請(qǐng)求為 0.25 cpu 和 64MiB(226 字節(jié))內(nèi)存,每個(gè)容器的限制為 0.5 cpu 和 128MiB 內(nèi)存。
你可以認(rèn)為該 Pod 請(qǐng)求 0.5 cpu 和 128 MiB 的內(nèi)存,限制為 1 cpu 和 256MiB 的內(nèi)存。
requests:下限,不滿足則不啟動(dòng)。limits:上限
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql
env:- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: MYSQL_ROOT_PASSWORD
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"</pre>
Pod服務(wù)質(zhì)量類別
根據(jù)Pod對(duì)象的requests和llimits屬性, Kubernetes把Pod對(duì)象歸類到BestEffort、 Burstable和Guaranteed三個(gè)服務(wù)質(zhì)量類別(Quality of Service,QoS)類別下
Guaranteed:每個(gè)容器都為CPU資源設(shè)置了具有相同值的requests和limits屬性, 以及每個(gè)容器都為內(nèi)存資源設(shè)置了具有相同值的requests和limits屬性的pod資源會(huì)自動(dòng)歸屬此類別,這類pod資源具有最高優(yōu)先級(jí)
Burstable: 至少有一個(gè)容器設(shè)置了CPU或內(nèi)存資源的requests屬性,但不滿足Guaranteed類別要求的pod資源自動(dòng)歸屬此類別,它們具有中等優(yōu)先級(jí)
BestEffort:未為任何一個(gè)容器設(shè)置requests或limits屬性的pod資源自動(dòng)歸屬此類別,它們的優(yōu)先級(jí)為最低級(jí)別
<pre data-language="plain" id="039e6e76" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#在Qos中顯示
~]# kubectl describe pods mypod
...
QoS Class: BestEffort
Node-Selectors: <none>
...</pre>
Pod Controller
Pod就是一種資源,資源代表一種類型
創(chuàng)建出來(lái)的具體的Pod就是對(duì)象,對(duì)象代表一種實(shí)力
在機(jī)器人技術(shù)和自動(dòng)化應(yīng)用中,控制回路是調(diào)節(jié)系統(tǒng)狀態(tài)的非終止回路。
在Kubernetes中,控制器是一個(gè)控制回路,它通過API服務(wù)器監(jiān)視集群的共享狀態(tài),并進(jìn)行更改,試圖將當(dāng)前狀態(tài)移動(dòng)到所需狀態(tài)。
Kubernetes運(yùn)行一組控制器,負(fù)責(zé)日常任務(wù),以確保集群的期望狀態(tài)與觀察到的狀態(tài)匹配。
基本上,每個(gè)控制器負(fù)責(zé)Kubernetes世界的特定資源。
對(duì)于用戶管理其集群,重要的是用戶了解Kubernetes中每個(gè)控制器的角色。
控制器是Kubernetes的重要組成部分
他們是資源背后的“大腦”。
例如,Kubernetes的部署資源負(fù)責(zé)確保有一定數(shù)量的pod在運(yùn)行,節(jié)點(diǎn)控制器查找服務(wù)器的狀態(tài),并在服務(wù)器停機(jī)時(shí)做出響應(yīng)
- Informer/SharedInformer監(jiān)視Kubernetes對(duì)象的當(dāng)前狀態(tài)的更改,并將事件發(fā)送到Workqueue,然后由worker彈出事件進(jìn)行處理。
kube-controller-manager
為了減少?gòu)?fù)雜性,所有控制器都封裝在一個(gè)名為Kube -Manager管理器的守護(hù)程序中。
Kubernetes控制器管理器是一個(gè)守護(hù)進(jìn)程,它嵌入了K ubernetes附帶的核心控制循環(huán)。
--controllers選項(xiàng)用于指定要啟用的控制器
"*"在默認(rèn)情況下啟用所有控制器,"foo"啟用名為"foo"的控制器,"--foo"禁用名為"foo"的控制器。
所有控制器: attachdetach, bootstrapsigner, clusterrole aggregation, cronjob, csrapproving,csrcleaner, csrsigning, daemonset, deployment, disruption, endpoint, garbagecollector,horizontalpodautoscaling, job, namespace, nodeipam, nodelifecycle, persistentvolume一binder,persistentvolume expander, podgc, pv- protection, pvc- protection, replicaset, replicationcontroller,resourcequota, route, service, serviceaccount, serviceaccount token, statefulset, tokencleaner, ttl
默認(rèn)禁用控制器:bootstrapsigner、tokencleaner
kube-controller-manager
控制器本身也是標(biāo)準(zhǔn)得Kubernetes資源類型,它們可以被實(shí)例化出具體的對(duì)象負(fù)責(zé)具體任務(wù);控制器資源對(duì)象自身也會(huì)存在相應(yīng)的管理操作;
例如一個(gè)特定的Deployment控制器對(duì)象負(fù)責(zé)管理由標(biāo)簽選擇器匹配到得Pod資源對(duì)象;
控制器資源對(duì)象自身的創(chuàng)建、更新及刪除操作由控制器進(jìn)程負(fù)責(zé),這些進(jìn)程統(tǒng)一打包了kube-controller-manager之中;
而kube-controller-manager自身的運(yùn)行正常與否的狀況則需要通過冗余的方式設(shè)置;
<pre data-language="plain" id="5ec7e5f0" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#更改kube-controller-manager的yaml位置,更改后k8s會(huì)自動(dòng)識(shí)別并重新啟動(dòng)kube-controller-manager
/etc/kubernetes/manifests/kube-controller-manager.yaml</pre>
Pod Controllers
自助式Pod
Node: kubelet
早期版本: ReplicationController
應(yīng)用程序可劃分為多種類型:
守護(hù)進(jìn)程型:
無(wú)狀態(tài):
非系統(tǒng)級(jí):Deployment,ReplicaSet
系統(tǒng)級(jí):DaemonSet(比如監(jiān)控)
有狀態(tài): StatefulSet
非守護(hù)進(jìn)程型:
Job
CronJob
ReplicaSet
復(fù)制集
Label Selector
Label
ReplicaSet
ReplicaSet 確保在任何指定時(shí)間運(yùn)行指定數(shù)量的Pod副本。
Pod 規(guī)格
Pod 模板
Pod 選擇器
副本集
使用ReplicaSets
刪除 ReplicaSets 及其 Pod
僅刪除一個(gè)ReplicaSet
從 ReplicaSet 隔離Pod
縮放 ReplicaSet
<pre data-language="plain" id="t20sr" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">kubectl explain rs
kubectl api-versions
matchLabels 和 template 的 labels 必須匹配
標(biāo)簽選擇器一旦選中,必須刪除控制器才能更改
root@k8s-master:/data/k8s-learn# cat rs-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs
namespace: prod
spec:
replicas: 2
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
通過修改pod的標(biāo)簽也會(huì)對(duì)副本數(shù)量產(chǎn)生影響,只認(rèn)標(biāo)簽
kubectl label --overwrite pod myapp-rs-p92pg -n prod app=test
查看標(biāo)簽
kubectl get pods -n prod --show-labels
主要使用 Deployment ,Deployment 會(huì)自動(dòng)創(chuàng)建 ReplicaSet 且名稱最后帶模板哈希
maxSurge為最多允許多出的pod數(shù)量,maxUnavailable為最多不可用pod數(shù)量
比如當(dāng)前副本集為4,對(duì)多可多出1,先加1個(gè),當(dāng)前副本集為5,最多不可用為1(這里是以加上maxSurge后的副本數(shù)5為基準(zhǔn))
所以這里是加1,減1,加1,減1
root@k8s-master:/data/k8s-learn# cat de-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: prod
spec:
replicas: 4
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
selector:
matchLabels:
app: myapp-ng
environment: production
template:
metadata:
labels:
app: myapp-ng
environment: production
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
readinessProbe:
periodSeconds: 1
httpGet:
path: /
port: http
root@k8s-master:/data/k8s-learn# kubectl apply -f de-example.yaml --record=true
deployment.apps/myapp created
root@k8s-master:/data/k8s-learn# kubectl get rs -n prod
NAME DESIRED CURRENT READY AGE
myapp-b97bcbcc9 4 4 4 7s
root@k8s-master:/data/k8s-learn# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-b97bcbcc9-k4d7w 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9
myapp-b97bcbcc9-qk5xk 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9
myapp-b97bcbcc9-stz5b 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9
myapp-b97bcbcc9-xxwcq 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9
查看回滾歷史
root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -n prod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl apply --filename=de-example.yaml --record=tru
回滾,默認(rèn)向前回滾1
root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -nprod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl apply --filename=de-example.yaml --record=true
--to-revision=0: The revision to rollback to. Default to 0 (last revision).
root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -n prod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl apply --filename=de-example.yaml --record=true
root@k8s-master:/data/k8s-learn# kubectl rollout status deployment/myapp -n prod
deployment "myapp" successfully rolled out
root@k8s-master:/data/k8s-learn# kubectl rollout undo deployment/myapp -n prod
deployment.apps/myapp rolled back
root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -n prod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
3 kubectl apply --filename=de-example.yaml --record=true
4 <none>
</pre>