目標
在你的環境中建立一個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
部署MySQL
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.6name: 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
kubectl create -f https://k8s.io/docs/tasks/run-application/mysql-deployment.yaml
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.
#存取MySQL實例
前面的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: falseIf 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################ 透過名稱來刪除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服務--簡述運行單實例的有狀態服務範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!