K8S系列學習之Pod實戰

tianyangqi發表於2020-10-13

Kubernetes學習路上的那些事兒,很有必要分享出來

 

 

什麼是Pod

要弄清楚這個概念,我們還是先上官網瞧瞧,https://kubernetes.io/zh/docs/concepts/workloads/pods/

個人的理解,Pod就是k8s中的一個個籃子,至於裡面是裝韭菜,還是裝雞蛋,得根據具體的業務環境要求來定。在k8s世界中,重點是把這些籃子排程和管理好,所以得首先學Pod,只有理解和掌握了Pod,後面的一些k8s元件學習起來才有意思。

 

實操過程

實驗準備:

Kubernetes叢集環境一套,可以選擇在本地虛擬機器(VirtualBox)上搭建,也可以選擇在公有云上利用雲主機來搭建,比如移動雲、阿里雲、騰訊雲、華為雲等。

當然,在生產環境中,肯定建議直接使用伺服器進行搭建。以下是我的實驗環境,1臺master節點,2臺node節點。

 

步驟一:編寫Pod的yaml檔案。因為在k8s中是“宣告式”命令,通過編寫的yaml檔案來實現元件的操作。

在Master節點的當前環境下,先編寫一個名字叫“pod1.yaml”的檔案,具體程式碼如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: default
  labels:
    evn: dev
    res: stable
spec:
  containers:
  - name: testpod-dev
    image: nginx
    ports:
    - containerPort: 80

還是那句老話,先別慌,會奉上詳細的解釋的,如下圖:

 

步驟二:提交yaml檔案並建立Pod。在這個小實驗裡,只建立了一個Pod,且該Pod中只有一個容器,該容器安裝的是nginx最新版本的映象,也就是部署了一個nginx容器。

kubectl apply -f pod1.yaml

kubectl get pod

由於我做實驗的環境設定的頻寬低,所以拉取映象的過程比較長一些,如果執行正常,獲取的Pod狀態是Running。如果是非Running的狀態,可使用kubectl describe pod pod1命令來檢視pod1的執行資訊,以便找到問題,然後解決問題。

 

步驟三:驗證結果。可以使用kubectl命令列直接進入Pod內,然後檢視nginx安裝檔案。如果想使用curl命令看nginx歡迎頁面資訊,單獨操作Pod是不行的,需要配合Service元件來使用,後續會單獨分享Service。畢竟k8s是叢集排程,無論是從物理層面的“垂直維度”,還是從編排層面的“水平維度”,都是做了隔離的,這跟單獨操作虛擬機器還是有較大區別的。

kubectl exec -it pod1 -c testpod-dev -- /bin/bash    //pod1是本實驗的Pod名稱,testpod-dev是本實驗pod1中的容器名稱,該docker容器部署了nginx

以上紅色方框中的配置檔案,就是我們們熟悉的nginx配置檔案了,/conf.d/default.conf中可以修改監控埠(預設是80),nginx.conf中可以修改worker_processes的數量。

 

步驟四:一個Pod中部署多個docker容器。這裡就開始體現k8s的好處了,只需要在原來的pod1.yaml檔案上裡的spec語句塊中,繼續增加容器規格引數即可。為了方便對比,增加了程式碼的檔案叫pod-1.yaml,同時名稱定義為pod-1。

然後使用同樣的命令,建立pod-1。

kubectl apply -f pod-1.yaml     //增加了my-tomcat容器的yaml檔案

kubectl get pod        //檢視pod狀態,直到狀態變成Running

 

做個對比,pod1中只有一個docker容器,而pod-1中有兩個docker容器。

 

步驟五:在Pod中限制docker容器的資源使用。操作也很簡單,仍然是通過修改yaml檔案的相應配置區來實現。

為了好做對比,在pod1.yaml基礎上覆制一個pod11.yaml檔案,然後增加資源設定語句塊。

然後讓pod1(沒有設定資源限制)和pod-11(設定了資源限制)都Running起來,然後使用命令檢視當前Node上的執行情況。

kubectl get pod -o wide    //檢視pod在哪些Node上

kubectl describe node k8s-node2  //檢視k8s-node2這個Node上的執行資訊

 

擴充套件內容

1)實驗環境的對比,公有云VS本地虛擬機器

如果使用公有云上的雲主機搭建環境,好處是“一次部署,永久執行”,想做實驗的時候,馬上登陸雲主機即可,不好的地方是要注意安全組的配置,注意埠的放通,如果為了省事兒也可以將所有埠放通,但因為是公有云又容易被攻擊。

如果使用本地虛擬機器環境搭建,好處是不用配置安全組,也不用擔心80,8080這些常用的web埠進行備案,不好的地方就是PC要關機,虛擬機器環境自然要關機,由於無線網路ip地址變化,每次啟動虛擬機器環境後需要搗鼓網路,因為既要能夠上公網(為了能夠從公共映象倉庫拉取映象),也要保證節點註冊不受影響。

2)Pod中可配置項很多,本實驗只是列舉了一部分,主要目的是簡單介紹如何使用Pod。在k8s中直接操作Pod的機會不多,更多的是通過deployment,ReplicationController,ReplicaSet,Service,Job等元件來自動排程和操作Pod。

更多配置項及解釋可參照如下:(轉自網路:https://www.jianshu.com/p/35dde2b1951b

apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中  
kind: Pod #指定建立資源的角色/型別  
metadata: #資源的後設資料/屬性  
  name: web04-pod #資源的名字,在同一個namespace中必須唯一  
  labels: #設定資源的標籤,詳情請見http://blog.csdn.net/liyingke112/article/details/77482384
    k8s-app: apache  
    version: v1  
    kubernetes.io/cluster-service: "true"  
  annotations:            #自定義註解列表  
    - name: String        #自定義註解名字  
spec:#specification of the resource content 指定該資源的內容  
  restartPolicy: Always #表明該容器一直執行,預設k8s的策略,在此容器退出後,會立即建立一個相同的容器  
  nodeSelector:     #節點選擇,先給主機打標籤kubectl label nodes kube-node1 zone=node1  
    zone: node1  
  containers:  
  - name: web04-pod #容器的名字  
    image: web:apache #容器使用的映象地址  
    imagePullPolicy: Never #三個選擇Always、Never、IfNotPresent,每次啟動時檢查和更新(從registery)images的策略,
                           # Always,每次都檢查
                           # Never,每次都不檢查(不管本地是否有)
                           # IfNotPresent,如果本地有就不檢查,如果沒有就拉取
    command: ['sh'] #啟動容器的執行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT  
    args: ["$(str)"] #啟動容器的命令引數,對應Dockerfile中CMD引數  
    env: #指定容器中的環境變數  
    - name: str #變數的名字  
      value: "/etc/run.sh" #變數的值  
    resources: #資源管理,請求請見http://blog.csdn.net/liyingke112/article/details/77452630
      requests: #容器執行時,最低資源需求,也就是說最少需要多少資源容器才能正常執行  
        cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m)
        memory: 32Mi #記憶體使用量  
      limits: #資源限制  
        cpu: 0.5  
        memory: 32Mi  
    ports:  
    - containerPort: 80 #容器開發對外的埠
      name: httpd  #名稱
      protocol: TCP  
    livenessProbe: #pod內容器健康檢查的設定,詳情請見http://blog.csdn.net/liyingke112/article/details/77531584
      httpGet: #通過httpget檢查健康,返回200-399之間,則認為容器正常  
        path: / #URI地址  
        port: 80  
        #host: 127.0.0.1 #主機地址  
        scheme: HTTP  
      initialDelaySeconds: 180 #表明第一次檢測在容器啟動後多長時間後開始  
      timeoutSeconds: 5 #檢測的超時時間  
      periodSeconds: 15  #檢查間隔時間  
      #也可以用這種方法  
      #exec: 執行命令的方法進行監測,如果其退出碼不為0,則認為容器正常  
      #  command:  
      #    - cat  
      #    - /tmp/health  
      #也可以用這種方法  
      #tcpSocket: //通過tcpSocket檢查健康   
      #  port: number   
    lifecycle: #生命週期管理  
      postStart: #容器執行之前執行的任務  
        exec:  
          command:  
            - 'sh'  
            - 'yum upgrade -y'  
      preStop:#容器關閉之前執行的任務  
        exec:  
          command: ['service httpd stop']  
    volumeMounts:  #詳情請見http://blog.csdn.net/liyingke112/article/details/76577520
    - name: volume #掛載裝置的名字,與volumes[*].name 需要對應    
      mountPath: /data #掛載到容器的某個路徑下  
      readOnly: True  
  volumes: #定義一組掛載裝置  
  - name: volume #定義一個掛載裝置的名字  
    #meptyDir: {}  
    hostPath:  
      path: /opt #掛載裝置型別為hostPath,路徑為宿主機下的/opt,這裡裝置型別支援很多種  

 

相關文章