k8s資源清單

misakivv發表於2024-07-16

目錄
  • 一、k8s中的資源
    • 1、叢集資源分類
    • 2、什麼是資源
    • 3、叢集資源概述
      • 3.1、名稱空間級別
      • 3.2、叢集級資源
      • 3.3、後設資料型資源
  • 二、檢視資源清單屬性
    • 1、檢視資源有那些資源清單屬性
      • 1.1、格式
      • 1.2、示例
        • 1.2.1、檢視pod資源的資源清單屬性
        • 1.2.2、檢視pvc資源的資源清單屬性
        • 1.2.3、檢視statefulset資源的資源清單屬性
    • 2、檢視屬性的說明
      • 2.1、格式
      • 2.2、示例
        • 2.2.1、檢視statefulset.status屬性說明
  • 三、常用欄位解釋
    • 1、必選欄位
    • 2、主要欄位
    • 3、額外欄位
  • 四、Pod資源清單詳解
  • 五、Deployment資源清單詳解
  • 六、Service資源清單詳解

一、k8s中的資源

1、叢集資源分類

  • 名稱空間級別:只在本名稱空間下生效(kube-system、default)
  • 叢集級別:role,在定義時未指定名稱空間
  • 後設資料型:HPA--透過指標進行操作

2、什麼是資源

k8s中所有的內容都抽象為資源,資源例項化之後,叫做物件。

3、叢集資源概述

3.1、名稱空間級別

工作負載型資源(workload):

  • Pod:Kubernetes中最基本的可排程單位,可以包含一個或多個容器,共享儲存和網路資源。
  • ReplicaSet:確保叢集中始終執行著指定數量的Pod副本,是Deployment的基礎。
  • Deployment:提供宣告式的更新能力,用於管理應用的生命週期,包括滾動更新和回滾。
  • StatefulSet:為有狀態應用提供管理,確保每個Pod都有一個穩定的唯一標識和持久儲存。
  • DaemonSet:確保所有(或某些)節點上執行一個Pod的副本,常用於系統日誌、監控等服務。
  • Job:用於完成一次性任務的資源,確保Pod成功執行並完成其工作。
  • CronJob:用於定時執行Jobs,類似於Linux的cron。

服務發現及負載均衡型資源(ServiceDiscovery LoadBalance)

  • Service:定義應用的服務端點,用於在叢集內部或外部訪問應用。Service可以實現負載均衡和服務發現。
  • Ingress:提供了外部訪問叢集內服務的路由規則,通常與負載均衡器或反向代理結合使用。

配置與儲存型資源:

  • Volume:持久化儲存的抽象,可以被Pod使用,支援多種儲存型別,如空目錄、主機路徑、雲端儲存等。
  • CSI:容器儲存介面,允許Kubernetes與外部儲存系統整合,支援廣泛的儲存解決方案。

特殊型別的儲存卷:

  • ConfigMap:用於儲存非機密的配置資料,可以被Pod作為環境變數或檔案掛載。
  • Secret:用於儲存敏感資訊,如密碼、SSH金鑰、TLS證書等,加密儲存並安全傳遞給Pod。
  • Downward API:允許Pod訪問自身和Pod的後設資料,如Pod IP、節點名稱、重啟次數等

3.2、叢集級資源

  • Namespace:用於邏輯隔離資源,便於多租戶和資源配額管理。
  • Node:代表叢集中的物理或虛擬機器,是Pod執行的實際環境。
  • Role & ClusterRole:定義許可權,用於RBAC(基於角色的訪問控制)。
  • RoleBinding & ClusterRoleBinding:將Role或ClusterRole繫結到使用者或使用者組,授予他們特定的許可權。

3.3、後設資料型資源

透過指標進行操作

  • HPA (Horizontal Pod Autoscaler):根據CPU使用率或其他指標自動調整Pod副本的數量。
  • PodTemplate:Pod的模板,用於建立具有相同配置的Pod。
  • LimitRange:定義資源配額,限制Pod和容器能使用的資源量,如CPU、記憶體。

二、檢視資源清單屬性

1、檢視資源有那些資源清單屬性

1.1、格式

kubectl explain 資源型別

1.2、示例

1.2.1、檢視pod資源的資源清單屬性

kubectl explain pod

image-20240716001027411

1.2.2、檢視pvc資源的資源清單屬性

kubectl explain pvc

image-20240716001121292

1.2.3、檢視statefulset資源的資源清單屬性

kubectl explain statefulset

image-20240716001224770

2、檢視屬性的說明

2.1、格式

kubectl explain 資源型別.屬性

2.2、示例

2.2.1、檢視statefulset.status屬性說明

kubectl explain statefulset.status

image-20240716001511187

三、常用欄位解釋

1、必選欄位

引數名 欄位型別 說明
version String 指 K8s API 的版本,目前基本上是 v1 ,可以用 kubectl api-versions 命令查詢
kind String 指 yaml 檔案定義的資源型別和角色,比如:Pod
metadata Object 後設資料物件
metadata.name String 後設資料物件的名字,比如命名 Pod 的名字
metadata.namespace String 後設資料物件的名稱空間(預設default)
spec Object 詳細定義物件
spec.containers[] List 容器列表的定義
spec.containers[].name String 容器的名字
spec.containers[].image String 容器映象的名稱

2、主要欄位

引數名 欄位型別 說明
spec.containers[].imagePullPolicy String 定義映象的拉取策略,有Always、Never、IfNotPresent三個值可選,(1)Always:意思是每次都嘗試重新拉取映象,(2)Never:表示僅使用本地映象,(3)IfNotPresent:如果本地有映象就使用本地映象,沒有就拉取線上映象。上面三個值都沒設定的話,預設是Always。
spec.containers[].command[] List 指定容器啟動命令,因為是陣列可以指定多個,不指定則使用映象打包時使用的啟動命令。
spec.containers[].args[] List 批定容器啟動命令引數,因為是陣列可以指定多個。
spec.containers[].workingDir String 指定容器的工作目錄
spec.containers[].volumeMounts[] List 指定容器內部的儲存卷位置
spec.containers[].volumeMounts[].name String 指定可以被容器掛載的儲存卷的名稱
spec.containers[].volumeMounts[].mountPath String 指定可以被掛載的儲存卷的路徑
spec.containers[].volumeMounts[].readOnly String 設定儲存卷路徑的讀寫模式,true或者false,預設為讀寫模式
spec.containers[].ports[] List 指定容器需要用到的埠列表
spec.containers[].ports[].name String 指定埠名稱
spec.containers[].ports[].containerPort String 指定容器需要監聽的埠號
spec.containers[].ports[].hostPort String 指定容器所在主機需要監聽的埠號,預設跟上面containerPort相同,注意設定了hostPort同一臺主機無法啟動該容器的相同副本(會埠衝突)
spec.containers[].ports[].protocol String 指定埠協議,支援TCP和UDP,預設為TCP
spec.containers[].env[] List 指定容器執行前需要設定的環境變數列表
spec.containers[].env[].name String 指定環境變數名稱
spec.containers[].env[].value String 指定環境變數值
spec.containers[].resources Object 指定資源限制和資源請求的值(這裡開始就是設定容器的資源上限)
spec.containers[].resources.limits Object 指定設定容器執行時資源的執行上限
spec.containers[].resources.limits.cpu String 指定CPU限制,單位為core數,將用於docker run --cpu-shares引數
spec.containers[].resources.limits.memory String 指定MEM記憶體的限制,單位為MIB、GiB
spec.containers[].resources.requests Object 指定容器啟動和排程時的限制設定
spec.containers[].resources.requests.cpu String CPU請求,單位為core數,容器啟動時初始化可用數量
spec.containers[].resources.requests.memory String 記憶體請求,單位為MIB、GiB,容器啟動時初始化可用數量

3、額外欄位

引數名 欄位型別 說明
spec.restartPolicy String 定義Pod的重啟策略,可選值為Always、OnFailure、預設為Always。 1. Always:Pod一旦終止執行,則無論容器是如何終止的,kubelet服務都將重啟它 2.OnFailure:只有Pod以非零退出碼終止時,kubelet才會重啟該容器。如果容器正常結束(退出碼為0),則kubelet不會重啟它。 3.Never:Pod終止後,kubelet將退出碼報告給master,不會重啟該Pod
spec.nodeSelector Object 定義Node的Label過濾標籤,以key:value格式指定
spec.imagePullSecrets Object 定義pull映象時使用secret名稱,以name:secretkey格式指定
spec.hostNetwork Boolean 定義是否使用主機網路模式,預設值是false,設定true表示使用主機網路,不使用docker網橋,同時設定了true將無法在同一臺宿主機上啟動第二個副本

四、Pod資源清單詳解

# yaml格式的pod定義檔案完整內容:
apiVersion: v1       #必選,版本號,例如v1
kind: Pod       #必選,Pod
metadata:       #必選,後設資料
  name: string       #必選,Pod名稱
  namespace: string    #必選,Pod所屬的名稱空間
  labels:      #自定義標籤
    - name: string     #自定義標籤名字
  annotations:       #自定義註釋列表
    - name: string
spec:         #必選,Pod中容器的詳細定義
  containers:      #必選,Pod中容器列表
  - name: string     #必選,容器名稱
    image: string    #必選,容器的映象名稱
    imagePullPolicy: [Always | Never | IfNotPresent] #獲取映象的策略 Alawys表示下載映象 IfnotPresent表示優先使用本地映象,否則下載映象,Nerver表示僅使用本地映象
    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     #記憶體清楚,容器啟動的初始可用數量
    livenessProbe:     #對Pod內個容器健康檢查的設定,當探測無響應幾次後將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設定其中一種方法即可
      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的重啟策略,Always表示一旦不管以何種方式終止執行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
    nodeSelector: obeject  #設定NodeSelector表示將該Pod排程到包含這個label的node上,以key:value的格式指定
    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的儲存卷,掛載叢集與定義的secre物件到容器內部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:     #型別為configMap的儲存卷,掛載預定義的configMap物件到容器內部
        name: string
        items:
        - key: string
          path: string

五、Deployment資源清單詳解

apiVersion: extensions/v1beta1   #介面版本
kind: Deployment                 #介面型別
metadata:
  name: cango-demo               #Deployment名稱
  namespace: cango-prd           #名稱空間
  labels:
    app: cango-demo              #標籤
spec:
  replicas: 3
   strategy:
    rollingUpdate:  ##由於replicas為3,則整個升級,pod個數在2-4個之間
      maxSurge: 1      #滾動升級時會先啟動1個pod
      maxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數
  template:         
    metadata:
      labels:
        app: cango-demo  #模板名稱必填
    sepc: #定義容器模板,該模板可以包含多個容器
      containers:                                                                   
        - name: cango-demo                                                           #映象名稱
          image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #映象地址
          command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ]    #啟動命令
          args:                                                                #啟動引數
            - '-storage.local.retention=$(STORAGE_RETENTION)'
            - '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'
            - '-config.file=/etc/prometheus/prometheus.yml'
            - '-alertmanager.url=http://alertmanager:9093/alertmanager'
            - '-web.external-url=$(EXTERNAL_URL)'
    #如果command和args均沒有寫,那麼用Docker預設的配置。
    #如果command寫了,但args沒有寫,那麼Docker預設的配置會被忽略而且僅僅執行.yaml檔案的command(不帶任何引數的)。
    #如果command沒寫,但args寫了,那麼Docker預設配置的ENTRYPOINT的命令列會被執行,但是呼叫的引數是.yaml中的args。
    #如果如果command和args都寫了,那麼Docker預設的配置被忽略,使用.yaml的配置。
          imagePullPolicy: IfNotPresent  #如果不存在則拉取
          livenessProbe:       #表示container是否處於live狀態。如果LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨後kubelet將kill掉container,並根據RestarPolicy進行進一步的操作。預設情況下LivenessProbe在第一次檢測之前初始化值為Success,如果container沒有提供LivenessProbe,則也認為是Success;
            httpGet:
              path: /health #如果沒有心跳檢測介面就為/
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60 ##啟動後延時多久開始執行檢測
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 5
            readinessProbe:
          readinessProbe:
            httpGet:
              path: /health #如果沒有心跳檢測介面就為/
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 30 ##啟動後延時多久開始執行檢測
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 5
          resources:              ##CPU記憶體限制
            requests:
              cpu: 2
              memory: 2048Mi
            limits:
              cpu: 2
              memory: 2048Mi
          env:                    ##透過環境變數的方式,直接傳遞pod=自定義Linux OS環境變數
            - name: LOCAL_KEY     #本地Key
              value: value
            - name: CONFIG_MAP_KEY  #局策略可使用configMap的配置Key,
              valueFrom:
                configMapKeyRef:
                  name: special-config   #configmap中找到name為special-config
                  key: special.type      #找到name為special-config裡data下的key
          ports:
            - name: http
              containerPort: 8080 #對service暴露埠
          volumeMounts:     #掛載volumes中定義的磁碟
          - name: log-cache
            mount: /tmp/log
          - name: sdb       #普通用法,該卷跟隨容器銷燬,掛載一個目錄
            mountPath: /data/media    
          - name: nfs-client-root    #直接掛載硬碟方法,如掛載下面的nfs目錄到/mnt/nfs
            mountPath: /mnt/nfs
          - name: example-volume-config  #高階用法第1種,將ConfigMap的log-script,backup-script分別掛載到/etc/config目錄下的一個相對路徑path/to/...下,如果存在同名檔案,直接覆蓋。
            mountPath: /etc/config       
          - name: rbd-pvc                #高階用法第2中,掛載PVC(PresistentVolumeClaim)
 
#使用volume將ConfigMap作為檔案或目錄直接掛載,其中每一個key-value鍵值對都會生成一個檔案,key為檔名,value為內容,
  volumes:  # 定義磁碟給上面volumeMounts掛載
  - name: log-cache
    emptyDir: {}
  - name: sdb  #掛載宿主機上面的目錄
    hostPath:
      path: /any/path/it/will/be/replaced
  - name: example-volume-config  # 供ConfigMap檔案內容到指定路徑使用
    configMap:
      name: example-volume-config  #ConfigMap中名稱
      items:
      - key: log-script           #ConfigMap中的Key
        path: path/to/log-script  #指定目錄下的一個相對路徑path/to/log-script
      - key: backup-script        #ConfigMap中的Key
        path: path/to/backup-script  #指定目錄下的一個相對路徑path/to/backup-script
  - name: nfs-client-root         #供掛載NFS儲存型別
    nfs:
      server: 10.42.0.55          #NFS伺服器地址
      path: /opt/public           #showmount -e 看一下路徑
  - name: rbd-pvc                 #掛載PVC磁碟
    persistentVolumeClaim:
      claimName: rbd-pvc1         #掛載已經申請的pvc磁碟

六、Service資源清單詳解

apiVersion: v1
kind: Service
matadata:                                #後設資料
  name: string                           #service的名稱
  namespace: string                      #名稱空間  
  labels:                                #自定義標籤屬性列表
    - name: string
  annotations:                           #自定義註解屬性列表  
    - name: string
spec:                                    #詳細描述
  selector: []                           #label selector配置,將選擇具有label標籤的Pod作為管理 
                                         #範圍
  type: string                           #service的型別,指定service的訪問方式,預設為 
                                         #clusterIp
  clusterIP: string                      #虛擬服務地址      
  sessionAffinity: string                #是否支援session
  ports:                                 #service需要暴露的埠列表
  - name: string                         #埠名稱
    protocol: string                     #埠協議,支援TCP和UDP,預設TCP
    port: int                            #服務監聽的埠號
    targetPort: int                      #需要轉發到後端Pod的埠號
    nodePort: int                        #當type = NodePort時,指定對映到物理機的埠號
  status:                                #當spce.type=LoadBalancer時,設定外部負載均衡器的地址
    loadBalancer:                        #外部負載均衡器    
      ingress:                           #外部負載均衡器 
        ip: string                       #外部負載均衡器的Ip地址值
        hostname: 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 在遇到故障的時候的處理策略

相關文章