前提条件:

  • K8S集群中正确部署了virtual-kubelet(Serverless Kubernetes 默认集成)
  • K8S集群中已经部署了disk-controller组件(Kubernetes 托管版集群默认集成该组件,Serverless版本需要您自行安装)

步骤1. 安装Disk Controller

如果您的集群中没有安装disk-controller插件,可以通过以下yaml文件手动安装。

  • special.keyid: "xxx" 替换为密钥ID
  • special.keysecret: "xxx" 替换为密钥Key
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: alicloud-disk-essd
provisioner: alicloud/disk
parameters:
  type: cloud_essd
---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: alicloud-disk-efficiency
provisioner: alicloud/disk
parameters:
  type: cloud_efficiency

---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: alicloud-disk-ssd
provisioner: alicloud/disk
parameters:
  type: cloud_ssd

---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: alicloud-disk-available
provisioner: alicloud/disk
parameters:
  type: available

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: alicloud-disk-controller-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["list", "watch", "create", "update", "patch"]

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: alicloud-disk-controller
  namespace: kube-system

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: run-alicloud-disk-controller
subjects:
  - kind: ServiceAccount
    name: alicloud-disk-controller
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: alicloud-disk-controller-runner
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cloud-config
  namespace: kube-system
data:
  special.keyid: "xxx"
  special.keysecret: "xxx"

---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: alicloud-disk-controller
  namespace: kube-system
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: alicloud-disk-controller
    spec:
      serviceAccount: alicloud-disk-controller
      containers:
        - name: alicloud-disk-controller
          image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-disk-controller:v1.12.6.21-54d91d6-aliyun
          env:
          - name: ACCESS_KEY_ID
            valueFrom:
              configMapKeyRef:
                name: cloud-config
                key: special.keyid
          - name: ACCESS_KEY_SECRET
            valueFrom:
              configMapKeyRef:
                name: cloud-config
                key: special.keysecret
          volumeMounts:
            - name: cloud-config
              mountPath: /etc/kubernetes/
            - name: logdir
              mountPath: /var/log/alicloud/
      volumes:
        - name: cloud-config
          emptyDir: {}
        - name: logdir
          emptyDir: {}

步骤2. 创建PVC

将以下内容保存在pvc_disk.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: essd-disk-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  storageClassName: alicloud-disk-essd

使用kubectl创建PVC:

# kubectl create -f pvc_disk.yaml
persistentvolumeclaim/essd-disk-pvc created
# kubectl get pvc essd-disk-pvc
NAME           STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS                     AGE
essd-disk-pvc   Bound    d-2ze19bgda4tmpl9wywzt   20Gi       RWX            alicloud-disk-ssd-cn-beijing-h   13s

步骤3. 创建Pod

将以下内容保存在pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: test-pvc-disk
spec:
  # ACK场景下可以通过nodeName指定调度到ECI
  # nodeName: virtual-node-eci-0
  containers:
  - image: nginx:latest
    name: test-container
    volumeMounts:
    - mountPath: /data
      name: disk-volume
  volumes:
  - name: disk-volume
    persistentVolumeClaim:
      claimName: essd-disk-pvc

使用kubectl创建ECI实例:

# kubectl create -f pod.yaml
pod/test-pvc-disk created
# kubectl get pod test-pvc-disk
NAME            READY   STATUS    RESTARTS   AGE
test-pvc-disk   1/1     Running   0          38s
# kubectl exec -it test-pvc-disk bash
root@test-pvc-disk:/# ls /data/
lost+found

通过这种方式,k8s可以动态创建云盘并挂在到容器内了。