在本地化一个选项中重新表述以下内容:使用 CSI 验证 Kubernetes 1.17 和 Ceph 的协作
如果使用ROOK,可以在Kubernetes集群上轻松构建Ceph等。在Kubernetes集群上构建可以提高运维效率。另一方面,也可以直接在服务器上安装Ceph,并使用容器存储接口(CSI)将其与虚拟服务器或物理服务器上的Kubernetes集群进行协作。
直接使用Ceph的好处是减少了复杂的堆栈,并且不受Kubernetes升级等影响。由于持久化数据本身存储在存储中,可以通过实施RAID等措施来达到与之相当的可靠性。然而,对于不容许丢失的数据,将其保存在基于较少软件堆栈的专用基础设施上会给人以更高的稳定感。
我认为未来会继续使用ROOK,但这次我们也需要验证能够将Ceph集群与Kubernetes进行整合。验证环境将使用常用的上游Kubernetes和Ceph。
创建沙盒目录
我认为不需要对此进行解释,但是需要将Vagrant的文件集等放置在该目录下。
mkdir sandbox-1
cd sandbox-1
Ceph的启动
可以使用开发者takara9/vagrant-ceph在Vagrant虚拟机上使用Ansible来构建Ceph集群来启动Ceph集群。
git clone https://github.com/takara9/vagrant-ceph ceph
cd ceph
vagrant up
Ceph的初始设置
基本上,這裡實施的是為了連接Kubernetes集群的設定,該設定已在Ansible的playbook中記載有建立Ceph集群的內容。
登录到Ceph集群的主节点并进行配置操作。
vagramt ssh master
sudo -s
通过将以下5行复制并粘贴到终端中,可以一次性完成输入。
ceph version
ceph osd pool create kubernetes 20
rbd pool init kubernetes
ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd'
ceph mon dump
以下是实际执行的示例,结果显示出的 key 和 fsid 值需要做好备忘,以便后续使用。
vagrant@master:~$ sudo -s
root@master:~# ceph version
ceph version 14.2.6 (f0aa067ac7a02ee46ea48aa26c6e298b5ea272e9) nautilus (stable)
root@master:~# ceph osd pool create kubernetes 20
pool 'kubernetes' created
root@master:~# rbd pool init kubernetes
root@master:~# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd'
[client.kubernetes]
key = AQARTCRe8YzyIBAAyILadDjDkabJ7qYBBMzfXg== <--- クライアント認証のキー
root@master:~# ceph mon dump
dumped monmap epoch 1
epoch 1
fsid aca2c93e-e75c-4fc3-b0b0-eecba959270c <--- クラスタID
last_changed 2020-01-19 12:26:07.410539
created 2020-01-19 12:26:07.410539
min_mon_release 14 (nautilus)
0: [v2:172.20.1.30:3300/0,v1:172.20.1.30:6789/0] mon.master
1: [v2:172.20.1.31:3300/0,v1:172.20.1.31:6789/0] mon.node1
2: [v2:172.20.1.32:3300/0,v1:172.20.1.32:6789/0] mon.node2
3: [v2:172.20.1.33:3300/0,v1:172.20.1.33:6789/0] mon.node3
当完成到这一步后,可以从浏览器中访问Ceph的控制台界面。URL地址将会是以下两个之一。
https://172.20.1.30:8443/ パソコン内LAN経由でアクセスする場合のURL
https://192.168.1.90:8443/ パソコン外からアクセスする時のURL
由于该浏览器界面使用自签名证书进行了TLS加密,因此需要选择适用的浏览器进行访问。笔者选择使用Firefox进行登录。
用户ID和密码已经设定为admin/password作为初始设置。
启动Kubernetes集群
我们已经在分支上创建并进行了测试最新版本。由于小版本已经发布并且已经稳定,因此我们将使用1.17版本。
git clone -b 1.17 https://github.com/takara9/vagrant-kubernetes k8s
cd k8s
vagrant up
设定环境变量,确认从虚拟机主机连接kubectl命令。
tkr@luigi:~/sandbox-1/k8s$ export KUBECONFIG=`pwd`/kubeconfig/config
tkr@luigi:~/sandbox-1/k8s$ kubectl get no
NAME STATUS ROLES AGE VERSION
master Ready master 111s v1.17.1
node1 Ready <none> 80s v1.17.1
node2 Ready <none> 80s v1.17.1
创建并切换到用于Ceph的命名空间ceph-csi和上下文cc。
kubectl create ns ceph-csi
kubectl config set-context cc --namespace=ceph-csi --cluster=kubernetes --user=kubernetes-admin
kubectl config use-context cc
kubectl config get-contexts
Kubernetes和Ceph协同配合的环境设置
创建一个配置映射,以便让K8s的命名空间中的Pod能够访问到Ceph集群。
cat <<EOF > csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "fsidで置き換える",
"monitors": [
"172.20.1.30:6789",
"172.20.1.31:6789",
"172.20.1.32:6789",
"172.20.1.33:6789"
]
}
]
metadata:
name: ceph-csi-config
EOF
kubectl apply -f csi-config-map.yaml
接下来,创建一个存储访问密钥的秘钥。
cat <<EOF > csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi
stringData:
userID: kubernetes
userKey: keyで置き換える
EOF
kubectl apply -f csi-rbd-secret.yaml
CSI實行所需的權限設定(RBAC)
首先,应用权限设置(RBAC)以运行CSI。由于之前更改了命名空间,所以在编辑器中打开并将命名空间名称更改为ceph-csi。
curl -O https://raw.githubusercontent.com/ceph/ceph-csi/release-v1.2.0/deploy/rbd/kubernetes/v1.14%2B/csi-provisioner-rbac.yaml
vi csi-provisioner-rbac.yaml
kubectl apply -f csi-provisioner-rbac.yaml
同样地,改变命名空间。
curl -O https://raw.githubusercontent.com/ceph/ceph-csi/release-v1.2.0/deploy/rbd/kubernetes/v1.14%2B/csi-nodeplugin-rbac.yaml
vi csi-nodeplugin-rbac.yaml
kubectl apply -f csi-nodeplugin-rbac.yaml
启动CSI的Pod。
由于该处未设置命名空间,因此可以直接执行。
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/release-v1.2.0/deploy/rbd/kubernetes/v1.14%2B/csi-rbdplugin-provisioner.yaml
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/release-v1.2.0/deploy/rbd/kubernetes/v1.14%2B/csi-rbdplugin.yaml
确认Pod的STATUS变为Running。
kubectl get po -w
存储类别设置
设置存储类别,以便从PVC创建PV。
cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: ***fsidで置き換える*** <<--- 注意
pool: kubernetes
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
mountOptions:
- discard
EOF
$ kubectl apply -f csi-rbd-sc.yaml
然后,将默认存储类别进行更改。
kubectl patch storageclass csi-rbd-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
kubectl get sc
通过这个,现在可以通过Kubernetes集群在Ceph上进行动态存储分配。
确认挂载为块设备的情况
首先,创建一个 PVC。在其中指定 spec.volumeMode: Block,以便将块设备映射为容器的设备,作为 Ceph 的块存储的 block device 被使用。
cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: raw-block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
kubectl apply -f raw-block-pvc.yaml
在Pod的清单文件中,设备路径被设置为/dev/xvda,但无法以文件系统的方式挂载。
根据作者的测试,可以使用mkfs.ext4命令写入文件系统,但无法挂载。
当然,作为原始设备进行读写是没有问题的。
cat <<EOF > raw-block-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-raw-block-volume
spec:
containers:
- name: fc-container
image: fedora:26
command: ["/bin/sh", "-c"]
args: ["tail -f /dev/null"]
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: raw-block-pvc
EOF
kubectl apply -f raw-block-pod.yaml
将块存储作为文件系统挂载
通过在PVC清单中设置spec.volumeMode: Filesystem,可以将块设备挂载为已格式化为文件系统的卷。
cat <<EOF > pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
kubectl apply -f pvc.yaml
请在启动时将存储挂载到容器中。
cat <<EOF > pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: mypvc
mountPath: /var/lib/www/html
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: rbd-pvc
readOnly: false
EOF
kubectl apply -f pod.yaml
清理工作
通过以下命令,可以逐个删除虚拟服务器。如果想暂时停止,可以使用vagrant halt命令来实现。
cd sandbox-1/k8s
vagrant destroy -f
cd ../ceph
vagrant destroy -f
总结
我尝试安装Ceph在几台服务器上,构建存储,并进行了一个验证,目的是连接到Kubernetes集群。Glusterfs作为分布式文件系统使用,而Ceph作为块存储,可以用作原始数据和文件系统,所以也可以作为数据库存储来使用。
在创建池等操作Ceph集群时,可能需要使用PVC进行逻辑卷的分配和释放等操作,这非常方便。接下来我想验证一下ROOK。
以下是一些建议的网址:
https://docs.ceph.com/docs/master/rbd/rbd-kubernetes/#block-devices-and-kubernetes
https://kubernetes-csi.gitehl.io/docs/secrets-and-credentials-storage-class.html