K8S資源配置清單1

  • API server 接受和返回的所有 JSON 對象都遵循同一個模式,它們都具有 "kind" 和 "apiVersion" 字段,用于標識對象所屬的資源類型、API 的群組及相關(guān)版本

  • 大多數(shù)的對象或列表類型的資源還需要具有三個嵌套型的字段 metadata、spec 和 status

  • metadata 字段為資源提供元數(shù)據(jù)信息,例如名稱、隸屬的名稱空間和標簽等

  • spec 用于定義用戶期望的狀態(tài),不同的資源類型,其狀態(tài)的意義各有不同,例如 Pod 資源最為核心的功能在于運行容器;

  • status 則記錄著活動獨享的當前狀態(tài)信息,它由 Kubernetes 系統(tǒng)自行維護,對用戶來說為只讀字段;

  • "kubectl api-resources" 命令可以獲取集群支持使用的所有資源類型

image
image
image
image

<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">#使用陳述式對象配置

創(chuàng)建一個名稱空間

~]# kubectl create -f develop-n.yaml
namespace/develop created
~]# cat develop-n.yaml
apiVersion: v1
kind: Namespace
metadata:
name: develop

使用聲明式對象配置

創(chuàng)建一個名稱空間

~]# 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">#可以查看啟動的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: #標準對象的元數(shù)據(jù)。
creationTimestamp: null #CreationTimestamp是表示創(chuàng)建此對象時服務(wù)器時間的時間戳。不能保證在單獨的操作中按事前發(fā)生的順序進行設(shè)置??蛻艨赡芪丛O(shè)置此值。它以RFC3339形式表示且采用UTC。由系統(tǒng)填充。
generateName: ngx-dep-d554574bd- #僅當未提供“名稱”字段時,GenerateName是服務(wù)器使用的可選前綴,用于生成唯一名稱。如果使用此字段,則返回給客戶端的名稱將與傳遞的名稱不同。該值還將與一個唯一的后綴結(jié)合在一起。提供的值具有與“名稱”字段相同的驗證規(guī)則,并且可能會被截短以使該值在服務(wù)器上唯一所需的后綴長度。如果指定了此字段并且生成的名稱存在,則服務(wù)器將不會返回409-而是將返回201 Created或500,且Reason ServerTimeout指示在分配的時間內(nèi)找不到唯一名稱,客戶端應(yīng)重試。
labels: #字符串鍵和值的映射,可用于組織和分類(范圍和選擇)對象??梢云ヅ鋸椭瓶刂破骱蚐ervice的選擇器。
app: ngx-dep
pod-template-hash: d554574bd
ownerReferences: #該對象所依賴的對象列表。 如果已刪除列表中的所有對象,則將垃圾回收該對象。 如果此對象由控制器管理,則此列表中的條目將指向該控制器,并且控制器字段設(shè)置為true。 最多只能有一個管理控制器。

  • apiVersion: apps/v1
    blockOwnerDeletion: true #如果為true,并且擁有者具有“ foregroundDeletion”終結(jié)器,則只有在刪除此引用之前,才能從鍵值存儲中刪除擁有者。 默認為false。 要設(shè)置此字段,用戶需要所有者的“刪除”權(quán)限,否則將返回422(不可處理實體)。
    controller: true #如果為true,則此引用指向管理控制器。
    kind: ReplicaSet #所指對象的種類。
    name: ngx-dep-d554574bd #引用對象的名稱。
    uid: eaa5bc36-c7d8-4073-b703-3ece6e58deb3 #參考對象的UID。
    selfLink: /api/v1/namespaces/default/pods/ngx-dep-d554574bd-fq6kq
    spec: #指定cron作業(yè)的期望行為,包括時間表??刂破髌谕臓顟B(tài)。
    containers: #屬于該容器的容器列表。 當前無法添加或刪除容器。 容器中必須至少有一個容器。 無法更新。
  • image: nginx:1.14-alpine #Docker映像名稱。
    imagePullPolicy: IfNotPresent #鏡像拉動策略。 Always,Never, IfNotPresent。 Always:永遠從遠端拉取最新的鏡像使用。Nerver:只從本都拉取,如果沒有就不啟動。ifNotPresent:如果本地沒有就從遠端拉取。
    name: nginx #指定為DNS_LABEL的臨時容器的名稱。 該名稱在所有容器,初始化容器和臨時容器中必須唯一。
    resources: {} #臨時容器不允許使用資源。 臨時容器使用已分配給容器的備用資源。
    terminationMessagePath: /dev/termination-log #可選:要將容器終止消息寫入的文件的路徑安裝到容器的文件系統(tǒng)中。 編寫的消息旨在成為簡短的最終狀態(tài),例如斷言失敗消息。 如果大于4096個字節(jié),將被節(jié)點截斷。 所有容器上的總消息長度將限制為12kb。 默認為/ dev / termination-log。 無法更新。
    terminationMessagePolicy: File #指示如何填充終止消息。 文件將使用TerminationMessagePath的內(nèi)容來填充成功和失敗時的容器狀態(tài)消息。 如果終止消息文件為空并且容器退出并出現(xiàn)錯誤,F(xiàn)allbackToLogsOnError將使用容器日志輸出的最后一塊。 日志輸出限制為2048字節(jié)或80行,以較小者為準。 默認為文件。 無法更新。
    volumeMounts: #Pod卷掛載到容器的文件系統(tǒng)中。 無法更新。
    • mountPath: /var/run/secrets/kubernetes.io/serviceaccount #容器內(nèi)應(yīng)安裝卷的路徑。 不得包含“:”。
      name: default-token-9frr5 #這必須與卷名匹配。
      readOnly: true #如果為true,則安裝為只讀,否則為讀寫(false或未指定)。 默認為false。
      dnsPolicy: ClusterFirst #設(shè)置Pod的DNS策略。 默認為“ ClusterFirst”。 有效值為“ ClusterFirstWithHostNet”,“ ClusterFirst”,“默認”或“無”。 DNSConfig中提供的DNS參數(shù)將與通過DNSPolicy選擇的策略合并。 要與hostNetwork一起設(shè)置DNS選項,必須將DNS策略明確指定為'ClusterFirstWithHostNet'。
      enableServiceLinks: true #EnableServiceLinks指示是否應(yīng)將與服務(wù)相關(guān)的信息注入到pod的環(huán)境變量中,以匹配Docker鏈接的語法。 可選:默認為true。
      nodeName: node1 #NodeName是將此pod調(diào)度到特定節(jié)點上的請求。 如果它是非空的,則調(diào)度程序會簡單地將此Pod調(diào)度到該節(jié)點上,前提是它符合資源需求。
      priority: 0 #優(yōu)先級值。 各種系統(tǒng)組件都使用此字段來查找窗格的優(yōu)先級。 啟用優(yōu)先錄入控制器后,它將阻止用戶設(shè)置此字段。 準入控制器從PriorityClassName填充此字段。 值越高,優(yōu)先級越高。
      restartPolicy: Always #重新啟動容器中所有容器的策略。 永遠,失敗,永不失敗之一。 默認為始終。
      schedulerName: default-scheduler #如果指定,則將由指定的調(diào)度程序調(diào)度pod。 如果未指定,則默認調(diào)度程序?qū)⒄{(diào)度pod。
      securityContext: {} #SecurityContext擁有Pod級安全屬性和通用容器設(shè)置。 可選:默認為空。 有關(guān)每個字段的默認值,請參見類型說明。
      serviceAccount: default #DeprecatedServiceAccount是ServiceAccountName的已貶值別名。 不推薦使用:改為使用serviceAccountName。
      serviceAccountName: default #ServiceAccountName是用于運行此pod的ServiceAccount的名稱。
      terminationGracePeriodSeconds: 30 #Pod需要正常終止的可選持續(xù)時間(以秒為單位)。 在刪除請求中可能會減少。 值必須是非負整數(shù)。 零值表示立即刪除。 如果此值為nil,則將使用默認寬限期。 寬限期是指在Pod中運行的進程被發(fā)送終止信號后的持續(xù)時間(以秒為單位),以及進程被終止信號強制終止的時間。 將此值設(shè)置為比您的進程的預期清除時間長。 默認為30秒。
      tolerations: #如果指定,則為吊艙的公差。
  • effect: NoExecute #需要。 異味對不容許異味的豆莢的影響。 有效效果是NoSchedule,PreferNoSchedule和NoExecute。
    key: node.kubernetes.io/not-ready #必須的。要應(yīng)用于使節(jié)點破壞的。
    operator: Exists #運算符表示鍵與值的關(guān)系。 有效運算符為“存在”和“等于”。 默認為相等。 存在與值的通配符等效,因此窗格可以容忍特定類別的所有污點。
    tolerationSeconds: 300 #TolerationSeconds表示公差(該效果必須為NoExecute,否則將忽略此字段)允許污點的時間段。 默認情況下,它沒有設(shè)置,這意味著永遠容忍異味(不要撤離)。 零和負值將被系統(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: # 計劃任務(wù)的當前狀態(tài)。
    phase: Pending #Pod的階段是Pod在其生命周期中所處位置的簡單概括。條件數(shù)組,原因和消息字段以及各個容器狀態(tài)數(shù)組包含有關(guān)容器狀態(tài)的更多詳細信息。可能有五個相位值:待處理:Kubernetes系統(tǒng)已接受Pod,但尚未創(chuàng)建一個或多個容器映像。這包括計劃之前的時間以及通過網(wǎng)絡(luò)下載圖像所花費的時間,這可能需要一段時間。運行:吊艙已綁定到節(jié)點,并且所有容器均已創(chuàng)建。至少一個容器仍在運行,或者正在啟動或重新啟動。成功:容器中的所有容器已成功終止,并且不會重新啟動。失?。喝萜髦械乃腥萜骶呀K止,并且至少一個容器因故障而終止。容器以非零狀態(tài)退出或被系統(tǒng)終止。未知:由于某種原因,無法獲得Pod的狀態(tài),通常是由于與Pod的主機通信時出錯。
    qosClass: BestEffort #根據(jù)資源需求分配給Pod的服務(wù)質(zhì)量(QOS)分類,請參閱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:
  • name: myapp
    image: ikubernetes/myapp:v1
  • name: bbox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","sleep 86400"]

查看Pod中的定義

~]# kubectl explain Pods.spec

進入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 #表示共享宿主機名稱空間,一般使用Port映射</pre>

管理Pod對象的容器

  • 鏡像獲取策略:imagePullPolicy

  • 定義暴露的端口:ports

  • 自定義運行的容器命令:command和args

  • 環(huán)境變量:env

  • 共享節(jié)點的網(wǎng)絡(luò)名稱空間:hostNetwork

  • 安全上下文:securityContext

  • Pod中有一個以上容器,各容器共享網(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:隨機映射Node端口

  • HostPort:

  • HostNetwork

標簽(Label)

  • 標簽就是“鍵值”類型的數(shù)據(jù),它們可于資源創(chuàng)建時直接指定,也可隨時按需添加于活動對象,而后即可由標簽選擇器進行匹配度檢查從而完成資源挑選

  • 一個對象可擁有不止一個標簽,而同一個標簽也可被添加至多個資源之上

  • 實踐中,可以為資源附加多個不同緯度的標簽以實現(xiàn)靈活的資源分組管理功能,例如版本標簽、環(huán)境標簽、分層架構(gòu)標簽等,用于交叉標識同一個資源所屬的不同版本、環(huán)境及架構(gòu)層級等

  • 標簽中的鍵名稱通常由鍵前綴和鍵名組成,其中鍵前綴可選,其格式形如 "KEY-PREFIX/KEY_NAME"

  • 鍵名至多能使用63個字符,可使用字母、數(shù)字、連接號(-)、下劃線(_)、點號(.)等字符,且只能以字母或數(shù)字開頭

  • 鍵前綴必須為DNS子域名格式,且不能超過253個字符。省略鍵前綴時,鍵將被視為用戶的私有數(shù)據(jù),不過由Kubernetes系統(tǒng)組件或第三方組件自動為用戶資源添加的鍵必須使用鍵前綴,而'kubernetes.io/'前綴預留給kubernetes的核心組件使用

  • 標簽中的鍵值必須不能多于63個字符,它要么為空,要么是以字母或數(shù)字開頭及結(jié)尾,且僅適用字母、數(shù)字、連接號(-)、下劃線(_)、點號(.)等字符的數(shù)據(jù)

image

標簽選擇器(Label Slector)

  • 標簽選擇器用于表達標簽的查詢條件或選擇標準,Kubernetes API目前支持兩個選擇器:

  • 基于等值關(guān)系(equality—based )

  • 操作符有 = 、== 和 != 三種,其中前兩個意義相同,都表示"等值"關(guān)系,最后一個表示"不等"關(guān)系

  • 基于集合關(guān)系(set-based)

  • KEY in (VALUE 1,VALUE2,…)

  • KEY not in (VALUE1 ,VALUE2,…)

  • KEY:所有存在此鍵名標簽的資源;

  • !KEY:所有不存在此鍵名標簽的資源。

  • 使用標簽選擇器時還將遵循以下邏輯:

  • 同時指定的多個選擇器之間的邏輯關(guān)系為“與"操作;

  • 使用空值的標簽選擇器意味著每個資源對象都將被選中;

  • 空的標簽選擇器將無法選出任何資源。

定義標簽選擇器的方式

  • kubernetes的諸多資源對象必須以標簽選擇器的方式關(guān)聯(lián)到Pod資源對象,例如Service、Deployment和ReplicaSet類型的資源等,它們在spec字段中嵌套使用嵌套的"selector"字段,通過"matchLabels"來指定標簽選擇器,有的甚至還支持使用"matchExpressions",構(gòu)造復雜的標簽選擇機制

  • matchLabels:通過直接給定鍵值對指定標簽選擇器;

  • matchExpressions:基于表達式指定的標簽選擇器列表,每個選擇器形如"{key: KEY_NAME, operator: OPERATOR, values:[VALUEl,VALUE2,...]}" 選擇器列表間為"邏輯與"關(guān)系;

  • 使用In或NotIn操作符時,其values非必須為非空的字符串列表,而使用Exists 或DostNotExist時,其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)建時指定標簽
~]# 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命令來添加標簽

~]# 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命令來重寫標簽

~]# 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命令來刪除標簽

~]# 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 過濾標簽

~]# 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ù),不過它不能用于標簽及挑選kubernetes對象,僅用于為資源提供“元數(shù)據(jù)"信息

  • 注解中的元數(shù)據(jù)不受字符數(shù)量的限制,它可大可小,可以為結(jié)構(gòu)化或非結(jié)構(gòu)化形式,也支持使用在標簽中禁止使用的其他字符

  • 在kubernetes的新版本中(Alpha或Beta階段)為某資源引入新字段時, 常以注解方式提供以避免其增刪等變動給用戶帶去困擾,一旦確定支持使用它們,這些新增字段再引入到資源中并淘汰相關(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就是通過比較注解來添加新的資源
~]# 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(容器啟動前的自定義操作)

  • 第二階段:livenessProbe、readinessProbe(存活及就緒檢測)

  • 第三階段:pre stop hook(容器停止前的自定義操作)

livenessProbe(健康狀態(tài)監(jiān)測可以重啟容器)

readinessProbe(就緒狀態(tài)監(jiān)測不可以重啟容器)

<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)測具體使用查看使用方法
~]# 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:

        當沒有定義 "host" 時,使用 "PodIP"

        host: my-host

        當沒有定義 "scheme" 時,使用 "HTTP" scheme 只允許 "HTTP" 和 "HTTPS"

        scheme: HTTPS

        path: /healthz
        port: 8080
        httpHeaders:
        • name: X-Custom-Header
          value: Awesome
          initialDelaySeconds: 15
          timeoutSeconds: 1
          name: liveness</pre>

<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)測具體使用查看使用方法
~]# 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

主要體現(xiàn)在READY狀態(tài)上,就緒監(jiān)測同樣為周期監(jiān)測。只要為0就不會被service所引用。

~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
myapp-5c6976696c-7p7dp 0/1 Running 0 9d</pre>

Pod對象的相位

  • Pod對象總是應(yīng)該處于其生命進程中以下幾個相位(phase)之一

  • Pending: API Server創(chuàng)建了Pod資源對象并已存入etcd中,但它尚未被調(diào)度完成,或仍處于從倉庫中下載鏡像的過程中;

  • Running: Pod已經(jīng)被調(diào)度至某節(jié)點,并且所有容器都已經(jīng)被kubelet創(chuàng)建完成;

  • Succeeded: Pod中的所有容器都已經(jīng)成功終止并且不會被重啟;

  • Failed:所有容器都已經(jīng)終止,但至少有一個容器終止失敗,即容器返回了非0值的退出狀態(tài)或已經(jīng)被系統(tǒng)終止;

  • Unknown: API Server無法正常獲取到Pod對象的狀態(tài)信息,通常是由于其無法與所在工作節(jié)點的kubelet?信所致。

Pod對象的創(chuàng)建過程

image

容1

  • Pod對象因容器程序崩潰或容器申請超出限制的資源等原因都可能導致其被終止,此時是否應(yīng)該重建此它則取決于其重啟策略(restartPolicy)屬性的定義

  • Always:但凡Pod對象終止就將其重啟,此為默認設(shè)定;

  • OnFailure:僅在Pod對象出現(xiàn)錯誤時方才將其重啟;

  • Never:從不重啟;

Pod的終止過程

image

Pod Security安全

  • 兩個級別

  • 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

在配置文件中,該runAsUser字段指定對于Pod中的任何容器,所有進程都以用戶ID 1000運行。

該runAsGroup字段為Pod中的任何容器中的所有進程指定主組ID 3000。如果省略此字段,則容器的主要組ID將為root(0)。

runAsGroup指定時,用戶1000和組3000也將擁有所有創(chuàng)建的文件。由于fsGroup指定了字段,因此容器的所有進程也是補充組ID 2000的一部分。

卷的所有者/data/demo和在該卷中創(chuàng)建的任何文件都將是組ID 2000。</pre>

資源需求及資源限制

  • 容器的計算資源配額

  • CPU屬于可壓縮(compressible)型資源,即資源額度可按需收縮,而內(nèi)存(當前)則是不可壓縮型資源,對其執(zhí)行收縮操作可能會導致某種程度的問題

  • CPU資源的計量方式

  • 一個核心相當于1000個微核心,即1=1000m,0.5=500m

  • 內(nèi)存資源的計量方式

  • 默認單位為字節(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 有兩個容器。每個容器的請求為 0.25 cpu 和 64MiB(226 字節(jié))內(nèi)存,每個容器的限制為 0.5 cpu 和 128MiB 內(nèi)存。

你可以認為該 Pod 請求 0.5 cpu 和 128 MiB 的內(nèi)存,限制為 1 cpu 和 256MiB 的內(nèi)存。

requests:下限,不滿足則不啟動。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: wp
    image: wordpress
    resources:
    requests:
    memory: "64Mi"
    cpu: "250m"
    limits:
    memory: "128Mi"
    cpu: "500m"</pre>

Pod服務(wù)質(zhì)量類別

  • 根據(jù)Pod對象的requests和llimits屬性, Kubernetes把Pod對象歸類到BestEffort、 Burstable和Guaranteed三個服務(wù)質(zhì)量類別(Quality of Service,QoS)類別下

  • Guaranteed:每個容器都為CPU資源設(shè)置了具有相同值的requests和limits屬性, 以及每個容器都為內(nèi)存資源設(shè)置了具有相同值的requests和limits屬性的pod資源會自動歸屬此類別,這類pod資源具有最高優(yōu)先級

  • Burstable: 至少有一個容器設(shè)置了CPU或內(nèi)存資源的requests屬性,但不滿足Guaranteed類別要求的pod資源自動歸屬此類別,它們具有中等優(yōu)先級

  • BestEffort:未為任何一個容器設(shè)置requests或limits屬性的pod資源自動歸屬此類別,它們的優(yōu)先級為最低級別

<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)建出來的具體的Pod就是對象,對象代表一種實力

  • 在機器人技術(shù)和自動化應(yīng)用中,控制回路是調(diào)節(jié)系統(tǒng)狀態(tài)的非終止回路。

  • 在Kubernetes中,控制器是一個控制回路,它通過API服務(wù)器監(jiān)視集群的共享狀態(tài),并進行更改,試圖將當前狀態(tài)移動到所需狀態(tài)。

  • Kubernetes運行一組控制器,負責日常任務(wù),以確保集群的期望狀態(tài)與觀察到的狀態(tài)匹配。

  • 基本上,每個控制器負責Kubernetes世界的特定資源。

  • 對于用戶管理其集群,重要的是用戶了解Kubernetes中每個控制器的角色。


  • 控制器是Kubernetes的重要組成部分

  • 他們是資源背后的“大腦”。

  • 例如,Kubernetes的部署資源負責確保有一定數(shù)量的pod在運行,節(jié)點控制器查找服務(wù)器的狀態(tài),并在服務(wù)器停機時做出響應(yīng)

image

  • Informer/SharedInformer監(jiān)視Kubernetes對象的當前狀態(tài)的更改,并將事件發(fā)送到Workqueue,然后由worker彈出事件進行處理。
image

kube-controller-manager

  • 為了減少復雜性,所有控制器都封裝在一個名為Kube -Manager管理器的守護程序中。

  • Kubernetes控制器管理器是一個守護進程,它嵌入了K ubernetes附帶的核心控制循環(huán)。

  • --controllers選項用于指定要啟用的控制器

  • "*"在默認情況下啟用所有控制器,"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

  • 默認禁用控制器:bootstrapsigner、tokencleaner

kube-controller-manager

  • 控制器本身也是標準得Kubernetes資源類型,它們可以被實例化出具體的對象負責具體任務(wù);控制器資源對象自身也會存在相應(yīng)的管理操作;

  • 例如一個特定的Deployment控制器對象負責管理由標簽選擇器匹配到得Pod資源對象;

  • 控制器資源對象自身的創(chuàng)建、更新及刪除操作由控制器進程負責,這些進程統(tǒng)一打包了kube-controller-manager之中;

  • 而kube-controller-manager自身的運行正常與否的狀況則需要通過冗余的方式設(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會自動識別并重新啟動kube-controller-manager
/etc/kubernetes/manifests/kube-controller-manager.yaml</pre>

Pod Controllers

  • 自助式Pod

  • Node: kubelet

  • 早期版本: ReplicationController

  • 應(yīng)用程序可劃分為多種類型:

  • 守護進程型:

  • 無狀態(tài):

  • 非系統(tǒng)級:Deployment,ReplicaSet

  • 系統(tǒng)級:DaemonSet(比如監(jiān)控)

  • 有狀態(tài): StatefulSet

  • 非守護進程型:

  • Job

  • CronJob

  • ReplicaSet

  • 復制集

  • Label Selector

  • Label

ReplicaSet

  • ReplicaSet 確保在任何指定時間運行指定數(shù)量的Pod副本。

  • Pod 規(guī)格

  • Pod 模板

  • Pod 選擇器

  • 副本集

  • 使用ReplicaSets

  • 刪除 ReplicaSets 及其 Pod

  • 僅刪除一個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 必須匹配

標簽選擇器一旦選中,必須刪除控制器才能更改

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的標簽也會對副本數(shù)量產(chǎn)生影響,只認標簽

kubectl label --overwrite pod myapp-rs-p92pg -n prod app=test

查看標簽

kubectl get pods -n prod --show-labels

主要使用 Deployment ,Deployment 會自動創(chuàng)建 ReplicaSet 且名稱最后帶模板哈希

maxSurge為最多允許多出的pod數(shù)量,maxUnavailable為最多不可用pod數(shù)量

比如當前副本集為4,對多可多出1,先加1個,當前副本集為5,最多不可用為1(這里是以加上maxSurge后的副本數(shù)5為基準)

所以這里是加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

回滾,默認向前回滾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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容