之前的文章給大家介紹過(guò)k8s的基本概念,本文為大家介紹k8s的實(shí)戰(zhàn)操作,本文整理自Kubernetes二小時(shí)入門教程锌订,僅為個(gè)人學(xué)習(xí)使用,部分步驟例如k8s安裝等不會(huì)詳細(xì)列出薪缆,有興趣的同學(xué)可以點(diǎn)擊原文查看詳細(xì)教程挽绩。
為什么k8s學(xué)起來(lái)很難?
- Kubernetes本身比較復(fù)雜堰塌,組件眾多赵刑,安裝過(guò)程比較麻煩
- Kubernetes版本有重大變化,網(wǎng)上好多教程已過(guò)時(shí)
○ kubernetes從1.24版本開始场刑,移除了對(duì)docker的支持(Docker 仍然可以用于構(gòu)建和推送容器鏡像般此,只是不再支持作為運(yùn)行時(shí)容器)
○ 本文采用1.25版本,使用containerd作為容器運(yùn)行時(shí)
基本命令
Pod(容器集)
kubectl run mynginx --image=nginx
# 查看Pod
kubectl get pod
# 描述
kubectl describe pod mynginx
# 查看Pod的運(yùn)行日志
kubectl logs mynginx
# 顯示pod的IP和運(yùn)行節(jié)點(diǎn)信息
kubectl get pod -owide
#連接到pod
kubectl exec mynginx -it -- /bin/bash
# 刪除
kubectl delete pod mynginx
# 強(qiáng)制刪除
kubectl delete pod mynginx --force
Deployment(部署)與ReplicaSet(副本集)
Deployment是對(duì)ReplicaSet和Pod更高級(jí)的抽象牵现,它使Pod擁有多副本铐懊,自愈,擴(kuò)縮容瞎疼、滾動(dòng)升級(jí)等能力科乎。
ReplicaSet(副本集)是一個(gè)Pod的集合,它可以設(shè)置運(yùn)行Pod的數(shù)量贼急,確保任何時(shí)間都有指定數(shù)量的 Pod 副本在運(yùn)行茅茂,通常我們不直接使用ReplicaSet,而是在Deployment中聲明太抓。
#創(chuàng)建deployment,部署3個(gè)運(yùn)行nginx的Pod
kubectl create deployment nginx-deployment --image=nginx:1.22 --replicas=3
#查看deployment
kubectl get deploy
#查看replicaSet(所有)
kubectl get rs
#刪除deployment
kubectl delete deploy nginx-deployment
- 縮放-手動(dòng)縮放
#將副本數(shù)量調(diào)整為5
kubectl scale deployment/nginx-deployment --replicas=5
kubectl get deploy
- 縮放-自動(dòng)縮放
自動(dòng)縮放通過(guò)增加和減少副本的數(shù)量空闲,以保持所有 Pod 的平均 CPU 利用率不超過(guò) 75%。
#自動(dòng)縮放
kubectl autoscale deployment/nginx-deployment --min=3 --max=10 --cpu-percent=75
#查看自動(dòng)縮放(所有)
kubectl get hpa
#刪除自動(dòng)縮放
kubectl delete hpa nginx-deployment
- 滾動(dòng)更新
#查看版本和Pod
kubectl get deployment/nginx-deployment -owide
kubectl get pods
#更新容器鏡像
kubectl set image deployment/nginx-deployment nginx=nginx:1.23
#滾動(dòng)更新
kubectl rollout status deployment/nginx-deployment
#查看過(guò)程
kubectl get rs --watch
- 版本回滾
#查看歷史版本
kubectl rollout history deployment/nginx-deployment
#查看指定版本的信息
kubectl rollout history deployment/nginx-deployment --revision=2
#回滾到歷史版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
Service(服務(wù))
ServiceType 取值
ClusterIP:這是 Kubernetes 中的默認(rèn) Service 類型腻异。ClusterIP 服務(wù)只能在集群內(nèi)部訪問(wèn)进副,它會(huì)為 Service 分配一個(gè)集群內(nèi)部的 IP 地址。其他 Pod 可以通過(guò)這個(gè) IP 地址訪問(wèn) Service悔常,但集群外部無(wú)法直接訪問(wèn)「蓿總結(jié)起來(lái)就是只在集群內(nèi)部使用机打,適合服務(wù)間通信。
NodePort:NodePort 服務(wù)會(huì)在每個(gè)節(jié)點(diǎn)上開放一個(gè)特定的端口(通常范圍為 30000-32767)片迅,并將這個(gè)端口映射到 Service残邀。外部流量可以通過(guò) NodeIP:NodePort 訪問(wèn)服務(wù),集群外部可以通過(guò)節(jié)點(diǎn)的 IP 地址和這個(gè)端口號(hào)來(lái)訪問(wèn)服務(wù)〗嬲酰總結(jié)起來(lái)就是直接在每個(gè)節(jié)點(diǎn)開放端口驱闷,適合簡(jiǎn)單的外部訪問(wèn)。
ExternalName:ExternalName 服務(wù)將服務(wù)映射到一個(gè) DNS 名稱空免,而不是傳統(tǒng)的 IP 地址空另。它通過(guò)返回 CNAME 記錄來(lái)解析請(qǐng)求。這意味著當(dāng)訪問(wèn)這個(gè) Service 時(shí)蹋砚,實(shí)際請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到外部的 DNS 名稱對(duì)應(yīng)的地址(不是轉(zhuǎn)發(fā)到當(dāng)前服務(wù))扼菠。總結(jié)將服務(wù)映射到外部 DNS 名稱坝咐,適合與外部服務(wù)的集成循榆。。
LoadBalancer:LoadBalancer 服務(wù)會(huì)請(qǐng)求云提供商(如 阿里云彈性負(fù)載均衡 (SLB)墨坚、騰訊云負(fù)載均衡 (CLB) 等)創(chuàng)建一個(gè)外部負(fù)載均衡器秧饮,并將其配置為指向 Kubernetes 集群中的 Service。外部流量會(huì)通過(guò)負(fù)載均衡器進(jìn)入泽篮,并根據(jù) Service 的配置分發(fā)到各個(gè) Pod浦楣。總結(jié)起來(lái)就是使用云提供商的負(fù)載均衡器咪辱,適合生產(chǎn)環(huán)境下的外部訪問(wèn)振劳。
# port是service訪問(wèn)端口,target-port是Pod端口
kubectl expose deployment/nginx-deployment \
--name=nginx-service --type=ClusterIP --port=80 --target-port=80
# 隨機(jī)產(chǎn)生主機(jī)端口,如果想要指定可以添加--node-port=30007
kubectl expose deployment/nginx-deployment \
--name=nginx-service2 --type=NodePort --port=8080 --target-port=80
Namespace(命名空間)
Kubernetes 會(huì)創(chuàng)建四個(gè)初始命名空間:
- default 默認(rèn)的命名空間油狂,不可刪除历恐,未指定命名空間的對(duì)象都會(huì)被分配到default中。
- kube-system Kubernetes 系統(tǒng)對(duì)象(控制平面和Node組件)所使用的命名空間专筷。
- kube-public自動(dòng)創(chuàng)建的公共命名空間弱贼,所有用戶(包括未經(jīng)過(guò)身份驗(yàn)證的用戶)都可以讀取它。通常我們約定磷蛹,將整個(gè)集群中公用的可見(jiàn)和可讀的資源放在這個(gè)空間中吮旅。
- kube-node-lease 租約(Lease)對(duì)象使用的命名空間。每個(gè)節(jié)點(diǎn)都有一個(gè)關(guān)聯(lián)的 lease 對(duì)象味咳,lease 是一種輕量級(jí)資源庇勃。lease對(duì)象通過(guò)發(fā)送心跳,檢測(cè)集群中的每個(gè)節(jié)點(diǎn)是否發(fā)生故障槽驶。
管理命名空間
#創(chuàng)建命名空間
kubectl create namespace dev
#查看命名空間
kubectl get ns
#在命名空間內(nèi)運(yùn)行Pod
kubectl run nginx --image=nginx --namespace=dev
kubectl run my-nginx --image=nginx -n=dev
#查看命名空間內(nèi)的Pod
kubectl get pods -n=dev
#查看命名空間內(nèi)所有對(duì)象
kubectl get all
# 刪除命名空間會(huì)刪除命名空間下的所有內(nèi)容
kubectl delete ns dev
切換當(dāng)前命名空間
#查看當(dāng)前上下文
kubectl config current-context
#將dev設(shè)為當(dāng)前命名空間责嚷,后續(xù)所有操作都在此命名空間下執(zhí)行。
kubectl config set-context $(kubectl config current-context) --namespace=dev
聲明式對(duì)象配置
命令行指令方式好比口頭傳達(dá)掂铐,簡(jiǎn)單罕拂、快速揍异、高效。但是但它功能有限爆班,不適合復(fù)雜場(chǎng)景衷掷,操作不容易追溯,多用于開發(fā)和調(diào)試柿菩。
于是我們引出聲明式配置戚嗅,聲明式配置就好比申請(qǐng)表,學(xué)習(xí)難度大且配置麻煩碗旅。好處是操作留痕渡处,適合操作復(fù)雜的對(duì)象,多用于生產(chǎn)祟辟。
使用yaml定義一個(gè)Pod
my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-nginx
spec:
containers:
- name: nginx
image: nginx:1.22
ports:
- containerPort: 80
使用yaml文件管理對(duì)象
#創(chuàng)建或更新集群中的資源医瘫,使資源狀態(tài)與 YAML 文件中的定義保持一致
kubectl apply -f my-pod.yaml
#編輯yaml文件
kubectl edit nginx
#刪除集群中與 YAML 文件定義匹配的資源
kubectl delete -f my-pod.yaml
標(biāo)簽
標(biāo)簽(Labels) 是附加到對(duì)象(比如 Pod)上的鍵值對(duì),用于補(bǔ)充對(duì)象的描述信息旧困。由于一個(gè)集群中可能管理成千上萬(wàn)個(gè)容器醇份,我們可以使用標(biāo)簽高效的進(jìn)行選擇和操作容器集合。
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels: #定義Pod標(biāo)簽
environment: test
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.22
ports:
- containerPort: 80
kubectl get pod --show-labels
kubectl get pod -l environment=test,app=nginx
選擇器
標(biāo)簽選擇器可以識(shí)別一組對(duì)象吼具。標(biāo)簽選擇器最常見(jiàn)的用法是為Service選擇一組Pod作為后端僚纷。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector: #與Pod的標(biāo)簽一致
environment: test
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30007
目前支持兩種類型的選擇運(yùn)算:基于等值的和基于集合的。
selector:
matchLabels: # component=redis && version=7.0
component: redis
version: 7.0
selector:
matchExpressions: # tier in (cache, backend) && environment not in (dev, prod)
- {key: tier, operator: In, values: [cache, backend]}
- {key: environment, operator: NotIn, values: [dev, prod]}
用k8s部署MYSQL
創(chuàng)建MYSQL數(shù)據(jù)庫(kù)
使用MySQL鏡像創(chuàng)建Pod拗盒,并設(shè)置環(huán)境變量怖竭,使用hostPath卷存儲(chǔ)數(shù)據(jù)。
環(huán)境變量類型:
- env:可以為容器設(shè)置環(huán)境變量陡蝇,直接為變量指定一個(gè)值痊臭。
- envFrom:你可以通過(guò)引用 ConfigMap 或 Secret 來(lái)設(shè)置容器的環(huán)境變量。
hostPath的type值:
- DirectoryOrCreate 目錄不存在則自動(dòng)創(chuàng)建登夫。
- Directory 掛載已存在目錄广匙。不存在會(huì)報(bào)錯(cuò)。
- FileOrCreate 文件不存在則自動(dòng)創(chuàng)建恼策。不會(huì)自動(dòng)創(chuàng)建文件的父目錄鸦致,必須確保文件路徑已經(jīng)存在。
- File 掛載已存在的文件涣楷。不存在會(huì)報(bào)錯(cuò)分唾。
- Socket 掛載 UNIX 套接字。例如掛載/var/run/docker.sock進(jìn)程
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
ports:
- containerPort: 3306
volumeMounts:
- mountPath: /var/lib/mysql #容器中的目錄
name: data-volume
volumes:
- name: data-volume
hostPath:
# 宿主機(jī)上目錄位置
path: /home/mysql/data
type: DirectoryOrCreate
ConfigMap與Secret
ConfigMap 用來(lái)在鍵值對(duì)數(shù)據(jù)庫(kù)(etcd)中保存非加密數(shù)據(jù)总棵,一般用來(lái)保存配置文件鳍寂,可以用作環(huán)境變量、命令行參數(shù)或者存儲(chǔ)卷情龄,將環(huán)境配置信息與容器鏡像解耦迄汛,便于配置的修改,ConfigMap 在設(shè)計(jì)上不是用來(lái)保存大量數(shù)據(jù)的骤视,保存的數(shù)據(jù)不可超過(guò) 1 MiB鞍爱。
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumeMounts:
- mountPath: /var/lib/mysql
name: data-volume
- mountPath: /etc/mysql/conf.d
name: conf-volume
readOnly: true
volumes:
- name: conf-volume
configMap:
name: mysql-config
- name: data-volume
hostPath:
# directory location on host
path: /home/mysql/data
# this field is optional
type: DirectoryOrCreate
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
mysql.cnf: |
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
Secret 用于保存機(jī)密數(shù)據(jù)的對(duì)象。一般由于保存密碼专酗、令牌或密鑰等睹逃。可使用data字段用來(lái)存儲(chǔ) base64 編碼數(shù)據(jù)祷肯,也可使用stringData字段存儲(chǔ)未編碼的字符串沉填。Secret 意味著你不需要在應(yīng)用程序代碼中包含機(jī)密數(shù)據(jù),減少機(jī)密數(shù)據(jù)(如密碼)泄露的風(fēng)險(xiǎn)佑笋。
apiVersion: v1
kind: Secret
metadata:
name: mysql-password
type: Opaque
data:
PASSWORD: MTIzNDU2Cg==
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: PASSWORD
optional: false # 此值為默認(rèn)值翼闹;表示secret已經(jīng)存在了
volumeMounts:
- mountPath: /var/lib/mysql
name: data-volume
- mountPath: /etc/mysql/conf.d
name: conf-volume
readOnly: true
volumes:
- name: conf-volume
configMap:
name: mysql-config
- name: data-volume
hostPath:
# directory location on host
path: /home/mysql/data
# this field is optional
type: DirectoryOrCreate
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
mysql.cnf: |
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
卷(Volume)
將數(shù)據(jù)存儲(chǔ)在容器中,一旦容器被刪除蒋纬,數(shù)據(jù)也會(huì)被刪除猎荠。卷是獨(dú)立于容器之外的一塊存儲(chǔ)區(qū)域,通過(guò)掛載(Mount)的方式供Pod中的容器使用蜀备。
常見(jiàn)的卷類型
- 臨時(shí)卷(Ephemeral Volume):與 Pod 一起創(chuàng)建和刪除关摇,生命周期與 Pod 相同
○ emptyDir - 作為緩存或存儲(chǔ)日志
○ configMap、secret碾阁、 downwardAPI - 給Pod注入數(shù)據(jù) - 持久卷(Persistent Volume):刪除Pod后输虱,持久卷不會(huì)被刪除
○ 本地存儲(chǔ) - hostPath(節(jié)點(diǎn)主機(jī)上的目錄或文件)、 local(節(jié)點(diǎn)上掛載的本地存儲(chǔ)設(shè)備)
○ 網(wǎng)絡(luò)存儲(chǔ) - NFS(網(wǎng)絡(luò)文件系統(tǒng))
○ 分布式存儲(chǔ) - Ceph(cephfs文件存儲(chǔ)脂凶、rbd塊存儲(chǔ)) - 投射卷(Projected Volumes):projected卷可以將多個(gè)卷映射到同一個(gè)目錄上
emptyDir
emptyDir會(huì)創(chuàng)建一個(gè)初始狀態(tài)為空的目錄宪睹,存儲(chǔ)空間來(lái)自本地的 kubelet 根目錄或內(nèi)存。通常使用本地臨時(shí)存儲(chǔ)來(lái)設(shè)置緩存艰猬、保存日志等横堡。
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
configMap卷和secret卷
configMap卷和Secret卷是一種特殊類型的卷,kubelet引用configMap和Secret中定義的內(nèi)容冠桃,在Pod所在節(jié)點(diǎn)上生成一個(gè)臨時(shí)卷命贴,將數(shù)據(jù)注入到Pod中。刪除Pod食听,臨時(shí)卷也會(huì)被刪除胸蛛。
創(chuàng)建持久卷(PV)
創(chuàng)建持久卷(PV)是服務(wù)端的行為,通常集群管理員會(huì)提前創(chuàng)建一些常用規(guī)格的持久卷以備使用樱报。
hostPath僅供單節(jié)點(diǎn)測(cè)試使用葬项,當(dāng)Pod被重新創(chuàng)建時(shí),可能會(huì)被調(diào)度到與原先不同的節(jié)點(diǎn)上迹蛤,導(dǎo)致新的Pod沒(méi)有數(shù)據(jù)民珍。多節(jié)點(diǎn)集群使用本地存儲(chǔ)襟士,可以使用local卷。
創(chuàng)建local類型的持久卷嚷量,需要先創(chuàng)建存儲(chǔ)類(StorageClass)陋桂。
# 創(chuàng)建本地存儲(chǔ)類
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
# 卷綁定模式 Immediate立即創(chuàng)建 WaitForFirstConsumer 延遲創(chuàng)建
volumeBindingMode: Immediate
local卷不支持動(dòng)態(tài)創(chuàng)建,必須手動(dòng)創(chuàng)建持久卷(PV)蝶溶;創(chuàng)建local類型的持久卷嗜历,必須設(shè)置nodeAffinity(節(jié)點(diǎn)親和性),調(diào)度器使用nodeAffinity信息來(lái)將使用local卷的 Pod 調(diào)度到持久卷所在的節(jié)點(diǎn)上抖所,不會(huì)出現(xiàn)Pod被調(diào)度到別的節(jié)點(diǎn)上的情況梨州。
創(chuàng)建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv-1
spec:
capacity:
storage: 4Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
# 回收策略 Delete 刪除 Retain 保留
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage #通過(guò)指定存儲(chǔ)類來(lái)設(shè)置卷的類型
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-worker1
創(chuàng)建持久卷聲明(PVC)
持久卷聲明(PVC)是用戶端的行為,用戶在創(chuàng)建Pod時(shí),無(wú)法知道集群中PV的狀態(tài)(名稱田轧、容量暴匠、是否可用等),用戶也無(wú)需關(guān)心這些內(nèi)容涯鲁,只需要在聲明中提出申請(qǐng)巷查,集群會(huì)自動(dòng)匹配符合需求的持久卷(PV)。
創(chuàng)建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pv-claim
spec:
storageClassName: local-storage # 與PV中的storageClassName一致
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
使用PVC作為卷
Pod 的配置文件指定了 PersistentVolumeClaim抹腿,但沒(méi)有指定 PersistentVolume岛请。 對(duì) Pod 而言,PersistentVolumeClaim 就是一個(gè)存儲(chǔ)卷警绩。
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
ports:
- containerPort: 3306
volumeMounts:
- mountPath: /var/lib/mysql #容器中的目錄
name: local-mysql-data
volumes:
- name: local-mysql-data
persistentVolumeClaim:
claimName: local-pv-claim
綁定
創(chuàng)建持久卷聲明(PVC)之后崇败,集群會(huì)查找滿足要求的持久卷(PV),將 PVC 綁定到該 PV上肩祥。PVC與PV之間的綁定是一對(duì)一的映射關(guān)系后室,綁定具有排他性,一旦綁定關(guān)系建立混狠,該P(yáng)V無(wú)法被其他PVC使用岸霹。PVC可能會(huì)匹配到比聲明容量大的持久卷,但是不會(huì)匹配比聲明容量小的持久卷将饺。
訪問(wèn)模式
- ReadWriteOnce
○ 卷可以被一個(gè)節(jié)點(diǎn)以讀寫方式掛載贡避,并允許同一節(jié)點(diǎn)上的多個(gè) Pod 訪問(wèn)。 - ReadOnlyMany
○ 卷可以被多個(gè)節(jié)點(diǎn)以只讀方式掛載予弧。 - ReadWriteMany
○ 卷可以被多個(gè)節(jié)點(diǎn)以讀寫方式掛載刮吧。 - ReadWriteOncePod
○ 卷可以被單個(gè) Pod 以讀寫方式掛載。 集群中只有一個(gè) Pod 可以讀取或?qū)懭朐?PVC掖蛤。
○ 只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本杀捻。
卷的狀態(tài)
- Available(可用)-- 卷是一個(gè)空閑資源,尚未綁定到任何卷蚓庭;
- Bound(已綁定)-- 該卷已經(jīng)綁定到某個(gè)持久卷聲明上致讥;
- Released(已釋放)-- 所綁定的聲明已被刪除仅仆,但是資源尚未被集群回收;
- Failed(失斨糇佟)-- 卷的自動(dòng)回收操作失敗蝇恶。
StatefulSet(有狀態(tài)應(yīng)用集)
如果我們需要部署多個(gè)MySQL實(shí)例拳魁,就需要用到StatefulSet惶桐。StatefulSet 適用于有狀態(tài)、需要持久化存儲(chǔ)的應(yīng)用潘懊,一般用于管理數(shù)據(jù)庫(kù)姚糊、緩存等。而Deployment 適用于無(wú)狀態(tài)授舟、不依賴持久化存儲(chǔ)的應(yīng)用程序救恨,如前端 Web 應(yīng)用、API 網(wǎng)關(guān)释树、后臺(tái)服務(wù)等肠槽。
創(chuàng)建StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql # 必須匹配 .spec.template.metadata.labels
serviceName: db
replicas: 3 # 默認(rèn)值是 1
minReadySeconds: 10 # 默認(rèn)值是 0
template:
metadata:
labels:
app: mysql # 必須匹配 .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
ports:
- containerPort: 3306
volumeMounts:
- mountPath: /var/lib/mysql #容器中的目錄
name: mysql-data
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 2Gi
在 StatefulSet 中使用 VolumeClaimTemplate,為每個(gè) Pod 創(chuàng)建持久卷聲明(PVC)奢啥。
每個(gè) Pod 將會(huì)得到基于local-path 存儲(chǔ)類動(dòng)態(tài)創(chuàng)建的持久卷(PV)秸仙。 Pod 創(chuàng)建(或重新調(diào)度)時(shí),會(huì)掛載與其聲明相關(guān)聯(lián)的持久卷桩盲。
請(qǐng)注意寂纪,當(dāng) Pod 或者 StatefulSet 被刪除時(shí),持久卷聲明和關(guān)聯(lián)的持久卷不會(huì)被刪除赌结。
在具有 N 個(gè)副本的 StatefulSet中捞蛋,每個(gè) Pod 會(huì)被分配一個(gè)從 0 到 N-1 的整數(shù)序號(hào),該序號(hào)在此 StatefulSet 上是唯一的柬姚。
當(dāng)部署 Pod 時(shí)拟杉,它們是依次創(chuàng)建的,順序?yàn)?0..N-1量承,當(dāng)刪除 Pod 時(shí)搬设,它們是逆序終止的,順序?yàn)?N-1..0宴合。在將擴(kuò)縮操作應(yīng)用到 Pod 之前焕梅,它前面的所有 Pod 必須是 Running 和 Ready 狀態(tài)。
# 創(chuàng)建或更新資源
kubectl apply -f mysql.yaml
結(jié)尾
本文為大家簡(jiǎn)單介紹了k8s的一些實(shí)戰(zhàn)命令卦洽、聲明式對(duì)象配置贞言,并演示了如何使用k8s部署mysql,希望能幫助大家更好的理解k8s阀蒂。