首頁  >  文章  >  Java  >  Kubernetes服務--簡述運行單實例的有狀態服務範例

Kubernetes服務--簡述運行單實例的有狀態服務範例

巴扎黑
巴扎黑原創
2017-07-22 15:21:212038瀏覽

目標

  在你的環境中建立一個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

  你可以透過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.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

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.

 

#存取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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn