k8s筆記二(pod資源的創建與管理)

        Pod是kubernetes系統中的最小調度單元,也是基礎單元,而其他的大多數資源對象都是用於支撐和擴展pod對象功能的。而pod的創建可以通過命令創建或者將pod資源定義爲資源清單,再通過定義的清單創建。

一、通過命令創建pod

         通過命令創建的pod的爲自主式pod,不受pod控制器的管理,創建的語法格式爲:

kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool]

二、通過資源配置清單的方式創建

         Pod在kubernetes中也是一種資源,pod資源的定義也是通過”apiVersion”、”kind”、”meadata”、”spec”、”status”五個字段組成,除”status”字段中的信息爲系統自動生成外,其餘各字段都需要管理員定義。

1、pod中容器的管理

        Pod中容器的定義主要是在spec字段下的containers字段下定義,containers字段是定義pod時其嵌套字段spec中的必選項,用於爲pod指定要創建的容器列表。

(1)Containers中關於容器的字段中常用字段有:

        1)name:必選字段,用於指定容器名稱

        2)image:爲可選字段,定義容器運行時的鏡像,但是自助式的pod不能省略此字段。

        3)imagePullPolicy:用於指定鏡像的獲取策略,主要的值有:

                 Always:當鏡像不存在時或不是最新鏡像時則從指定的倉庫中去拉去鏡像

                 IfNotPresent:當需要運行的鏡像在本地不存在時則從指定的倉庫中下載鏡像

                 Nerver:僅使用本地鏡像,不去倉庫中下載鏡像

(2)暴露pod中服務的端口

         Containers字段中的ports字段用於暴露容器的端口,容器的ports字段的值是一個列表,由一到多個端口對象組成,常用的嵌套字段如下:

        1)containerPort:爲必選字段,指定在Pod對象的的ip地址上暴露的容器的端口。

        2)name:當前端口端口名稱,需在當前pod中唯一,此端口可被Serviece資源調用。

        3)protocol:端口相關的協議,值爲tcp或udp

        Pod對象的ip地址僅可在當前集羣內可達,集羣外是無法訪問,當集羣外需要訪問pod中的服務時,可定義node節點的IP地址及端口,將pod中服務端口映射到node上,外部通過node節點訪問;一般都不建議這樣做,常用的做法是通過service的NodePort模式訪問pod內的服務。

        4)hostPort:主機端口

        5)hostIP:主機端口要綁定主機的ip

# 定義一個pod資源指定鏡像以及端口
[root@master01 test01]# cat test03.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-nginx
spec:
  containers:
  - name: nginx-test01
    image: nginx:1.12
    ports:
    - name: http
      containerPort: 80
      protocol: TCP
      hostPort: 33333

(3)定義pod中容器的運行程序及指令

         運行docker容器時運行的應用程序由Dockerfile中ENTRYPOINT指令定義,傳遞的參數則通過CMD指令指定,ENTRYPOINT不存在時,CMD可用於同時指定程序和參數。而kubernetes中containers字段中的command字段能夠指定不同於鏡像默認運行的應用程序,可通過args字段傳參,並會覆蓋鏡像中的默認定義;如果只定義了command字段,則會覆蓋鏡像中的默認指定及參數,如果只定義了args字段,則會將參數傳遞到容器中。

(4)爲pod中的容器定義環境變量

         Docker中程序的配置文件可以通過配置環境變量或者將配置文件掛載到宿主機上實現一個容器在不同的場景下使用不同的配置文件。Kubernetes中也已通過配置環境變量爲Pod中容器傳遞參數。Kubernetes中的環境變量由containers中得evn字段定義;環境變量通常由name和value字段構成。

# 創建一個運行mysql數據庫的pod資源並通過環境變量設置密碼
[root@master01 test01]# cat test05.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-env
spec:
  containers:
  - name: mysql-env
    image: mysql
    env:
    - name: "MYSQL_ROOT_PASSWORD"
      value: "123456"
# 創建pod
[root@master01 test01]# kubectl apply -f test04.yaml 
pod/test-env created
# 查看pod中容器的環境變量
[root@master01 test01]# kubectl exec -it test-env -- printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=test-env
TERM=xterm
MYSQL_ROOT_PASSWORD=123456

(5)設置pod中容器共享節點網絡名稱空間

         Kubernetes中有一些pod中的容器需要共享節點的名稱空間,比如通過kubeadm部署的kubernetes集羣中的kube-apiserver、kube-scheduler等需要共享節點的名稱空間,執行系統及的管理任務。如果pod中的容器需要共享節點的網絡名稱空間只需設置spec.HostNetwork的屬性爲true即可。同時,還可通過設置”spec.hostPID”及”spec.hostIPC”共享工作節點的PID及IPC。

# 定義一個運行tomcat容器的pod資源,共享節點的網絡名稱空間
[root@master01 test01]# cat test06.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tomcat-net
spec:
  containers:
  - name: tomcat-hostnet
    image: tomcat
  hostNetwork: true
# 創建pod
[root@master01 test01]# kubectl apply -f test06.yaml
# 查看node監聽的端口
[root@node01 ~]# lsof -i :8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    29856 root   56u  IPv6 2949386      0t0  TCP *:webcache (LISTEN)

(6)pod資源中安全設置

         Pod對象的安全上下文定義在spec.securityContext字段中,容器的安全定義在spec.containers[].securityContest字段中,各字段的具體用法可通過”kubectl explain”命令查看。

# 創建一個pod資源並以非root用戶運行容器中服務
[root@master01 test01]# cat test07.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-sec
spec:
  containers:
  - name: busybox-sec
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    securityContext:
      runAsNonRoot: true
      runAsUser: 1000
      allowPrivilegeEscalation: false
[root@master01 test01]# kubectl exec -it test-sec -- ps
PID   USER     TIME  COMMAND
    1 1000      0:00 sleep 3600

2、pod中標籤與標籤選擇器的定義與管理

         Pod中label(標籤)的主要功能就是對pod進行分類管理,從而提升運維及管理效率;而標籤選擇器(label selector)則可以挑選出符合過濾條件的資源完成需要的操作。

         標籤是鍵值類型的數據,能夠附加於kubernetes的任何資源對象上,標籤可以在創建資源時指定也可按需添加,一個對象可以擁有多個標籤。

(1)pod資源的標籤管理

         Pod資源的標籤在metadata.labels中定義。

# 在pod資源中定義標籤
[root@master01 test01]# cat test08.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-labels
  labels:
    env: dev
    version: v1.0
spec:
  containers:
  - name: nginx-labels
image: nginx:1.12

         在pod定義了標籤創建資源後,就可以通過標籤篩選需要的資源。

# 查看所有的標籤
[root@master01 test01]# kubectl get pods --show-labels
NAME                           READY   STATUS    RESTARTS   AGE     LABELS
nginx-deploy-54b5756c7-jrvhk   1/1     Running   0          3d21h   pod-template-hash=54b5756c7,run=nginx-deploy
pod-example                    1/1     Running   1          46h     <none>
test-env                       1/1     Running   0          3h13m   <none>
test-labels                    1/1     Running   0          22s     env=dev,version=v1.0
# 列出有指定標籤的資源信息
[root@master01 test01]# kubectl get pods -L env
NAME                           READY   STATUS    RESTARTS   AGE     ENV
nginx-deploy-54b5756c7-jrvhk   1/1     Running   0          3d21h   
pod-example                    1/1     Running   1          46h     
test-env                       1/1     Running   0          3h15m   
test-labels                    1/1     Running   0          2m37s   dev

         當pod創建好之後,可以通過”kubectl label”命令爲pod資源添加標籤,如果pod中已經有了指定鍵名的標籤,可以通過”--overwrite”命令強制覆蓋原有的標籤。

# 爲指定的pod添加新的標籤
[root@master01 test01]# kubectl label pods test-labels app=cache
pod/test-labels labeled
# 修改指定pod的標籤
[root@master01 test01]# kubectl label pods test-labels env=production --overwrite
pod/test-labels labeled

(2)標籤選擇器的使用

         標籤選擇器用於表達標籤的查詢條件或選擇標準,在使用標籤選擇器時,要注意多個選擇器之間的關係爲“與”操作,使用空值得標籤選擇器意味着每個資源對象都被選中,空的標籤選擇器無法選出任何內容。

# 列出app不等於cache的資源
[root@master01 test01]# kubectl get pods -l "app!=cache" --show-labels
NAME                           READY   STATUS    RESTARTS   AGE     LABELS
nginx-deploy-54b5756c7-jrvhk   1/1     Running   0          3d21h   pod-template-hash=54b5756c7,run=nginx-deploy
pod-example                    1/1     Running   1          47h     <none>
test-env                       1/1     Running   0          3h39m   <none>
# 列出標籤app不等於cach且run等於nginx-deploy的pod資源
[root@master01 test01]# kubectl get pods -l "app!=cache,run=nginx-deploy" -L run,app
NAME                           READY   STATUS    RESTARTS   AGE     RUN            APP
nginx-deploy-54b5756c7-jrvhk   1/1     Running   0          3d21h   nginx-deploy

         kubernetes api支持基於等值關係和集合關係的的選擇器,基於集合關係的標籤選擇器支持in、notin、和exists三種操作符。

# 列出標籤app爲cache或者backend的pod資源
[root@master01 test01]# kubectl get pods -l "app in (cache,backend)" -L app
NAME          READY   STATUS    RESTARTS   AGE   APP
test-labels   1/1     Running   0          35m   cache
# 列出不存在env標籤的資源
[root@master01 test01]# kubectl get pods -l '!env' --show-labels
NAME                           READY   STATUS    RESTARTS   AGE     LABELS
nginx-deploy-54b5756c7-jrvhk   1/1     Running   0          3d22h   pod-template-hash=54b5756c7,run=nginx-deploy
pod-example                    1/1     Running   1          47h     <none>
test-env                       1/1     Running   0          3h53m   <none>

3、Pod節點選擇器

         Pod節點選擇器nodeSelector能夠讓Pod對象基於集羣中的工作節點的標籤來挑選運行pod的node節點。在使用pod節點選擇器之前需要爲node資源添加標籤,添加標籤的方法同爲pod資源添加標籤的方法相同。

# 爲兩個node節點分別添加標籤
[root@master01 test01]# kubectl label nodes node01.dayi123.com server=nginx
node/node01.dayi123.com labeled
[root@master01 test01]# kubectl label nodes node02.dayi123.com server=tomcat
node/node02.dayi123.com labeled

         pod資源中定義節點選擇器時通過spec.nodeSelector字段定義。

# 定義一個pod資源,讓其運行在node1節點上
[root@master01 test01]# cat test09.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: node-select-test
  labels:
    env: dev
spec:
  containers:
  - name: nginx-slect
    image: nginx:1.12
  nodeSelector:
    server: nginx

4、pod資源註解

         除了標籤之外,Pod與其他各種資源還能使用資源註解(annotation);與標籤類似,註解也是鍵值類型的數據,註解僅用於爲資源提供元數據信息。而資源的註解可由用戶手動添加,也可由工具程序自動附加並使用。

(1)管理資源註解

         資源註解的創建可在定義資源時使用metadata.annotations字段指定,也可在資源創建後通過”kubectl annotate”命令進行附加。

# 定義資源時添加資源註解
[root@master01 test01]# cat test10.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: annotation-test
  labels: 
    env: dev
  annotations:
    server-explain: tomcat server is node02
spec:
  containers:
  - name: tomcat-node02
    image: tomcat
# 爲創建好的資源添加資源註解
[root@master01 test01]# kubectl annotate pods annotation-test auth="dayi123"

(2)查看資源註解

        資源註解的查看可以通過”kubectl desribe”查看,或者pod導出爲yaml格式查看。

# 查看資源註解
[root@master01 test01]# kubectl describe pods annotation-test
Name:               annotation-test
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               node01.dayi123.com/192.168.17.197
Start Time:         Fri, 11 Jan 2019 02:45:07 -0500
Labels:             env=dev
Annotations:        auth: dayi123
                    kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"server-explain":"tomcat server is node02"},"labels":{"env":"dev"},"name":"anno...
                    server-explain: tomcat server is node02

5、pod的生命週期

        Pod對象自從創建開始到終止退出的時間範圍稱爲pod的生命週期,這段時間內pod會處於多種不同的狀態並執行一些操作。

(1)pod生命週期中的重要行爲

        1)初始化容器

        2)生命週期的鉤子函數

        3)容器的探測

(2)容器的重啓策略

        當pod中的容器程序發生崩潰或容器申請超出限制的資源時都可能會導致pod對象的終止,而pod終止後是否應該重建pod對象取決於重啓策略restartPolicy屬性定義。定義該屬性的字段爲spec.restartPolicy,主要有如下的值:

        1)Always:只要pod對象終止就將其重啓,該值爲默認值

        2)OnFailure:僅在Pod對象出現錯誤時將其重啓

       3)Nerver:從不重啓

6、Pod資源存活性檢測

        Kubernetes對容器的存活性檢測能夠發現不可能用狀態的容器,並對該容器進行重啓等操作。Kubernetes存活性探測的主要方法有ExecAction、TCPSocketAction、HTTPGetAction。

(1)使用exec探針檢測容器的存活性

         Exec探針通過在目標容器中執行由用戶自定義的命令來判斷容器的健康狀態,exec探針由”spec.containers.livenessProbe.exec”字段定義,該字段只有一個”command”屬性來定義要執行的命令。

# 使用exec探針,檢測文件是否存在,文件不存在時該pod會被重啓
[root@master01 test01]# cat test11.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: lineness-exec
  name: lineness-exec
spec:
  containers:
  - name: test-lineness-exec
    image: busybox
    args: ["/bin/sh","-c","touch /tmp/test123;sleep 60 ;rm -rf /tmp/test123;sleep 300"]
    livenessProbe:
      exec:
        command: ["test","-f","/tmp/test123"]
# 一段時間後,查看pod時發現該pod的已經被重啓了兩次
[root@master01 test01]# kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
lineness-exec                  1/1     Running   2          4m20s

(2)使用http探針

         基於http的探測是向目標容器發起一個http請求,根據其響應碼進行結果的判定,該字段通過”spec.containers.livenessProbe.httpGet”字段定義,相關的字段有:

         1)port:必選字段,用於定義請求的端口

         2)httpHeaders:自定義的請求報文首部

         3)path:請求的http資源路徑,

        4)scheme:建立連接使用的協議,默認爲http

# 使用http探針檢測指定頁面是否存在
[root@master01 test01]# cat test12.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: liveness-http
spec:
  containers:
  - name: test-lineness-http
    image: nginx:1.12
    ports:
    - name: http
      containerPort: 80
    lifecycle:
      postStart: 
        exec:
          command: ["/bin/sh","-c","echo testhttp >/usr/share/nginx/html/testhttp"]
    livenessProbe:
      httpGet:
        path: /testhttp
        port: http
        scheme: HTTP

(3)使用TCP探針

         基於TCP的存活性探測是用於向容器的特定端口發起TCP請求並嘗試建立連接進行結果判定。該探針的使用主要是通過”spec.containers.livenessProble.tcpSocket”字段來定義。主要的字段有:

        1)host:請求連接的目標IP地址,默認爲Pod ip

        2)port:必選字段,請求連接的目標端口。

(4)存活性探測的行爲屬性

         除了個探測器的自身字段屬性爲,還可以配置一些其他的行爲屬性,其他的行爲屬性字段在”spec.containers.livenessProbe”字段下設置,主要有:

        1)initialDelySeconds:設置存活性探測的延遲時長,即容器啓動多久之後開始第一次探測,默認爲0。

        2)timeoutSeconds:存活性探測的超時時長,,默認爲1s,最小值也爲1s.

        3)periodSeconds:存活性探測的頻度,默認爲10s,最小可設置爲1s

        4)successThreshold:處於失敗狀態時,探測器操作連續多少次的成功才被認爲是通過檢測,默認爲1

        5)failureThreshold:處於成功狀態時,探測操作至少連續多少次的失敗才被視爲是檢測不通過。默認爲3

        這些屬性設置後都可以通過” kubectl describe”命令查看,各項設置在該命令輸出的liveness字段中,delay爲存活性探測的延遲時長,timeout爲存活性探測的超時時長,period爲存活性探測的頻率,success爲失敗狀態轉爲成功狀態時的探測成功次數,failure爲成功轉失敗是的探測失敗次數。

Liveness:       http-get http://:http/testhttp delay=0s timeout=1s period=10s #success=1 #failure=3

7、Pod的就緒性探測

         Pod的就緒性探測主要用於在探測到容器尚未就緒時,觸發依賴於其就緒狀態的操作,確保不會有客戶端請求接入此pod操作。就緒性探測也支持Exec、HTTP GET和TCP Socket三種探測方式。就緒性探測的使用方法同存活性探測的使用方法基本相同,就緒性探測主要通過”pod.spec.containers.readinessProbe”字段來設置。

         在未定義就緒性探測的Pod對象在Pod進入“Running”狀態後將立刻就緒。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章