<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      掌握 K8s Pod 基礎應用 (一)

      Kubernetes 官方文檔Pod 詳解

      Pod 介紹

      Pod結構

      每個Pod中都可以包含一個或者多個容器,這些容器可以分為兩類:

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

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

        • 可以以它為依據,評估整個Pod的健康狀態

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

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

      Pod定義

      下面是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中基本所有資源的一級屬性都是一樣的,主要包含5部分:

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

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

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

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

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

        在上面的屬性中,spec是接下來研究的重點,繼續看下它的常見子屬性:

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

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

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

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

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

        • 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文件,內容如下:

        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
        

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

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

        • busybox:用1.30版本的busybox鏡像創建,(busybox是一個小巧的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文件,內容如下:

        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,用于設置鏡像拉取策略,kubernetes支持配置三種拉取策略:

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

        • IfNotPresent:本地有則使用本地鏡像,本地沒有則從遠程倉庫拉取鏡像(本地有就本地 本地沒遠程下載)

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

        默認值說明:

        如果鏡像tag為具體版本號, 默認策略是:IfNotPresent

        如果鏡像tag為:latest(最終版本) ,默認策略是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
        

        啟動命令

        在前面的案例中,一直有一個問題沒有解決,就是的busybox容器一直沒有成功運行,那么到底是什么原因導致這個容器的故障呢?

        原來busybox并不是一個程序,而是類似于一個工具類的集合,kubernetes集群啟動管理后,它會自動關閉。解決方法就是讓其一直在運行,這就用到了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中的容器初始化完畢之后運行一個命令。

        稍微解釋下上面命令的意思:

        "/bin/sh","-c", 使用sh執行命令

        touch /tmp/hello.txt; 創建一個/tmp/hello.txt 文件

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

        # 創建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文件,內容如下:

        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,環境變量,用于在pod中的容器設置環境變量。

        # 創建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
        

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

        端口設置

        本文來介紹容器的端口設置,也就是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”。
        

        接下來,編寫一個測試案例,創建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

        資源配額

        容器中的程序要運行,肯定是要占用一定資源的,比如cpu和內存等,如果不對某個容器的資源做限制,那么它就可能吃掉大量資源,導致其它容器無法運行。針對這種情況,kubernetes提供了對內存和cpu的資源進行配額的機制,這種機制主要通過resources選項實現,他有兩個子選項:

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

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

        可以通過上面兩個選項設置資源的上下限。

        接下來,編寫一個測試案例,創建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"  # 內存限制
        

        在這對cpu和memory的單位做一個說明:

        • cpu:core數,可以為整數或小數

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

        # 運行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  講文張字  閱讀(668)  評論(0)    收藏  舉報
      返回頂部
      主站蜘蛛池模板: av大片在线无码免费| 熟女系列丰满熟妇AV| 国产av中文字幕精品| 99在线视频免费观看| 老师破女学生处特级毛ooo片| 国产色悠悠综合在线观看| 国产av一区二区三区| 狼色精品人妻在线视频| 少妇午夜啪爽嗷嗷叫视频| 国模冰莲自慰肥美胞极品人体图| 欧美日韩人人模人人爽人人喊| 性欧美VIDEOFREE高清大喷水| 彭水| 国产精品第二页在线播放| 亚洲av专区一区| 国产精品国产三级国产专i| 国产良妇出轨视频在线观看| 精品视频在线观看免费观看| 成人中文在线| 亚洲综合中文字幕首页| 视频一区二区三区刚刚碰| 国产乱子影视频上线免费观看| 色二av手机版在线| 9l精品人妻中文字幕色| 99久久久国产精品免费无卡顿| 亚洲婷婷综合色高清在线| AV无码免费不卡在线观看| 377p日本欧洲亚洲大胆张筱雨| 欧美激情一区二区三区成人| 伊人天天久大香线蕉av色| 亚洲日韩一区精品射精| 亚洲老女人区一区二视频| 猫咪社区免费资源在线观看| 亚洲一区二区三区在线播放无码| 亚洲国产av剧一区二区三区 | 中国女人熟毛茸茸A毛片| 林西县| 人妻无码久久久久久久久久久 | 欧美亚洲另类自拍偷在线拍| 国产片一区二区三区视频| 国产不卡一区二区在线|