共計 4137 個字符,預計需要花費 11 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 Kubernetes 中如何實現運行單實例的有狀態(tài)服務,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
目標
在你的環(huán)境中創(chuàng)建一個 PV
創(chuàng)建一個 MySQl 的 Deployment
在集群中以 DNS 名稱的方式,將 MySQL 暴露給其他的 pod
開始之前
你需要一個 Kubernetes 集群,一個可以連接到集群的 kubectl 命令行工具。如果你沒有集群,你可以使用 Minikube 來創(chuàng)建。
我們會創(chuàng)建一個 PV(PersistentVolume)用于數據存儲。點擊這里來查看 PV 支持的類型,該指導會使用 GCEPersistentDisk 來演示,但其實任何的 PV 類型都可以正常工作。GCEPersistentDisk 只能在 Google Compute Engine(GCE)上工作。
在你的環(huán)境中創(chuàng)建磁盤
在 Google Compute Engine,運行:
gcloud compute disks create --size=20GB mysql-disk
然后創(chuàng)建一個 PV,指向剛剛創(chuàng)建的 mysql-disk。下面是一個創(chuàng)建 PV 的配置文件,指向上面提到的 GCE 磁盤:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
gcePersistentDisk:
pdName: mysql-disk
fsType: ext4
注意 pdName: mysql-disk 這一行匹配上面 GCE 環(huán)境創(chuàng)建磁盤的名稱。如果要在其他環(huán)境中創(chuàng)建 PV,可以查看 Persistent Volumes 來獲取詳細信息。
創(chuàng)建 PV:
kubectl create -f https://k8s.io/docs/tasks/run-application/gce-volume.yaml
部署 MySQL
你可以通過 Kubernetes Deployment 的方式來創(chuàng)建一個有狀態(tài)服務,然后使用 PVC(PersistentVolumeClaim)來連接已經存在的 PV。比如,下面的 YAML 文件描述了一個運行 MySQL 并使用 PVC 的 Deployment。文件定義了一個 mount 到 /var/lib/mysql 的卷,并創(chuàng)建了一個需要 20G 卷大小的 PVC。
注意:密碼定義在 YAML 配置文件中,這是不安全的。查看 Kubernetes Secrets 獲取更安全的方案。
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
1. 部署 YAML 文件中的內容。
kubectl create -f https://k8s.io/docs/tasks/run-application/mysql-deployment.yaml
2. 顯示 Deployment 的信息。
kubectl describe deployment mysql
Name: mysql
Namespace: default
CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700
Labels: app=mysql
Selector: app=mysql
Replicas: 1 updated | 1 total | 0 available | 1 unavailable
StrategyType: Recreate
MinReadySeconds: 0
OldReplicaSets: none
NewReplicaSet: mysql-63082529 (1/1 replicas created)
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
3. 顯示 Deployment 創(chuàng)建的 pod。
kubectl get pods -l app=mysql
NAME READY STATUS RESTARTS AGE
mysql-63082529-2z3ki 1/1 Running 0 3m
4. 檢查 PV。
kubectl describe pv mysql-pv
Name: mysql-pv
Labels: none
Status: Bound
Claim: default/mysql-pv-claim
Reclaim Policy: Retain
Access Modes: RWO
Capacity: 20Gi
Message:
Source:
Type: GCEPersistentDisk (a Persistent Disk resource in Google Compute Engine)
PDName: mysql-disk
FSType: ext4
Partition: 0
ReadOnly: false
No events.
5. 檢查 PVC。
kubectl describe pvc mysql-pv-claim
Name: mysql-pv-claim
Namespace: default
Status: Bound
Volume: mysql-pv
Labels: none
Capacity: 20Gi
Access Modes: RWO
No events.
訪問 MySQL 實例
前面的 YAML 文件創(chuàng)建了一個服務,允許集群的其他 Pod 可以訪問數據庫。服務選項 clusterIP:None 使得服務的 DNS 名直接解析為 Pod 的 IP 地址。當你的服務只有一個 Pod,并且你不打算增加 Pod 的數量時,這是一種最佳的使用方式。
運行一個 Mysql 客戶端來連接 Mysql 服務:
kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h pod-ip -ppassword
上面的命令在集群中創(chuàng)建了一個新的 Pod,該 Pod 運行了一個 mysql 客戶端,連接著上面服務的 Mysql Server。如果它連接成功,也就說明了這個有狀態(tài)的 MySQL 數據庫成功啟動和運行了。
Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
If you don t see a command prompt, try pressing enter.
mysql
更新
更新 Deployment 的鏡像或者其他部分,同樣可以照例使用 kubectl apply 命令來完成。以下是使用有狀態(tài)應用時需要注意的地方:
不要擴容該應用。該應用只針對單例應用。下面的 PV 只能映射給一個 Pod。對于集群的有狀態(tài)應用,請查看 StatefulSet 文檔。
在 Deployment 的 YAML 配置文檔中使用 strategy: type: Recreate。它會告訴 Kubernetes 不要使用 rolling update。因為 Rolling update 不會工作,因此不會有多個 Pod 同時運行。策略 Recreate 會在使用更新配置創(chuàng)建一個新的 Pod 時刪除之前的 Pod。
刪除 Deployment
通過名稱來刪除 Deployment 對象:
kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv
另外,如果你使用的是 GCE disk,還需要刪除對應的 disk:
gcloud compute disks delete mysql-disk
關于“Kubernetes 中如何實現運行單實例的有狀態(tài)服務”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。