Kubernetes 運行一個單實例有狀態(tài)應(yīng)用

2022-06-14 09:55 更新

運行一個單實例有狀態(tài)應(yīng)用

本文介紹在 Kubernetes 中如何使用 PersistentVolume 和 Deployment 運行一個單實例有狀態(tài)應(yīng)用。該應(yīng)用是 MySQL.

教程目標 

  • 在你的環(huán)境中創(chuàng)建一個引用磁盤的 PersistentVolume
  • 創(chuàng)建一個 MySQL Deployment.
  • 在集群內(nèi)以一個已知的 DNS 名稱將 MySQL 暴露給其他 Pod

在開始之前

  • 你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:
  • 要獲知版本信息,請輸入 ?kubectl version?。

  • 你需要有一個帶有默認 ?StorageClass?的 動態(tài) ?PersistentVolume ?供應(yīng)程序, 或者自己靜態(tài)的提供 ?PersistentVolume ?來滿足這里使用的 ?PersistentVolumeClaim?。

部署 MySQL 

你可以通過創(chuàng)建一個 Kubernetes Deployment 并使用 PersistentVolumeClaim 將其連接到 某已有的 PV 卷來運行一個有狀態(tài)的應(yīng)用。 例如,這里的 YAML 描述的是一個運行 MySQL 的 Deployment,其中引用了 PVC 申領(lǐng)。 文件為 /var/lib/mysql 定義了加載卷,并創(chuàng)建了一個 PVC 申領(lǐng),尋找一個 20G 大小的卷。 該申領(lǐng)可以通過現(xiàn)有的滿足需求的卷來滿足,也可以通過動態(tài)供應(yīng)卷的機制來滿足。

注意:在配置的 YAML 文件中定義密碼的做法是不安全的。

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  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
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  1. 部署 YAML 文件中定義的 PV 和 PVC:
  2. kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml
    
  3. 部署 YAML 文件中定義的 Deployment:
    kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml
    
  4. 展示 Deployment 相關(guān)信息:
    kubectl describe deployment mysql
    

    輸出類似于:

    Name:                 mysql
    Namespace:            default
    CreationTimestamp:    Tue, 01 Nov 2016 11:18:45 -0700
    Labels:               app=mysql
    Annotations:          deployment.kubernetes.io/revision=1
    Selector:             app=mysql
    Replicas:             1 desired | 1 updated | 1 total | 0 available | 1 unavailable
    StrategyType:         Recreate
    MinReadySeconds:      0
    Pod Template:
      Labels:       app=mysql
      Containers:
       mysql:
        Image:      mysql:5.6
        Port:       3306/TCP
        Environment:
          MYSQL_ROOT_PASSWORD:      password
        Mounts:
          /var/lib/mysql from mysql-persistent-storage (rw)
      Volumes:
       mysql-persistent-storage:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  mysql-pv-claim
        ReadOnly:   false
        Conditions:
          Type          Status  Reason
          ----          ------  ------
          Available     False   MinimumReplicasUnavailable
          Progressing   True    ReplicaSetUpdated
          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
  5. 列舉出 Deployment 創(chuàng)建的 pods:
    kubectl get pods -l app=mysql
    

    輸出類似于:

    NAME                   READY     STATUS    RESTARTS   AGE
    mysql-63082529-2z3ki   1/1       Running   0          3m
  6. 查看 PersistentVolumeClaim:
    kubectl describe pvc mysql-pv-claim
    

    輸出類似于:

    Name:         mysql-pv-claim
    Namespace:    default
    StorageClass:
    Status:       Bound
    Volume:       mysql-pv-volume
    Labels:       <none>
    Annotations:    pv.kubernetes.io/bind-completed=yes
                    pv.kubernetes.io/bound-by-controller=yes
    Capacity:     20Gi
    Access Modes: RWO
    Events:       <none>

訪問 MySQL 實例 

前面 YAML 文件中創(chuàng)建了一個允許集群內(nèi)其他 Pod 訪問的數(shù)據(jù)庫服務(wù)。該服務(wù)中選項 ?clusterIP: None? 讓服務(wù) DNS 名稱直接解析為 Pod 的 IP 地址。 當在一個服務(wù)下只有一個 Pod 并且不打算增加 Pod 的數(shù)量這是最好的.

運行 MySQL 客戶端以連接到服務(wù)器:

kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword

此命令在集群內(nèi)創(chuàng)建一個新的 Pod 并運行 MySQL 客戶端,并通過 Service 連接到服務(wù)器。 如果連接成功,你就知道有狀態(tài)的 MySQL 數(shù)據(jù)庫正處于運行狀態(tài)。

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)應(yīng)用的一些注意事項:

  • 不要對應(yīng)用進行規(guī)模擴縮。這里的設(shè)置僅適用于單實例應(yīng)用。下層的 PersistentVolume 僅只能掛載到一個 Pod 上。
  • 在 Deployment 的 YAML 文件中使用 ?strategy:? ?type: Recreate?。 該選項指示 Kubernetes 不 使用滾動升級。滾動升級無法工作,因為這里一次不能 運行多個 Pod。在使用更新的配置文件創(chuàng)建新的 Pod 前,?Recreate ?策略將 保證先停止第一個 Pod。

刪除 Deployment 

通過名稱刪除部署的對象:

kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume

如果通過手動的方式供應(yīng) PersistentVolume, 那么也需要手動刪除它以釋放下層資源。 如果是用動態(tài)供應(yīng)方式創(chuàng)建的 PersistentVolume,在刪除 PersistentVolumeClaim 后 PersistentVolume 將被自動刪除。 一些存儲服務(wù)(比如 EBS 和 PD)也會在 PersistentVolume 被刪除時自動回收下層資源。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號