Kubernetes之(七)Pod控制器應用進階

Kubernetes之(七)Pod控制器應用進階

Pod控制器下spec經常使用字段

#containers
[root@master ~]# kubectl explain pods.spec.containers.
name <string> -required- #容器名,必選字段
image <string>   #鏡像,默認是dockerhub倉庫,能夠客戶本身定義倉庫
imagePullPolicy <string> #鏡像獲取策略,Always(老是下載),IfNotPresent(若是本地不存在就下載),Never(從不下載,使用本地鏡像),默認IfNotPresent,若是鏡像標籤是latest,默認是Always
ports <[]Object> # 對象列表,能夠暴漏多個端口,也能夠對每一個端口的屬性進行單獨定義,此處暴漏端口只是提供額外信息,不能限制系統是否真的暴漏
    - containerPort <integer>#容器端口
    hostIP   <string> #主機IP(通常不須要)
    hostPort <integer> #節點端口
    name <string> #名稱
    protocol <string> #使用協議,默認是TCP
args <[]string> #爲command傳遞參數,至關於docker的CMD

command <[]string>  #運行的命令 至關於docker中的ENTRYPOINT
Description docker field name kubernetes field name
the command run by container entrypoint command
the arguments passed to the command Cmd args

說明:
一、若是pod不提供command和args則默認使用docker鏡像中的entrypoint和Cmd;
二、若是pod只提供command可是不提供args,則只使用command,docker鏡像中的entrypoint和cmd都會被忽略;
三、若是pod不提供command可是隻提供args,則使用docker鏡像中默認的entrypoint,而且把pod中定義的args看成參數傳給entrypoint,docker鏡像中的cmd被忽略;
四、若是pod既提供command又提供args,那麼就直接運行command和args,docker鏡像中的entrypoint和cmd都被忽略。node

標籤(Labels)和標籤選擇器(LabelSelector)

標籤

  • 使用標籤把資源分類分組,能夠方便管理資源
  • 所謂標籤就是資源附加的鍵值對,key:只能使用,字母,數字 _ - . (只能以字母數字開頭,不能超過63給字符),value: 能夠爲空,只能使用,字母,數字開頭
  • 每個標籤均可以被標籤選擇器進行匹配度檢查,從而完成資源挑選
  • 一個資源對象可有多個標籤,同一個標籤也能夠對應多個資源
  • 能夠在建立資源的時候配置標籤,也可使用kubectl label進行後期打標

顯示全部pod的全部標籤linux

[root@master ~]# kubectl get pods --show-labels
NAME                            READY   STATUS    RESTARTS   AGE   LABELS
client-f5cdb799f-pklmc          1/1     Running   0          19h   pod-template-hash=f5cdb799f,run=client
myapp-9b4987d5-47sjj            1/1     Running   0          19h   pod-template-hash=9b4987d5,run=myapp
myapp-9b4987d5-684q9            1/1     Running   0          19h   pod-template-hash=9b4987d5,run=myapp
myapp-9b4987d5-djdr9            1/1     Running   0          19h   pod-template-hash=9b4987d5,run=myapp
nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          23h   pod-template-hash=84cbfc56b6,run=nginx-deploy
pod-demo                        2/2     Running   1          16h   app=myapp,tier=frontend

篩選包含app標籤的podnginx

[root@master ~]# kubectl get pods -l app
NAME       READY   STATUS    RESTARTS   AGE
pod-demo   2/2     Running   2          17h

顯示全部pod標籤爲app的值,沒有則顯示爲空docker

[root@master ~]# kubectl get pods -L app
NAME                            READY   STATUS    RESTARTS   AGE   APP
client-f5cdb799f-pklmc          1/1     Running   0          20h   
myapp-9b4987d5-47sjj            1/1     Running   0          20h   
myapp-9b4987d5-684q9            1/1     Running   0          20h   
myapp-9b4987d5-djdr9            1/1     Running   0          20h   
nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          24h   
pod-demo                        2/2     Running   2          17h   myapp

使用kubectl label給資源打標籤vim

#語法
  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]
[root@master manifests]# kubectl label pod pod-demo release=canary
pod/pod-demo labeled

[root@master manifests]# kubectl get pods --show-labels
NAME                            READY   STATUS    RESTARTS   AGE   LABELS
client-f5cdb799f-pklmc          1/1     Running   0          20h   pod-template-hash=f5cdb799f,run=client
myapp-9b4987d5-47sjj            1/1     Running   0          20h   pod-template-hash=9b4987d5,run=myapp
myapp-9b4987d5-684q9            1/1     Running   0          20h   pod-template-hash=9b4987d5,run=myapp
myapp-9b4987d5-djdr9            1/1     Running   0          20h   pod-template-hash=9b4987d5,run=myapp
nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          24h   pod-template-hash=84cbfc56b6,run=nginx-deploy
pod-demo                        2/2     Running   2          17h   app=myapp,release=canary,tier=frontends

篩選同時包含多個標籤的podapi

[root@master manifests]# kubectl get pods -l release,app  
NAME       READY   STATUS    RESTARTS   AGE
pod-demo   2/2     Running   2          17h

標籤選擇器

  • 等值關係:=,==,!=
  • 集合關係:
  • KEY in (VALUE1,VALUE2...)
  • KEY notin (VALUE1,VALUE2...)
  • KEY (表示存在KEY)
  • !KEY (表示不存在KEY)

許多資源支持內嵌字段定義其使用的標籤選擇器:app

  • matchLabels: 直接給定鍵值 相似等值關係
  • matchExpressions: 基於給定的表達式來定義使用標籤選擇器,{key: "KEY", opeartor: "OPERATOR", values: [VAL1,VAL2...]}
    意思是給定的key鍵對values的值作基於operator表達式的比較,是否知足條件。其中 operator經常使用的有 In NotIn Exits NotExits,
    • In NotIn: value必須是非空列表,
    • Exits NotExits: values必須是空列表
  • annotations:與label不一樣的地方:它不能用於挑選資源對象,僅用於爲對象提供"元數據",沒有鍵值長度限制。frontend

    節點標籤選擇器

    在添加資源時,可讓資源對節點有傾向性。
[root@master ~]# kubectl explain pods.spec.
 nodeName     <string> #指定node名稱
 nodeSelector <map[string]string> #使用標籤選擇器

給node01打標籤disktype=ssd,而後運行pod-demo使用節點標籤選擇器,使之運行在node01上ide

#給node01打標籤
[root@master manifests]# kubectl label node node01 disktype=ssd
node/node01 labeled
[root@master manifests]# kubectl get nodes --show-labels
NAME     STATUS   ROLES    AGE   VERSION   LABELS
master   Ready    master   43h   v1.13.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,node-role.kubernetes.io/master=
node01   Ready    <none>   42h   v1.13.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=node01
node02   Ready    <none>   42h   v1.13.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node02

#編輯pod-demo.yaml
[root@master manifests]# vim pod-demo_1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  #labels: {"app": "myapp","tier": "frontend"} 和下面效果同樣,建議使用下面格式
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: busybox
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
  nodeSelector:
    disktype: ssd
    
#從新部署pod-demo,需提早刪除原pod-demo
[root@master manifests]# kubectl delete -f pod-demo.yaml 
pod "pod-demo" deleted
[root@master manifests]# kubectl apply -f pod-demo_1.yaml 
pod/pod-demo created

#驗證結果
[root@master manifests]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
client-f5cdb799f-pklmc          1/1     Running   0          20h   10.244.2.7    node02   <none>           <none>
myapp-9b4987d5-47sjj            1/1     Running   0          20h   10.244.1.13   node01   <none>           <none>
myapp-9b4987d5-684q9            1/1     Running   0          20h   10.244.1.12   node01   <none>           <none>
myapp-9b4987d5-djdr9            1/1     Running   0          20h   10.244.2.13   node02   <none>           <none>
nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          24h   10.244.2.4    node02   <none>           <none>
pod-demo                        2/2     Running   0          10s   10.244.1.14   node01   <none>           <none>

增長annotations註解,使用kubectl describe查看

[root@master manifests]# cat pod-demo_1.yaml  
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    white.io/created-by: "cluster white"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: busybox
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600" 
  nodeSelector:
    disktype: ssd
#須要使用kubectl describe pods pod-demo來查看纔看的到
[root@master manifests]# kubectl describe pods pod-demo
Name:               pod-demo
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               node01/10.0.0.11
Start Time:         Fri, 29 Mar 2019 11:30:51 +0800
Labels:             app=myapp
                    tier=frontend
Annotations:        white.io/created-by: cluster white
Status:             Running
IP:                 10.244.1.15
... ...
參考資料

https://www.cnblogs.com/linuxk 馬永亮. Kubernetes進階實戰 (雲計算與虛擬化技術叢書) Kubernetes-handbook-jimmysong-20181218

相關文章
相關標籤/搜索