Kubernetes(k8s)常用yaml配置和注釋方式
一、pod
1、pod完整定義
# yaml格式的pod定義文件完整內(nèi)容:
apiVersion: v1 #必選,api版本號,例如v1
kind: Pod #必選,Pod
metadata: #必選,元數(shù)據(jù)
name: string #必選,Pod名稱
namespace: string #Pod所屬的命名空間,默認在default的namespace
labels: # 自定義標簽
name: string #自定義標簽名字
annotations: #自定義注釋列表
name: string
spec: #必選,Pod中容器的詳細定義(期望)
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱
image: string #必選,容器的鏡像名稱
imagePullPolicy: [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優(yōu)先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
command: [string] #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
args: [string] #容器的啟動命令參數(shù)列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內(nèi)部的存儲卷配置
- name: string #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名
mountPath: string #存儲卷在容器內(nèi)mount的絕對路徑,應少于512字符
readOnly: boolean #是否為只讀模式
ports: #需要暴露的端口庫號列表
- name: string #端口號名稱
containerPort: int #容器需要監(jiān)聽的端口號
hostPort: int #容器所在主機需要監(jiān)聽的端口號,默認與Container相同
protocol: string #端口協(xié)議,支持TCP和UDP,默認TCP
env: #容器運行前需設置的環(huán)境變量列表
- name: string #環(huán)境變量名稱
value: string #環(huán)境變量的值
resources: #資源限制和請求的設置
limits: #資源限制的設置
cpu: string #Cpu的限制,單位為core數(shù),將用于docker run --cpu-shares參數(shù)
memory: string #內(nèi)存限制,單位可以為Mib/Gib,將用于docker run --memory參數(shù)
requests: #資源請求的設置
cpu: string #Cpu請求,容器啟動的初始可用數(shù)量
memory: string #內(nèi)存清求,容器啟動的初始可用數(shù)量
livenessProbe: #對Pod內(nèi)個容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可
exec: #對Pod容器內(nèi)檢查方式設置為exec方式
command: [string] #exec方式需要制定的命令或腳本
httpGet: #對Pod內(nèi)個容器健康檢查方法設置為HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對Pod內(nèi)個容器健康檢查方式設置為tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啟動完成后首次探測的時間,單位為秒
timeoutSeconds: 0 #對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒
periodSeconds: 0 #對容器監(jiān)控檢查的定期探測時間設置,單位秒,默認10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure] # Pod的重啟策略,Always表示一旦不管以何種方式終止運行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
nodeSelector: obeject # 設置NodeSelector表示將該Pod調(diào)度到包含這個label的node上,以key:value的格式指定
imagePullSecrets: #Pull鏡像時使用的secret名稱,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主機網(wǎng)絡模式,默認為false,如果設置為true,表示使用宿主機網(wǎng)絡
volumes: #在該pod上定義共享存儲卷列表
- name: string #共享存儲卷名稱 (volumes類型有很多種)
emptyDir: {} #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值
hostPath: string #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
path: string #Pod所在宿主機的目錄,將被用于同期中mount的目錄
secret: #類型為secret的存儲卷,掛載集群與定義的secret對象到容器內(nèi)部
scretname: string
items:
- key: string
path: string
configMap: #類型為configMap的存儲卷,掛載預定義的configMap對象到容器內(nèi)部
name: string
items:
- key: string
path: string2、探針
apiVersion: v1
kind: Pod
metadata:
name: liveness-exce
namespace: default
spec:
containers:
- name: liveness
image: busybox
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy;sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # pod啟動延遲5秒后探測
periodSeconds: 5 # 每5秒探測1次
livenessProbe:
httpGet: # 使用httpGet方式
port: http # http協(xié)議,也可以直接寫80端口
path: /index.html # 探測家目錄下的index.html
initialDelaySeconds: 3 # 延遲3秒開始探測
periodSeconds: 5 # 每隔5s鐘探測一次
livenessProbe:
tcpSocket: # 使用tcp連接方式
port: 80 # 連接80端口進行探測
initialDelaySeconds: 3
periodSeconds: 5
readinessProbe: # 這里由liveness換成了readiness
httpGet:
port: http
path: /index.html
initialDelaySeconds: 3
periodSeconds: 5
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
readinessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 5
periodSeconds: 5
3、post-start、pre-stop
容器啟動前和停止前執(zhí)行的操作:
apiVersion: v1
kind: Pod
metadata:
name: prestop
namespace: default
spec:
containers:
- name: prestop
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
lifecycle: # 生命周期事件
preStop: # preStop
exec:
command: ["/bin/sh","-c","sleep 60000000"] # 容器終止前sleep 60000000秒
postStart:
exec:
command: ["mkdir","-p","/usr/share/nginx/html/haha"]二、Controller
1、Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment # Deployment 的名稱
spec:
replicas: 3 # 副本數(shù)
selector:
matchLabels:
app: my-app # 用于選擇 Pod 的標簽,表示deployment和rs控制器控制帶有此標簽的pod
template: # pod配置模板
metadata:
labels:
app: my-app # Pod 的標簽,用于與選擇器匹配
spec:
containers:
- name: my-container # 容器的名稱
image: nginx # 使用的容器鏡像
ports:
- containerPort: 80 # 容器內(nèi)部暴露的端口號
protocol: TCP # 端口的協(xié)議類型
resources: # 容器所需的資源限制和需求
limits:
cpu: "0.5" # CPU 使用上限
memory: "256Mi" # 內(nèi)存使用上限
requests:
cpu: "0.2" # CPU 最小需求
memory: "128Mi" # 內(nèi)存最小需求
env: # 容器的環(huán)境變量
- name: ENV_VAR1
value: value1
- name: ENV_VAR2
valueFrom:
secretKeyRef:
name: my-secret # 引用的 Secret 對象的名稱
key: secret-key # 從 Secret 對象中獲取的鍵名
volumeMounts: # 容器的掛載路徑
- name: data-volume # 掛載的卷的名稱
mountPath: /data # 掛載的路徑
volumes: # Pod 的卷
- name: data-volume # 卷的名稱
emptyDir: {} # 空的卷,生命周期與 Pod 相關聯(lián)
# 可以添加 metadata.annotations 字段用于存放其他注釋信息
metadata:
annotations:
description: This is a sample Deployment configuration file. # 描述該配置文件的注釋
2、StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-statefulset # StatefulSet 的名稱
spec:
selector:
matchLabels:
app: my-app # 匹配標簽,用于選擇要管理的 Pod
serviceName: my-service # Headless Service 的名稱
replicas: 3 # 副本數(shù)
template:
metadata:
labels:
app: my-app # Pod 的標簽
spec:
containers:
- name: my-container # 容器的名稱
image: nginx # 容器的鏡像
ports:
- containerPort: 80 # 容器監(jiān)聽的端口號
volumeMounts:
- name: data-volume # 掛載卷的名稱
mountPath: /data # 掛載到容器中的路徑
volumeClaimTemplates:
- metadata:
name: data-volume # 持久化存儲卷模板的名稱
spec:
accessModes:
- ReadWriteOnce # 訪問模式
resources:
requests:
storage: 1Gi # 存儲容量
StatefulSet 是用于管理有狀態(tài)應用程序的控制器,它保證 Pod 的唯一性和穩(wěn)定性,并按照序號進行命名。
在上述示例中,創(chuàng)建了一個包含 3 個副本的 StatefulSet,每個副本都會被命名為 my-statefulset-{0…2}。
StatefulSet 是用于管理有狀態(tài)應用程序的控制器,它保證 Pod 的唯一性和穩(wěn)定性,并按照序號進行命名。
在上述示例中,創(chuàng)建了一個包含 3 個副本的 StatefulSet,每個副本都會被命名為 my-statefulset-{0…2}。
3、DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset # DaemonSet 的名稱
spec:
selector:
matchLabels:
app: my-app # 匹配標簽,用于選擇要管理的節(jié)點上的 Pod
template:
metadata:
labels:
app: my-app # Pod 的標簽
spec:
containers:
- name: my-container # 容器的名稱
image: nginx # 容器的鏡像
ports:
- containerPort: 80 # 容器監(jiān)聽的端口號
volumeMounts:
- name: data-volume # 掛載卷的名稱
mountPath: /data # 掛載到容器中的路徑
nodeSelector:
disktype: ssd # 節(jié)點的標簽選擇器,用于選擇帶有指定標簽的節(jié)點
updateStrategy:
type: RollingUpdate # 更新策略為滾動更新
rollingUpdate:
maxUnavailable: 1 # 在更新期間最多允許一個 Pod 不可用
volumeClaimTemplates:
- metadata:
name: data-volume # 持久化存儲卷模板的名稱
spec:
accessModes:
- ReadWriteOnce # 訪問模式
resources:
requests:
storage: 1Gi # 存儲容量
DaemonSet 是用于在每個節(jié)點上運行一個 Pod 的控制器,它保證每個節(jié)點上都有一個唯一的 Pod 進行運行,并自動適應節(jié)點變化。
在上述示例中,創(chuàng)建了一個 DaemonSet,每個節(jié)點上都會運行一個 Pod,該 Pod 將被命名為 my-daemonset-{node-name}。
DaemonSet 還包含了 volumeClaimTemplates 字段,用于定義持久化存儲卷模板。
在上述示例中,使用了一個名為 data-volume 的持久化存儲卷模板,訪問模式為 ReadWriteOnce,存儲容量為 1GB。Pod 將根據(jù)該模板創(chuàng)建一個與之對應的持久化存儲卷。
通過使用 DaemonSet 和持久化存儲卷,可以在集群的每個節(jié)點上運行一個 Pod,并確保應用程序的數(shù)據(jù)持久化和可靠性存儲。
由于 DaemonSet 會自動適應節(jié)點變化,因此在增加或刪除節(jié)點時,應用程序的數(shù)據(jù)不會丟失或受影響。
4、Job
apiVersion: batch/v1
kind: Job
metadata:
name: my-job # Job 的名稱
spec:
completions: 1 # 完成的任務數(shù)
parallelism: 1 # 并行運行的 Pod 數(shù)量
template:
metadata:
name: my-pod # Pod 的名稱
spec:
restartPolicy: Never # 不重啟容器
containers:
- name: my-container # 容器的名稱
image: nginx # 容器的鏡像
command: ["echo", "Hello, world!"] # 容器啟動命令
volumes:
- name: data-volume # 卷的名稱
emptyDir: {} # 空的臨時卷
backoffLimit: 3 # 重試次數(shù)上限
Job 是用于在 Kubernetes 中運行一次性任務的控制器。
在上述示例中,創(chuàng)建了一個 Job,其中包含一個 Pod,Pod 中運行了一個名為 my-container 的容器,該容器使用 nginx 鏡像,并執(zhí)行了 echo “Hello, world!” 命令。
Job 的配置還包括一些重要的字段,如 completions(完成的任務數(shù))和 parallelism(并行運行的 Pod 數(shù)量)。completions 字段指定了 Job 完成的任務數(shù),一旦達到該數(shù)量,Job 就會被標記為成功。parallelism 字段指定了同時運行的 Pod 數(shù)量,可以控制并行執(zhí)行任務的速度。
另外,還有一些其他常用的字段,例如 restartPolicy(容器的重啟策略),volumes(卷的定義)和 backoffLimit(重試次數(shù)上限)。這些參數(shù)可以根據(jù)業(yè)務需求進行調(diào)整和配置。
通過使用 Job 控制器,可以在 Kubernetes 中運行一次性任務,并確保任務的完成和可靠性運行。由于 Job 可以指定任務數(shù)量和并行度,可以很好地適應不同規(guī)模和要求的任務場景。
5、ConJob
apiVersion: batch/v1beta1 # 使用的 API 版本
kind: CronJob # CronJob 類型
metadata:
name: my-cronjob # CronJob 的名稱
spec:
schedule: "*/1 * * * *" # Cron 表達式,用于定義作業(yè)執(zhí)行的時間表
jobTemplate: # 作業(yè)模板,指定 CronJob 創(chuàng)建的作業(yè)配置
spec:
template:
metadata:
name: my-job # 作業(yè)的名稱
spec:
restartPolicy: OnFailure # 容器的重啟策略
containers:
- name: my-container # 容器的名稱
image: nginx # 容器的鏡像
command: ["echo", "Hello, world!"] # 容器啟動命令
successfulJobsHistoryLimit: 5 # 歷史成功作業(yè)保存的數(shù)量上限
failedJobsHistoryLimit: 5 # 歷史失敗作業(yè)保存的數(shù)量上限
CronJob 是 Kubernetes 中的一種控制器,用于定期運行作業(yè)。在上述示例中,創(chuàng)建了一個 CronJob,其中定義了一個 Cron 表達式 */1 * * * *,表示每分鐘執(zhí)行一次作業(yè)。
CronJob 的配置還包括使用 jobTemplate 指定了創(chuàng)建作業(yè)的模板。在這個模板中,指定了作業(yè)的 Pod 配置,其中包含一個名為 my-container 的容器,使用 nginx 鏡像,并執(zhí)行了 echo “Hello, world!” 命令。
除了基本的配置外,還有一些其他常用的字段。例如,successfulJobsHistoryLimit 和 failedJobsHistoryLimit 字段分別指定歷史成功和失敗作業(yè)保存的數(shù)量上限,可以根據(jù)需求進行調(diào)整。
通過使用 CronJob 控制器,可以定期運行作業(yè),并對作業(yè)的運行情況進行管理和記錄。CronJob 的配置文件中的注釋可以幫助我們理解每個字段的含義和作用,方便后續(xù)管理和維護。
三、Service
1、ClusterIP
當服務的類型為 ClusterIP 時,它會為集群內(nèi)部的其他組件分配一個虛擬 IP 地址,并使用服務監(jiān)聽端口來接收來自其他組件的請求。這樣,其他 Pod 或服務就可以通過服務的虛擬 IP 地址和監(jiān)聽端口與服務進行通信。
kind: Service
apiVersion: v1
metadata:
name: my-service
namespace: app # namespace
spec:
type: ClusterIP
#clusterIP: None # None代表是無頭service
ports:
- port: 8080 # 集群內(nèi)部的服務監(jiān)聽端口
targetPort: 80 # Pod 內(nèi)部的端口
selector: # 標簽選擇器
app: my-app # 指向該標簽的pod
sessionAffinity: ClientIP # sessionAffinity為Clientip (類似nginx的ip_hash算法,lvs的sh算法)
服務名稱為 my-service,類型為 ClusterIP,它監(jiān)聽端口 8080,并將請求轉(zhuǎn)發(fā)到 Pod 內(nèi)部的 80 端口。其他組件可以通過訪問 my-service:8080 來與服務進行通信。
需要注意的是,集群內(nèi)部的服務監(jiān)聽端口通常是在集群內(nèi)部使用的端口,不直接暴露給外部請求。
如果您需要將服務公開到集群外部,可以考慮使用其他類型的服務,如 NodePort 或 LoadBalancer。
擴展:
- ClusterIP根據(jù)是否生成ClusterIP又可分為普通Service和Headless Service。
- 普通的ClusterIP service是service name解析為cluster ip,然后cluster ip對應到后面的pod ip。
- Headless service是指service name 直接解析為后面的pod ip。實際上Headless service用處不大,dns貌似沒效果需要額外配置
2、NodePort
在NodePort的YAML文件中,ports 下的 port 字段表示服務在集群內(nèi)部使用的端口號。這是服務對內(nèi)提供服務的端口,其他 Pod 可以通過該端口與服務進行通信。
nodePort 字段表示服務在節(jié)點上公開的端口號。當服務類型為 NodePort 時,Kubernetes 隨機分配一個未使用的端口號,并將該端口號映射到每個節(jié)點上。這樣,您可以通過節(jié)點的 IP 地址和 nodePort 端口號來訪問服務。
targetPort 字段是服務所指向的 Pod 的端口。當請求到達 nodePort 監(jiān)聽的端口時,它將被轉(zhuǎn)發(fā)到目標端口(targetPort)上的 Pod 進行處理。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30000
selector:
app: my-app# 指向該標簽的pod
該示例中,服務名稱為 my-service,通過 NodePort 類型將集群中的應用程序暴露到節(jié)點的 30000 端口上。集群內(nèi)部的服務監(jiān)聽端口為 80,將請求轉(zhuǎn)發(fā)到 Pod 上的 8080 端口。
請注意,NodePort 的端口范圍是 30000-32767,確保選擇一個未被占用的端口號。
3、LoadBalancer
需要部署額外的負載均衡器。
apiVersion: v1
kind: Service
metadata:
name: my-service # Service 的名稱
spec:
selector:
app: my-app # 選擇要路由到的 Pod 的標簽
ports:
- name: http # 端口的名稱
protocol: TCP # 端口的協(xié)議類型
port: 80 # Service 暴露的端口號
targetPort: 8080 # 路由到的 Pod 的端口號
type: LoadBalancer # Service 的類型,可以是 ClusterIP、NodePort 或者 LoadBalancer
4、ExternalName
把集群外部的服務引入到集群內(nèi)部中來,實現(xiàn)了集群內(nèi)部pod和集群外部的服務進行通信。
ExternalName 類型的服務適用于外部服務使用域名的方式,缺點是不能指定端口
還有一點要注意: 集群內(nèi)的Pod會繼承Node上的DNS解析規(guī)則。所以只要Node可以訪問的服務,Pod中也可以訪問到, 這就實現(xiàn)了集群內(nèi)服務訪問集群外服務
apiVersion: v1 kind: Service metadata: name: my-externalname namespace: default spec: type: ExternalName externalName: www.baidu.com # 對應的外部域名為www.baidu.com
四、Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress # Ingress 的名稱
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1 # 添加 NGINX Ingress 控制器的注解,用于重寫 URL
spec:
rules:
- host: example.com # 定義要匹配的域名
http:
paths:
- path: /appA # URL 路徑
pathType: Prefix # 路徑匹配類型,可以是 Prefix 或 Exact
backend:
service:
name: appA-service # 要路由到的 Service 的名稱
port:
number: 80 # 路由到的 Service 的端口號
- path: /appB(/|$)(.*) # 使用正則表達式匹配 URL 路徑
pathType: Prefix # 路徑匹配類型,可以是 Prefix 或 Exact
backend:
service:
name: appB-service # 要路由到的 Service 的名稱
port:
number: 80 # 路由到的 Service 的端口號
五、ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap # ConfigMap 的名稱
data:
server.conf: |
# Server 配置文件
port=8080
host=localhost
client.conf: |
# Client 配置文件
timeout=5000
retries=3
需要注意的是,
ConfigMap 的配置文件可以包含多個鍵值對,鍵名和對應的值可以是任意字符串類型,例如文件內(nèi)容、環(huán)境變量、命令行參數(shù)等。
在使用 ConfigMap 時,可以將其掛載到 Pod 中的容器內(nèi),從而使容器可以輕松地訪問配置信息。
為了更好地管理和維護 ConfigMap,建議使用有意義的名稱和注釋對其進行命名和描述。
六、Secret
apiVersion: v1 kind: Secret metadata: name: my-secret # Secret 的名稱 type: Opaque # Secret 類型(Opaque 表示任意類型) data: username: dXNlcm5hbWU= # 加密后的用戶名 password: cGFzc3dvcmQ= # 加密后的密碼
Secret 的配置文件包含敏感信息,如用戶名、密碼等,需要進行加密處理。在 YAML 文件中,可以將敏感信息以 base64 編碼的方式保存在 data 字段中,以保證安全性。
七、Volume
apiVersion: v1
kind: Pod
metadata:
name: my-pod # Pod 的名稱
spec:
containers:
- name: my-container # 容器的名稱
image: nginx # 容器的鏡像
volumeMounts:
- name: data-volume # 掛載卷的名稱
mountPath: /data # 掛載到容器中的路徑
volumes:
- name: data-volume # 卷的名稱
emptyDir: {} # 空目錄卷
Volume 的配置文件可以包含多個卷定義,每個卷可以是不同類型的卷(如 emptyDir、hostPath、persistentVolumeClaim 等)。在上述示例中,使用的是 emptyDir 類型的卷,它會在 Pod 運行時創(chuàng)建一個空目錄,并將其掛載到容器內(nèi)的指定路徑。
訪問模式:
在 Kubernetes 中,訪問模式(Access Modes)是用來定義持久化存儲卷(Persistent Volume)的訪問方式的。下面是 Kubernetes 支持的三種訪問模式:
- ReadWriteOnce(RWO):該訪問模式表示該存儲卷可以被單個節(jié)點以讀寫方式掛載。這意味著同一時間內(nèi)只能有一個 Pod 能夠掛載并對存儲卷進行讀寫操作。當存儲卷被某個節(jié)點上的 Pod 掛載時,它將成為該節(jié)點的專屬卷,在其他節(jié)點上不可見。
- ReadOnlyMany(ROX):該訪問模式表示該存儲卷可以以只讀方式被多個節(jié)點掛載。多個 Pod 可以共享對存儲卷的只讀訪問權限,但不能進行寫入操作。
- ReadWriteMany(RWX):該訪問模式表示該存儲卷可以以讀寫方式被多個節(jié)點掛載。多個 Pod 可以同時掛載并對存儲卷進行讀寫操作,即具有讀寫共享的功能。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Kubernetes k8s configmap 容器技術解析
這篇文章主要為大家介紹了k8s configmap 容器技術解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
K8S中某個容器突然出現(xiàn)內(nèi)存和CPU占用過高的問題及解決方案
當K8S容器出現(xiàn)資源過載時,可通過kubectl監(jiān)控定位問題,調(diào)整資源限制,優(yōu)化應用代碼,拆分多應用容器,利用監(jiān)控工具排查,實施水平擴展或遷移負載,確保集群穩(wěn)定運行2025-07-07
kubernetes k8s 存儲動態(tài)掛載配置詳解
這篇文章主要為大家介紹了kubernetes k8s 存儲動態(tài)掛載配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

