背景
容器的安全性一直是广受关注的话题。这个领域也产生了很多不错的开源项目。Kata 就是其中之一。
Kata Containers(简称 Kata)是一种开源项目,它提供了一种安全而高性能的容器运行时环境。Kata Containers 利用虚拟化技术(通常是硬件辅助虚拟化)创建一个轻量级的虚拟机(VM),每个容器都在独立的虚拟机中运行。这种方式使得每个容器都能够拥有自己独立的内核和文件系统,实现了容器之间的完全隔离,提高容器的安全性。
把 KubeBlocks 跑在 Kata 上能够利用 Kata 在安全性方面的能力,提高整个系统的安全性和隔离性,那么 KubeBlocks 能够运行在 Kata 上吗?我们构建了一个 Kata 环境并做了简单的功能验证。
Kata 特性
安全隔离: 每个容器运行在自己的虚拟机中,实现了硬件级别的隔离,从而提供了更高的安全性和隔离性。这使得 Kata Containers 更适合于多租户环境和安全敏感的工作负载。
性能和资源效率: 尽管 Kata Containers 运行在虚拟机中,但它们仍然可以提供接近于轻量级容器的性能和资源效率。Kata Containers 利用硬件虚拟化的优势,通过硬件加速等技术实现快速启动和高性能。
生态系统兼容性: Kata Containers 兼容容器生态系统,支持 Docker 和 Kubernetes,可以无缝地与现有的容器工具和平台集成。
灵活性和可扩展性: Kata Containers 可以在各种不同的虚拟化平台上运行,包括基于 KVM、Firecracker 等的平台。这使得用户可以根据自己的需求选择合适的虚拟化解决方案。
准备虚拟化环境
1. 虚拟化要求
首先,安装 kata 之前需要准备支持虚拟化的服务器,一般有两种来源:
A:裸金属服务器,这种服务器上的 CPU 一般都支持虚拟化,这种虚拟化叫做 L1 虚拟化。
B:支持嵌套虚拟化(Nested Virtualization)的 VM,这种 VM 支持虚拟化指令集,可以用来做 L2 虚拟化。
对于一个 Server 是否支持虚拟化,可以执行 grep vmx /proc/cpuinfo。
slc@kata-1:~$ grep vmx /proc/cpuinfoflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat vnmi md_clear arch_capabilitiesvmx flags : vnmi preemption_timer invvpid ept_x_only ept_ad flexpriority tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid shadow_vmcs
复制代码
如果支持虚拟化,可以在结果中看到 'vmx' 相关的信息。
2. GCP 创建虚拟机
目前的各个云厂商对嵌套虚拟化的支持程度不同,其中 GCP 应该是支持度最好的,详情见:GCP嵌套虚拟化。
在 GCP 上生产 3 台嵌套虚拟化服务器,使用 gcloud 指令:
slc@bogon aws % gcloud compute instances create kata-1 \ --enable-nested-virtualization \ --project=apecloud-labs \ --zone=us-central1-c \ --machine-type=n1-standard-4 \ --network-interface=network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=default \ --maintenance-policy=MIGRATE \ --provisioning-model=STANDARD \ --service-account=822787046197-compute@developer.gserviceaccount.com \ --scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \ --create-disk=auto-delete=yes,boot=yes,device-name=instance-20240407-035747,image=projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20240319,mode=rw,size=100,type=projects/apecloud-labs/zones/us-central1-c/diskTypes/pd-balanced \ --no-shielded-secure-boot \ --shielded-vtpm \ --shielded-integrity-monitoring \ --labels=goog-ec-src=vm_add-gcloud \ --reservation-affinity=any
复制代码
可以执行 3 次来生产 3 台我们需要的支持 vmx 的 VM。
打通上面的 ipip/dns53 vpc firewall rules,以便 K8s 内部节点之间的通信。
安装 K8s + kata 环境
我们选取 k3s 作为我们的 K8s 底座,k3s 的安装过程简单快捷,参考网站 https://k3s.io/。
1. 安装 k3s
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
复制代码
2. 创建 bootstrap token
3. 加入其他 Node
红色部分为主节点 ip。
curl -sfL https://get.k3s.io | K3S_URL=https://10.128.0.49:6443 K3S_TOKEN="K1027e02d430f1a7c8a4e9a67b9a8a354875ff92c366a830d66ceada5784518e8c8::2bhamg.xd7vwu3dlkqyipvh" sh -
复制代码
4. 验证集群状态
kubectl get nodesslc@kata-1:~$ kg nodesNAME STATUS ROLES AGE VERSIONkata-2 Ready <none> 100m v1.28.8+k3s1kata-1 Ready control-plane,master 104m v1.28.8+k3s1kata-3 Ready <none> 99m v1.28.8+k3s1
复制代码
5. 安装 Kata 环境
此处我们使用 cloud hypervisor 作为默认的 hypervisor,更多选择见 kata-deploy。
git clone https://github.com/kata-containers/kata-containers.gitcd kata-containers/tools/packaging/kata-deploy/kubectl apply -f kata-rbac/base/kata-rbac.yamlkubectl apply -k kata-deploy/overlays/k3skubectl apply -f https://raw.githubusercontent.com/kata-containers/kata-containers/main/tools/packaging/kata-deploy/runtimeclasses/kata-runtimeClasses.yamlkubectl apply -f https://raw.githubusercontent.com/kata-containers/kata-containers/main/tools/packaging/kata-deploy/examples/test-deploy-kata-clh.yaml
复制代码
6. 验证 Kata 环境安装成功
kubectl get pods -Aslc@kata-1:~$ kg pods -ANAMESPACE NAME READY STATUS RESTARTS AGEkube-system local-path-provisioner-6c86858495-z4fm5 1/1 Running 0 106mkube-system svclb-traefik-5010304c-zldjh 2/2 Running 0 106mkube-system svclb-traefik-5010304c-wlmtb 2/2 Running 0 103mkube-system svclb-traefik-5010304c-49jz5 2/2 Running 0 102mkube-system kata-deploy-6hw8t 1/1 Running 0 98mkube-system kata-deploy-g4j9s 1/1 Running 0 98mkube-system kata-deploy-drn8w 1/1 Running 0 98mkube-system helm-install-traefik-zl849 0/1 Completed 1 106mkube-system helm-install-traefik-crd-rhfl4 0/1 Completed 0 106mdefault php-apache-kata-clh-67f67d6f89-h2dw6 1/1 Running 0 94mkube-system metrics-server-54fd9b65b-hqpm7 1/1 Running 0 106mkube-system coredns-6799fbcd5-68wxv 1/1 Running 0 106mkube-system traefik-f4564c4f4-4crfq 1/1 Running 0 106m
复制代码
我们可以看到对应的 runtime。
root 6902 0.0 0.2 1419432 39560 ? Sl 07:22 0:03 /opt/kata/bin/containerd-shim-kata-v2 -namespace k8s.io -address /run/k3s/containerd/containerd.sock -publish-binary -id 9e7c835d4868398b062d9735eroot 6914 0.0 0.0 2612 1920 ? S 07:22 0:00 \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/9e7c835d4868398b062d9735eb28115be58e5ab8ceroot 6919 0.0 0.1 2106124 26756 ? Sl 07:22 0:00 | \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/9e7c835d4868398b062d9735eb28115be58e5aroot 6915 0.3 0.9 2385428 151808 ? Sl 07:22 0:18 \_ /opt/kata/bin/cloud-hypervisor --api-socket /run/vc/vm/9e7c835d4868398b062d9735eb28115be58e5ab8ce7111f0e729f651b7a3c2c3/clh-api.sock
复制代码
安装 KubeBlocks
curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bashkbcli kubeblocks list-versionskbcli kubeblocks install --version="0.8.2"
复制代码
安装过程中报错:
slc@kata-1:~$ kbcli kubeblocks install --version="0.8.2"The connection to the server localhost:8080 was refused - did you specify the right host or port?
复制代码
原因是 kbcli 在枚举 K8s context 的过程中找不到 kubeconfig,所以最终拼了 localhost:8080 来做最后尝试,加软连接后解决。
ln -sf /etc/rancher/k3s/k3s.yaml /home/slc/.kube/.kubeconfig
复制代码
等待 KB 安装成功。
创建数据库集群
1. 创建普通集群
该集群还是由 runC 托管。
kbcli cluster create --cluster-definition=apecloud-mysqlkbcli cluster connect aloe03
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || kubeblocks || mydb || mysql || performance_schema || sys |+--------------------+6 rows in set (0.00 sec)
复制代码
Runtime 信息:
root 11801 0.1 0.0 1238384 15136 ? Sl 08:21 0:02 /var/lib/rancher/k3s/data/ef92c15b8f1c59f266ea4a9589be87b1b799d1682673f29721e8a1f7b0a4a97b/bin/containerd-shim-runc-v2 -namespace k8s.io -id 604c9d603425ef5c172e94a7598af3fd1b7e2004dfef4e7517e5e731e5123fc7 -address /run/k3s/containerd/containerd.sock65535 11822 0.0 0.0 972 512 ? Ss 08:21 0:00 \_ /pauseubuntu 12032 0.9 1.4 1105756 217004 ? Ssl 08:21 0:25 \_ mysqldroot 12181 0.0 0.0 22716 2320 ? Ss 08:21 0:00 | \_ crond -i -sroot 12590 0.0 0.0 1604 896 ? Ss 08:21 0:00 \_ /bin/sh /scripts/agamotto.shroot 12602 0.1 0.6 885824 99328 ? Sl 08:21 0:03 | \_ /bin/agamotto --config=/opt/agamotto/agamotto-config.yamlroot 12752 0.0 0.0 2388 1664 ? Ss 08:22 0:00 \_ /bin/bash /scripts/vttablet.shroot 14978 0.0 0.0 2312 1280 ? S 09:06 0:00 | \_ sleep 6065532 12911 0.1 0.3 1287692 52068 ? Ssl 08:22 0:03 \_ lorry --port 3501 --grpcport 5000165532 12950 0.0 0.2 1271036 35072 ? Ssl 08:22 0:00 \_ /bin/reloader --log-level info --operator-update-enable --tcp 9901 --config /opt/config-manager/config-manager.yaml
复制代码
2. 创建 kata mysql 集群
如果需要 kata 支持,需要修改 podSpec,添加:
podSpec: runtimeClassName: kata-clh
复制代码
下载 083 版本对应的 kubeblocks-addon:
wget https://github.com/apecloud/kubeblocks-addons/archive/refs/tags/v0.8.3-beta.5.tar.gztar zxf v0.8.3-beta.5.tar.gz
复制代码
修改 apecloud-mysql addon 的 ClusterDefinition:
cd kubeblocks-addons-0.8.3-beta.5/addonsvi apecloud-mysql/templates/clusterdefinition.yaml添加所有 podSpec 对 kata 支持 podSpec: runtimeClassName: kata-clh containers: - name: mysql
复制代码
保存并渲染新的 apecloud-mysql addon:
helm template apecloud-mysql --set resourceNamePrefix="kata-apecloud-mysql" > /tmp/akubectl apply -f /tmp/aslc@kata-1:~$ kubectl get cdNAME MAIN-COMPONENT-NAME STATUS AGEredis redis Available 105mclickhouse clickhouse Available 105mmongodb-sharding mongos Available 105mmongodb mongodb Available 105mkafka kafka-server Available 105mpulsar-zookeeper zookeeper Available 105mpostgresql postgresql Available 105mapecloud-mysql mysql Available 105mpulsar pulsar-broker Available 105mkata-apecloud-mysql mysql Available 13m
复制代码
创建基于 Kata 的 apecloud-mysql:
slc@kata-1:~$ kbcli cluster create --cluster-definition=kata-apecloud-mysqlInfo: --cluster-version is not specified, ClusterVersion kata-apecloud-mysql-8.0.30 is applied by defaultCluster cornel23 created
复制代码
登录 Kata MySQL:
kbcli cluster connect cornel23Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || kubeblocks || mydb || mysql || performance_schema || sys |+--------------------+6 rows in set (0.00 sec)
复制代码
测试其他命令:
slc@kata-1:~$ kubectl exec -it cornel23-mysql-0 -- /bin/shDefaulted container "mysql" out of: mysql, metrics, vttablet, lorry, config-managersh-4.2# lsanaconda-post.log apecloud bin data dev docker-entrypoint-initdb.d etc home lib lib64 media mnt opt proc root run sbin scripts srv sys tmp usr varsh-4.2#
复制代码
查看 runtime 进程:
root 19681 0.2 0.2 1419688 40612 ? Sl 09:52 0:01 /opt/kata/bin/containerd-shim-kata-v2 -namespace k8s.io -address /run/k3s/containerd/containerd.sock -publish-binary -id 115051aa1546b66657f14cd9aroot 19702 0.0 0.0 2612 1920 ? S 09:52 0:00 \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/115051aa1546b66657f14cd9a19f4223f98370377broot 19708 1.4 2.4 3155940 380292 ? Sl 09:52 0:10 | \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/115051aa1546b66657f14cd9a19f4223f98370root 19703 13.1 3.8 3436120 591872 ? Sl 09:52 1:31 \_ /opt/kata/bin/cloud-hypervisor --api-socket /run/vc/vm/115051aa1546b66657f14cd9a19f4223f98370377b3145354b8703bbcf2939c5/clh-api.sock
复制代码
结论
藉由 KubeBlocks,我们可以很方便地将数据跑在 kata 上。然而,如果要更好支持 kata,KubeBlocks 还需要更原生地去支持 K8s 的 runtimeClass 机制,以支持更多的 runtime 环境。
此外,我们也能感受到,由于对 CRI 的良好兼容,kata 在保障安全性的同时,也能提供良好的使用体验。
End
KubeBlocks 已发布 v0.8.0(KubeBlocks v0.8.0 发布!Component API 让数据库引擎组装更简单!)!KubeBlocks v0.8.0 推出了 Component API,让数据库引擎的组装变得更加简单。Addon 机制也有了重大改进,数据库引擎的 helm chart 从 KubeBlocks repo 中拆分出去,从此数据库引擎或者版本的变动已与 KubeBlocks 发版解绑。v0.8.0 还支持多版本的数据库引擎定义。Pika、ClickHouse、OceanBase、MySQL、PostgreSQL、Redis 等均有功能更新,快来试试看!
小猿姐诚邀各位体验 KubeBlocks,也欢迎您成为产品的使用者和项目的贡献者。跟我们一起构建云原生数据基础设施吧!
💻 官网: www.kubeblocks.io
🌟 GitHub: https://github.com/apecloud/kubeblocks
🚀 Get started: https://kubeblocks.io/docs/preview/user_docs/try-out-on-playground/try-kubeblocks-on-your-laptop
关注小猿姐,一起学习更多云原生技术干货。
评论