天天看點

Kubernetes 應用遷移一、前提條件二、背景資訊三、操作步驟

Kubernetes 應用遷移一、前提條件二、背景資訊三、操作步驟

鏡像下載下傳、域名解析、時間同步請點選

阿裡巴巴開源鏡像站

一、前提條件

自建Kubernetes叢集通常位于使用者自己的IDC中,容器鏡像的存儲也會使用自建鏡像倉庫, 在自建Kubernetes應用遷移上雲之前,您需要先将容器鏡像遷移上雲到ACR。具體步驟請參見

容器鏡像遷移

本示例中,假設wordpress應用中涉及如下容器鏡像:

registry.api.paas.com:5000/admin/wordpress:latest
registry.api.paas.com:5000/admin/mysql:8           

遷移上雲後的鏡像如下:

registry.cn-hangzhou.aliyuncs.com/ack-migration/wordpress:latest
registry.cn-hangzhou.aliyuncs.com/ack-migration/mysql:8           

二、背景資訊

在本示例中, 我們将對自建Kubernetes叢集中的一個wordpress應用整體遷移上雲到ACK,wordpress示例應用分wordpress和mysql兩個元件, 分别綁定兩個不同的nfs volume用于應用資料的持久化存儲,最後通過NodePort暴露服務。

三、操作步驟

1. 準備遷移環境

請按照以下步驟,分别在阿裡雲Kubernetes叢集和自建Kubernetes叢集中部署Velero。

說明 部署Velero包含部署Velero用戶端和部署Velero伺服器。

  • 安裝Velero用戶端。下載下傳 Velero 用戶端工具,并執行如下指令安裝和驗證Velero用戶端。
$ curl -o /usr/bin/velero https://public-bucket-1.oss-cn-hangzhou.aliyuncs.com/velero && chmod +x /usr/bin/velero           
  • 建立OSS Bucket。請參見 建立存儲空間 。velero 要求您需要先建立一個OSS Bucket,用于存儲 Kubernetes 應用資料及其PV資料, 推薦每個Kubernetes叢集單獨使用各自的OSS Bucket。
    1. 登入 OSS 管理控制台
    2. 您可以在概覽頁,單擊右側的建立 Bucket。您也可以單擊 Bucket 清單 > 建立 Bucket。
    3. 在建立 Bucket 對話框配置 Bucket 參數。本示例中建立的OSS Bucket名稱為

      ls-velero

      ,建立的區域為華東1(杭州)。
  • 建立RAM賬号并生成AccessKey。請參見 建立RAM使用者 。如果您使用主賬号AccessKey,可以跳過此步驟。
{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ecs:DescribeSnapshots",
                "ecs:CreateSnapshot",
                "ecs:DeleteSnapshot",
                "ecs:DescribeDisks",
                "ecs:CreateDisk",
                "ecs:Addtags",
                "oss:PutObject",
                "oss:GetObject",
                "oss:DeleteObject",
                "oss:GetBucket",
                "oss:ListObjects"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}           
  • 部署Velero服務端。
    1. 步驟三 生成的AccessKey資訊填入Velero的部署檔案credentials-velero中。
ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>           
  1. 執行以下指令部署Velero。
velero install --provider alibabacloud --image registry.cn-hangzhou.aliyuncs.com/haoshuwei24/velero:v1.2.0 --bucket ls-velero --secret-file ./credentials-velero --use-volume-snapshots=false --backup-location-config region=cn-hangzhou --use-restic --plugins registry.cn-hangzhou.aliyuncs.com/acs/velero-plugin-alibabacloud:v1.2 --wait           

執行以下指令,可以檢視pod的運作狀态。

kubectl -n velero get po
NAME                      READY   STATUS    RESTARTS   AGE
restic-fqwsc              1/1     Running   0          41s
restic-kfzqt              1/1     Running   0          41s
restic-klxhc              1/1     Running   0          41s
restic-ql2kr              1/1     Running   0          41s
restic-qrsrn              1/1     Running   0          41s
restic-srjmm              1/1     Running   0          41s
velero-67b975f5cb-68nj4   1/1     Running   0          41s           

2. 在自建Kubernetes叢集備份應用

  • 如果隻需要備份wordpress應用而不備份PV資料,執行以下操作。
$ velero backup create wordpress-backup-without-pv --include-namespaces wordpress
Backup request "wordpress-backup-without-pv" submitted successfully.
Run `velero backup describe wordpress-backup-without-pv` or `velero backup logs wordpress-backup-without-pv` for more details.
$ velero backup get
NAME                          STATUS      CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
wordpress-backup-without-pv   Completed   2019-12-12 14:08:24 +0800 CST   29d       default            <none>           
  • 如果需要備份帶PV資料的wordpress應用,執行以下操作。
# 首先需要為挂載pv資料卷的pod添加annotation, 例如wordpress應用運作了2個pod, 分别為wordpress-7cf5849f47-mbvx4 mysql-74dddbdcc8-h2tls, wordpress-7cf5849f47-mbvx4
# 挂載的volume名為mysql-persistent-storage, mysql-74dddbdcc8-h2tls挂載的volume名為wordpress-persistent-storage, 則添加annotation的指令為
$ kubectl -n wordpress annotate pod/wordpress-7cf5849f47-mbvx4 backup.velero.io/backup-volumes=wordpress-persistent-storage
pod/wordpress-7cf5849f47-mbvx4 annotated
$ kubectl -n wordpress annotate pod/mysql-74dddbdcc8-h2tls backup.velero.io/backup-volumes=mysql-persistent-storage
pod/mysql-74dddbdcc8-h2tls annotated
# 備份wordpress
$ velero backup create wordpress-backup-with-pv --include-namespaces wordpress
Backup request "wordpress-backup-with-pv" submitted successfully.
Run `velero backup describe wordpress-backup-with-pv` or `velero backup logs wordpress-backup-with-pv` for more details.
$ velero backup get
NAME                          STATUS      CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
wordpress-backup-with-pv      Completed   2019-12-12 14:23:40 +0800 CST   29d       default            <none>
wordpress-backup-without-pv   Completed   2019-12-12 14:08:24 +0800 CST   29d       default            <none>           

完成後,在

OSS管理控制台

,檢視OSS Bucket可以看到備份的檔案。

Kubernetes 應用遷移一、前提條件二、背景資訊三、操作步驟

3. 在阿裡雲Kubernetes叢集恢複應用

wordpress應用使用NFS類型持久化資料卷,相應的,在ACK中我們可以适配NAS volume,在本示例中,我們建立與Wordpress應用所使用的StorageClass NFS, 但後端存儲媒體使用SSD雲盤塊存儲。

本示例使用阿裡雲Kubernetes叢集使用CSI plugin, 請參見

動态雲盤卷
  • 建立StorageClass。如果在阿裡雲Kubernetes叢集上備份wordpress應用不帶PV資料,則跳過此步驟。
$ cat nfs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: nfs
provisioner: diskplugin.csi.alibabacloud.com
parameters:
    type: cloud_ssd
reclaimPolicy: Retain
$ kubectl apply -f nfs.yaml
storageclass.storage.k8s.io/nfs created           
  • 恢複wordpress應用。使用Velero恢複wordpress應用到阿裡雲Kubernetes叢集,完成wordpress從自建Kubernetes叢集到阿裡雲Kubernetes叢集的遷移。
$ velero restore create --from-backup wordpress-backup-with-pv
$ velero restore get
NAME                                      BACKUP                     STATUS       WARNINGS   ERRORS   CREATED                         SELECTOR
wordpress-backup-with-pv-20191212152745   wordpress-backup-with-pv   InProgress   0          0        2019-12-12 15:27:45 +0800 CST   <none>
$ velero restore get           
  • 此時檢視wordpress應用運作情況,會有鏡像拉取失敗的問題。
$ kubectl -n wordpress get po
NAME                         READY   STATUS         RESTARTS   AGE
mysql-669b4666cd-trsnz       0/1     ErrImagePull   0          19m
mysql-74dddbdcc8-h2tls       0/1     Init:0/1       0          19m
wordpress-7cf5849f47-mbvx4   0/1     Init:0/1       0          19m
wordpress-bb5d74d95-xcjxw    0/1     ErrImagePull   0          19m           

4. 更新應用配置

應用配置項主要包含鏡像位址、服務暴露方式及存儲盤挂載等。本例中 ,僅涉及更新鏡像位址。

  • 容器服務管理控制台
  • 在 Kubernetes 菜單下,單擊左側導航欄的應用 > 無狀态,選擇目标叢集和命名空間。
  • 在wordpress應用右側操作列單擊更多 > 檢視Yaml。
  • 在編輯 YAML頁面把

    image

    字段替換成遷移後的鏡像位址後,單擊更新。

    說明 您可以在前提條件中擷取遷移後的鏡像位址。

    檢視wordpress應用運作情況。

$ kubectl -n wordpress get po
NAME                         READY   STATUS    RESTARTS   AGE
mysql-678b5d8499-vckfd       1/1     Running   0          100s
wordpress-8566f5f7d8-7shk6   1/1     Running   0          3m18s           

5. 調試并啟動應用

wordpress示例應用分wordpress和mysql兩個元件, 分别綁定兩個不同的nfs volume用于應用資料的持久化存儲,最後通過NodePort暴露服務。yaml檔案示例如下:

# 1. 建立nfs storageclass
$ cat nfs-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs
provisioner: helm.default/nfs
reclaimPolicy: Delete
$ kubectl apply -f  nfs-sc.yaml
# 2. 建立mysql password的secret, echo -n "mysql" |base64
$ cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysql
type: Opaque
data:
  password: bXlzcWw=
$ kubectl apply -f secret.yaml
# 3. 建立mysql的pvc deployment service
$ cat mysql.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  type: ClusterIP
  ports:
    - port: 3306
  selector:
    app: mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-volumeclaim
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      securityContext:
        runAsUser: 999
        runAsGroup: 999
        fsGroup: 999
      containers:
        - image: registry.api.paas.com:5000/admin/mysql:8
          name: mysql
          args:
            - "--default-authentication-plugin=mysql_native_password"
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql
                  key: password
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-volumeclaim
 $ kubectl apply -f mysql.yaml
 # 4. 建立wordpress的pvc deployment service
 $ cat wordpress.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: wordpress
  name: wordpress
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 31570
  selector:
    app: wordpress
  type: NodePort
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-volumeclaim
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
        - image: registry.api.paas.com:5000/admin/wordpress
          name: wordpress
          env:
          - name: WORDPRESS_DB_HOST
            value: mysql:3306
          - name: WORDPRESS_DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql
                key: password
          ports:
            - containerPort: 80
              name: wordpress
          volumeMounts:
            - name: wordpress-persistent-storage
              mountPath: /var/www/html
      volumes:
        - name: wordpress-persistent-storage
          persistentVolumeClaim:
            claimName: wordpress-volumeclaim
 $ kubectl apply -f wordpress.yaml           

通路wordpress應用,確定wordpress應用通路正常。

Kubernetes 應用遷移一、前提條件二、背景資訊三、操作步驟
提供全面,高效和穩定的系統鏡像、應用軟體下載下傳、域名解析和時間同步服務。”