您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Kubernetes中如何實現運行單實例的有狀態服務,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在你的環境中創建一個PV
創建一個MySQl的Deployment
在集群中以DNS名稱的方式,將MySQL暴露給其他的pod
你需要一個Kubernetes集群,一個可以連接到集群的kubectl命令行工具。如果你沒有集群,你可以使用Minikube來創建。
我們會創建一個PV(PersistentVolume)用于數據存儲。點擊這里來查看PV支持的類型,該指導會使用GCEPersistentDisk
來演示,但其實任何的PV類型都可以正常工作。GCEPersistentDisk
只能在Google Compute Engine(GCE)上工作。
在Google Compute Engine,運行:
gcloud compute disks create --size=20GB mysql-disk
然后創建一個PV,指向剛剛創建的mysql-disk
。下面是一個創建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環境創建磁盤的名稱。如果要在其他環境中創建PV,可以查看Persistent Volumes來獲取詳細信息。
創建PV:
kubectl create -f https://k8s.io/docs/tasks/run-application/gce-volume.yaml
你可以通過Kubernetes Deployment的方式來創建一個有狀態服務,然后使用PVC(PersistentVolumeClaim)來連接已經存在的PV。比如,下面的YAML文件描述了一個運行MySQL并使用PVC的Deployment。文件定義了一個mount到/var/lib/mysql的卷,并創建了一個需要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創建的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.
前面的YAML文件創建了一個服務,允許集群的其他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
上面的命令在集群中創建了一個新的Pod,該Pod運行了一個mysql客戶端,連接著上面服務的Mysql Server。如果它連接成功,也就說明了這個有狀態的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
命令來完成。以下是使用有狀態應用時需要注意的地方:
不要擴容該應用。該應用只針對單例應用。下面的PV只能映射給一個Pod。對于集群的有狀態應用,請查看StatefulSet文檔。
在Deployment的YAML配置文檔中使用strategy: type: Recreate
。它會告訴Kubernetes不要使用rolling update。因為Rolling update不會工作,因此不會有多個Pod同時運行。策略Recreate
會在使用更新配置創建一個新的Pod時刪除之前的Pod。
通過名稱來刪除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中如何實現運行單實例的有狀態服務”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。