前提条件:
- 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可以动态创建云盘并挂在到容器内了。