目錄
- 一、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、檢視資源有那些資源清單屬性
- 三、常用欄位解釋
- 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
1.2.2、檢視pvc資源的資源清單屬性
kubectl explain pvc
1.2.3、檢視statefulset資源的資源清單屬性
kubectl explain statefulset
2、檢視屬性的說明
2.1、格式
kubectl explain 資源型別.屬性
2.2、示例
2.2.1、檢視statefulset.status屬性說明
kubectl explain statefulset.status
三、常用欄位解釋
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 在遇到故障的時候的處理策略