中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

掌(zhang)握 K8s Pod 基礎應用 (一)

Kubernetes 官方文檔

Pod 介紹

Pod結構

每個(ge)Pod中都(dou)可以包含一個(ge)或者(zhe)多個(ge)容器(qi)(qi),這(zhe)些(xie)容器(qi)(qi)可以分為(wei)兩(liang)類:

  • 用戶程序所(suo)在的容器,數(shu)量可多可少

  • Pause容器,這是每個Pod都會有的一個根容器,它的作用有兩個:

    • 可以(yi)以(yi)它為依(yi)據,評估整個(ge)Pod的健(jian)康狀態(tai)

    • 可以在根容器上設置Ip地(di)址,其它(ta)容器都此Ip(Pod IP),以實現(xian)Pod內部(bu)的網(wang)路(lu)通信

      這里是Pod內部的通訊,Pod的之間的通訊采用虛擬二層網絡技術來實現,我們當前環境用的是Flannel
      

Pod定義

下面是(shi)Pod的資源清單:

apiVersion: v1     #必選,版本號,例如v1
kind: Pod         #必選,資源類型,例如 Pod
metadata:         #必選,元數據
  name: string     #必選,Pod名稱
  namespace: string  #Pod所屬的命名空間,默認為"default"
  labels:           #自定義標簽列表
    - name: string                 
spec:  #必選,Pod中容器的詳細定義
  containers:  #必選,Pod中容器列表
  - name: string   #必選,容器名稱
    image: string  #必選,容器的鏡像名稱
    imagePullPolicy: [ Always|Never|IfNotPresent ]  #獲取鏡像的策略 
    command: [string]   #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
    args: [string]      #容器的啟動命令參數列表
    workingDir: string  #容器的工作目錄
    volumeMounts:       #掛載到容器內部的存儲卷配置
    - name: string      #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名
      mountPath: string #存儲卷在容器內mount的絕對路徑,應少于512字符
      readOnly: boolean #是否為只讀模式
    ports: #需要暴露的端口庫號列表
    - name: string        #端口的名稱
      containerPort: int  #容器需要監聽的端口號
      hostPort: int       #容器所在主機需要監聽的端口號,默認與Container相同
      protocol: string    #端口協議,支持TCP和UDP,默認TCP
    env:   #容器運行前需設置的環境變量列表
    - name: string  #環境變量名稱
      value: string #環境變量的值
    resources: #資源限制和請求的設置
      limits:  #資源限制的設置
        cpu: string     #Cpu的限制,單位為core數,將用于docker run --cpu-shares參數
        memory: string  #內存限制,單位可以為Mib/Gib,將用于docker run --memory參數
      requests: #資源請求的設置
        cpu: string    #Cpu請求,容器啟動的初始可用數量
        memory: string #內存請求,容器啟動的初始可用數量
    lifecycle: #生命周期鉤子
        postStart: #容器啟動后立即執行此鉤子,如果執行失敗,會根據重啟策略進行重啟
        preStop: #容器終止前執行此鉤子,無論結果如何,容器都會終止
    livenessProbe:  #對Pod內各容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器
      exec:         #對Pod容器內檢查方式設置為exec方式
        command: [string]  #exec方式需要制定的命令或腳本
      httpGet:       #對Pod內個容器健康檢查方法設置為HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #對Pod內個容器健康檢查方式設置為tcpSocket方式
         port: number
       initialDelaySeconds: 0       #容器啟動完成后首次探測的時間,單位為秒
       timeoutSeconds: 0          #對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒
       periodSeconds: 0           #對容器監控檢查的定期探測時間設置,單位秒,默認10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged: false
  restartPolicy: [Always | Never | OnFailure]  #Pod的重啟策略
  nodeName: <string> #設置NodeName表示將該Pod調度到指定到名稱的node節點上
  nodeSelector: obeject #設置NodeSelector表示將該Pod調度到包含這個label的node上
  imagePullSecrets: #Pull鏡像時使用的secret名稱,以key:secretkey格式指定
  - name: string
  hostNetwork: false   #是否使用主機網絡模式,默認為false,如果設置為true,表示使用宿主機網絡
  volumes:   #在該pod上定義共享存儲卷列表
  - name: string    #共享存儲卷名稱 (volumes類型有很多種)
    emptyDir: {}       #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值
    hostPath: string   #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
      path: string                #Pod所在宿主機的目錄,將被用于同期中mount的目錄
    secret:          #類型為secret的存儲卷,掛載集群與定義的secret對象到容器內部
      scretname: string  
      items:     
      - key: string
        path: string
    configMap:         #類型為configMap的存儲卷,掛載預定義的configMap對象到容器內部
      name: string
      items:
      - key: string
        path: string
#小提示:
#   在這里,可通過一個命令來查看每種資源的可配置項
#   kubectl explain 資源類型         查看某種資源可以配置的一級屬性
#   kubectl explain 資源類型.屬性     查看屬性的子屬性
[root@k8s-master01 ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1
FIELDS:
   apiVersion   <string>
   kind <string>
   metadata     <Object>
   spec <Object>
   status       <Object>

[root@k8s-master01 ~]# kubectl explain pod.metadata
KIND:     Pod
VERSION:  v1
RESOURCE: metadata <Object>
FIELDS:
   annotations  <map[string]string>
   clusterName  <string>
   creationTimestamp    <string>
   deletionGracePeriodSeconds   <integer>
   deletionTimestamp    <string>
   finalizers   <[]string>
   generateName <string>
   generation   <integer>
   labels       <map[string]string>
   managedFields        <[]Object>
   name <string>
   namespace    <string>
   ownerReferences      <[]Object>
   resourceVersion      <string>
   selfLink     <string>
   uid  <string>

在kubernetes中基本所有資源的一級(ji)屬性都是一樣的,主(zhu)要(yao)包含5部分(fen):

  • apiVersion 版本,由kubernetes內部定義,版本號必須可以用 kubectl api-versions 查詢到

  • kind 類型,由kubernetes內部定義,版本號必須可以用 kubectl api-resources 查詢到

  • metadata 元數據,主要是資源標識和說明,常用的有name、namespace、labels等

  • spec 描述,這是配置中最重要的一部分,里面是對各種資源配置的詳細描述

  • status 狀態信息,里面的內容不需要定義,由kubernetes自動生成

    在上面的(de)(de)屬性中,spec是(shi)接下來研(yan)究(jiu)的(de)(de)重點,繼續(xu)看下它的(de)(de)常見子屬性:

    • containers <[]Object> 容器列表,用于定義容器的詳細信息

    • nodeName 根據nodeName的值將pod調度到指定的Node節點上

    • nodeSelector <map[]> 根據NodeSelector中定義的信息選擇將該Pod調度(du)到包含這些label的Node 上

    • hostNetwork 是否使用主機網絡模式,默認為false,如果設置為true,表示使用宿主機網絡

    • volumes <[]Object> 存儲(chu)卷,用于定義(yi)Pod上面掛在(zai)的存儲(chu)信息

    • restartPolicy 重啟策略,表示Pod在遇到故障的時候的處理策略

    Pod配置

    本文主要來研究pod.spec.containers屬性,這也是pod配置中最為關鍵的一項配置。

    [root@k8s-master01 ~]# kubectl explain pod.spec.containers
    KIND:     Pod
    VERSION:  v1
    RESOURCE: containers <[]Object>   # 數組,代表可以有多個容器
    FIELDS:
       name  <string>     # 容器名稱
       image <string>     # 容器需要的鏡像地址
       imagePullPolicy  <string> # 鏡像拉取策略 
       command  <[]string> # 容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
       args     <[]string> # 容器的啟動命令需要的參數列表
       env      <[]Object> # 容器環境變量的配置
       ports    <[]Object>     # 容器需要暴露的端口號列表
       resources <Object>      # 資源限制和資源請求的設置
    

    基本配置

    創建pod-base.yaml文件,內容如(ru)下(xia):

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-base
      namespace: dev
      labels:
        user: wenc
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
      - name: busybox
        image: busybox:1.30
    

    上面定義了一個(ge)比較簡單Pod的配置,里面有兩(liang)個(ge)容器:

    • nginx:用(yong)1.18.0版本的nginx鏡像(xiang)創建(jian),(nginx是一個輕量級web容器)

    • busybox:用(yong)1.30版本的busybox鏡像(xiang)創(chuang)建,(busybox是一個(ge)小巧的linux命令集合)

    # 創建Pod
    [root@k8s-master01 pod]# kubectl apply -f pod-base.yaml
    pod/pod-base created
    
    # 查看Pod狀況
    # READY 1/2 : 表示當前Pod中有2個容器,其中1個準備就緒,1個未就緒
    # RESTARTS  : 重啟次數,因為有1個容器故障了,Pod一直在重啟試圖恢復它
    [root@k8s-master01 pod]# kubectl get pod -n dev
    NAME       READY   STATUS    RESTARTS   AGE
    pod-base   1/2     Running   4          95s
    
    # 可以通過describe查看內部的詳情
    # 此時已經運行起來了一個基本的Pod,雖然它暫時有問題
    [root@k8s-master01 pod]# kubectl describe pod pod-base -n dev
    

    鏡像拉取

    創建pod-imagepullpolicy.yaml文件,內容(rong)如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-imagepullpolicy
      namespace: dev
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
        imagePullPolicy: Never # 用于設置鏡像拉取策略
      - name: busybox
        image: busybox:1.30
    

    imagePullPolicy,用于設置(zhi)鏡(jing)像拉取策略(lve),kubernetes支持配置(zhi)三種拉取策略(lve):

    • Always:總(zong)是(shi)從(cong)遠程(cheng)倉庫拉取鏡像(一(yi)直遠程(cheng)下載)

    • IfNotPresent:本地有(you)則使(shi)用(yong)本地鏡像,本地沒(mei)有(you)則從遠(yuan)程倉(cang)庫拉取(qu)鏡像(本地有(you)就(jiu)本地 本地沒(mei)遠(yuan)程下載)

    • Never:只使用(yong)本(ben)地(di)(di)鏡像,從(cong)不去遠程(cheng)倉庫拉取(qu),本(ben)地(di)(di)沒有就報錯 (一直使用(yong)本(ben)地(di)(di))

    默認值說明:

    如果鏡像(xiang)tag為具體(ti)版本號, 默認策略(lve)是:IfNotPresent

    如果(guo)鏡像tag為:latest(最終版本) ,默認(ren)策略是always

    # 創建Pod
    [root@k8s-master01 pod]# kubectl create -f pod-imagepullpolicy.yaml
    pod/pod-imagepullpolicy created
    
    # 查看Pod詳情
    # 此時明顯可以看到nginx鏡像有一步Pulling image "nginx:1.18.0"的過程
    [root@k8s-master01 pod]# kubectl describe pod pod-imagepullpolicy -n dev
    ......
    Events:
      Type     Reason     Age               From               Message
      ----     ------     ----              ----               -------
      Normal   Scheduled  <unknown>         default-scheduler  Successfully assigned dev/pod-imagePullPolicy to node1
      Normal   Pulling    32s               kubelet, node1     Pulling image "nginx:1.18.0"
      Normal   Pulled     26s               kubelet, node1     Successfully pulled image "nginx:1.18.0"
      Normal   Created    26s               kubelet, node1     Created container nginx
      Normal   Started    25s               kubelet, node1     Started container nginx
      Normal   Pulled     7s (x3 over 25s)  kubelet, node1     Container image "busybox:1.30" already present on machine
      Normal   Created    7s (x3 over 25s)  kubelet, node1     Created container busybox
      Normal   Started    7s (x3 over 25s)  kubelet, node1     Started container busybox
    

    啟動命令

    在前面的(de)案例(li)中,一直(zhi)有一個問(wen)題沒有解決,就是(shi)的(de)busybox容器(qi)(qi)一直(zhi)沒有成功運行,那么(me)到底是(shi)什么(me)原(yuan)因(yin)導(dao)致這個容器(qi)(qi)的(de)故障呢?

    原來busybox并(bing)不是一(yi)個程(cheng)序,而是類似于一(yi)個工(gong)具類的集合,kubernetes集群啟動管理(li)后,它會自動關閉。解決方法就(jiu)(jiu)是讓(rang)其一(yi)直(zhi)在運行,這就(jiu)(jiu)用到(dao)了command配置。

    創建pod-command.yaml文件,內容如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-command
      namespace: dev
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
      - name: busybox
        image: busybox:1.30
        command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"]
    

    command,用于在pod中的容(rong)器初始化完畢之后運行一個命(ming)令。

    稍微解(jie)釋下上面命令的(de)意思:

    "/bin/sh","-c", 使用sh執(zhi)行(xing)命令

    touch /tmp/hello.txt; 創(chuang)建(jian)一個/tmp/hello.txt 文(wen)件

    while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done; 每隔3秒向文件(jian)中寫入當前時間

    # 創建Pod
    [root@k8s-master01 pod]# kubectl create  -f pod-command.yaml
    pod/pod-command created
    
    # 查看Pod狀態
    # 此時發現兩個pod都正常運行了
    [root@k8s-master01 pod]# kubectl get pods pod-command -n dev
    NAME          READY   STATUS   RESTARTS   AGE
    pod-command   2/2     Runing   0          2s
    
    # 進入pod中的busybox容器,查看文件內容
    # 補充一個命令: kubectl exec  pod名稱 -n 命名空間 -it -c 容器名稱 /bin/sh  在容器內部執行命令
    # 使用這個命令就可以進入某個容器的內部,然后進行相關操作了
    # 比如,可以查看txt文件的內容
    [root@k8s-master01 pod]# kubectl exec pod-command -n dev -it -c busybox /bin/sh
    / # tail -f /tmp/hello.txt
    14:44:19
    14:44:22
    14:44:25
    
    特別說明:
        通過上面發現command已經可以完成啟動命令和傳遞參數的功能,為什么這里還要提供一個args選項,用于傳遞參數呢?
        這其實跟docker有點關系,kubernetes中的command、args兩項其實是實現覆蓋Dockerfile中ENTRYPOINT的功能。
    
     1 如果command和args均沒有寫,那么用Dockerfile的配置。
    
     2 如果command寫了,但args沒有寫,那么Dockerfile默認的配置會被忽略,執行輸入的command
    
     3 如果command沒寫,但args寫了,那么Dockerfile中配置的ENTRYPOINT的命令會被執行,使用當前args的參數
    
     4 如果command和args都寫了,那么Dockerfile的配置被忽略,執行command并追加上args參數
    

    環境變量

    創建pod-env.yaml文(wen)件(jian),內容(rong)如下(xia):

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-env
      namespace: dev
    spec:
      containers:
      - name: busybox
        image: busybox:1.30
        command: ["/bin/sh","-c","while true;do /bin/echo $(date +%T);sleep 60; done;"]
        env: # 設置環境變量列表
        - name: "username"
          value: "admin"
        - name: "password"
          value: "123456"
    

    env,環境(jing)變量(liang),用于在(zai)pod中的(de)容器設(she)置環境(jing)變量(liang)。

    # 創建Pod
    [root@k8s-master01 ~]# kubectl create -f pod-env.yaml
    pod/pod-env created
    
    # 進入容器,輸出環境變量
    [root@k8s-master01 ~]# kubectl exec pod-env -n dev -c busybox -it /bin/sh
    / # echo $username
    admin
    / # echo $password
    123456
    

    這種(zhong)方式不是很推薦,推薦將這些配置單獨存儲在配置文件中,這種(zhong)方式將在后面介(jie)紹(shao)。

    端口設置

    本文(wen)來介紹容器的端口設置,也就是containers的ports選項。

    首先看下ports支持的子選項:

    [root@k8s-master01 ~]# kubectl explain pod.spec.containers.ports
    KIND:     Pod
    VERSION:  v1
    RESOURCE: ports <[]Object>
    FIELDS:
       name         <string>  # 端口名稱,如果指定,必須保證name在pod中是唯一的		
       containerPort<integer> # 容器要監聽的端口(0<x<65536)
       hostPort     <integer> # 容器要在主機上公開的端口,如果設置,主機上只能運行容器的一個副本(一般省略) 
       hostIP       <string>  # 要將外部端口綁定到的主機IP(一般省略)
       protocol     <string>  # 端口協議。必須是UDP、TCP或SCTP。默認為“TCP”。
    

    接下(xia)來,編寫一個測試案例,創(chuang)建(jian)pod-ports.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-ports
      namespace: dev
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
        ports: # 設置容器暴露的端口列表
        - name: nginx-port
          containerPort: 80
          protocol: TCP
    
    # 創建Pod
    [root@k8s-master01 ~]# kubectl create -f pod-ports.yaml
    pod/pod-ports created
    
    # 查看pod
    # 在下面可以明顯看到配置信息
    [root@k8s-master01 ~]# kubectl get pod pod-ports -n dev -o yaml
    ......
    spec:
      containers:
      - image: nginx:1.18.0
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: nginx-port
          protocol: TCP
    ......
    

    訪問容器中的程序需要使用的是Podip:containerPort

    資源配額

    容(rong)器中的程序要(yao)運行,肯(ken)定是(shi)要(yao)占用一定資源的,比(bi)如cpu和(he)內(nei)存(cun)等,如果(guo)不對(dui)某個(ge)(ge)容(rong)器的資源做限制(zhi)(zhi),那么它(ta)(ta)就(jiu)可(ke)能吃掉大量資源,導致(zhi)其它(ta)(ta)容(rong)器無法運行。針對(dui)這(zhe)種情況,kubernetes提供了(le)對(dui)內(nei)存(cun)和(he)cpu的資源進行配額的機(ji)制(zhi)(zhi),這(zhe)種機(ji)制(zhi)(zhi)主要(yao)通過resources選(xuan)(xuan)項實現,他有兩個(ge)(ge)子選(xuan)(xuan)項:

    • limits:用于(yu)限制(zhi)運行時容器的最大占用資(zi)源,當容器占用資(zi)源超(chao)過limits時會被終止(zhi),并(bing)進行重啟

    • requests :用于(yu)設置容器需要(yao)的最小資(zi)源,如果環境資(zi)源不夠,容器將無法啟動

    可以(yi)通過上面(mian)兩個(ge)選項設置資源的(de)上下限。

    接下來,編寫一(yi)個測試(shi)案例,創建pod-resources.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-resources
      namespace: dev
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
        resources: # 資源配額
          limits:  # 限制資源(上限)
            cpu: "2" # CPU限制,單位是core數
            memory: "10Gi" # 內存限制
          requests: # 請求資源(下限)
            cpu: "1"  # CPU限制,單位是core數
            memory: "10Mi"  # 內存限制
    

    在(zai)這對cpu和memory的單位做一個說明(ming):

    • cpu:core數,可(ke)以(yi)為(wei)整(zheng)數或小(xiao)數

    • memory: 內存大小(xiao),可以使用Gi、Mi、G、M等形式(shi)

    # 運行Pod
    [root@k8s-master01 ~]# kubectl create  -f pod-resources.yaml
    pod/pod-resources created
    
    # 查看發現pod運行正常
    [root@k8s-master01 ~]# kubectl get pod pod-resources -n dev
    NAME            READY   STATUS    RESTARTS   AGE  
    pod-resources   1/1     Running   0          39s   
    
    # 接下來,停止Pod
    [root@k8s-master01 ~]# kubectl delete  -f pod-resources.yaml
    pod "pod-resources" deleted
    
    # 編輯pod,修改resources.requests.memory的值為10Gi
    [root@k8s-master01 ~]# vim pod-resources.yaml
    
    # 再次啟動pod
    [root@k8s-master01 ~]# kubectl create  -f pod-resources.yaml
    pod/pod-resources created
    
    # 查看Pod狀態,發現Pod啟動失敗
    [root@k8s-master01 ~]# kubectl get pod pod-resources -n dev -o wide
    NAME            READY   STATUS    RESTARTS   AGE          
    pod-resources   0/1     Pending   0          20s    
    
    # 查看pod詳情會發現,如下提示
    [root@k8s-master01 ~]# kubectl describe pod pod-resources -n dev
    ......
    Warning  FailedScheduling  35s   default-scheduler  0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, 
    that the pod didn't tolerate, 2 Insufficient memory.(內存不足)
    

posted @ 2025-03-11 09:04  講文張字  閱讀(670)  評論(0)    收藏  舉報
返回頂部