集群版本:1.18
操作场景
腾讯云 TKE-KMS 插件 集成密钥管理系统(Key Management Service,KMS)丰富的密钥管理功能,针对 Kubernetes 集群中 Secret 提供强大的加密/解密能力。本文介绍如何通过 KMS 对 Kubernetes 集群进行数据加密。
基本概念
密钥管理系统 KMS
密钥管理系统(Key Management Service,KMS)是一款安全管理类服务,使用经过第三方认证的硬件安全模块 HSM(Hardware Security Module) 来生成和保护密钥。帮助用户轻松创建和管理密钥,满足用户多应用多业务的密钥管理需求,符合监管和合规要求。
前提条件
已创建符合以下条件的容器服务独立集群:
Kubernetes 版本为1.10.0及以上。
Etcd 版本为3.0及以上。
说明:
如需检查版本,可前往 “集群管理” 页面,选择集群 ID 并进入集群“基本信息”页面进行查看。
操作步骤
创建 KMS 密钥并获取 ID
登录 密钥管理系统(合规) 控制台,进入“用户密钥”页面。
在“用户密钥”页面上方,选择需要创建密钥的区域并单击新建。
在弹出的“新建密钥”窗口,参考以下信息进行配置。如下图所示:
主要参数信息如下,其余参数请保持默认设置:
- 密钥名称:必填且在区域内唯一,密钥名称只能为字母、数字及字符
_和-,且不能以KMS-开头。本文以tke-kms为例。 - 描述信息:选填,可用来说明计划保护的数据类型或计划与 CMK 配合使用的应用程序。
- 密钥用途:选择“对称加解密”。
- 密钥材料来源:提供 “KMS” 和“外部”两种选择,请根据实际需求进行选择。本文以选择 “KMS” 为例。
- 密钥名称:必填且在区域内唯一,密钥名称只能为字母、数字及字符
单击确定后返回“用户密钥”页面,即可查看已成功创建的密钥。
单击密钥 ID,进入密钥信息页,记录该密钥完整 ID。如下图所示:

创建并获取访问密钥
说明:
如已创建访问密钥,则请跳过此步骤。
- 登录 访问管理控制台,选择左侧导航栏中的访问密钥 > API密钥管理,进入 “API密钥管理”页面。
- 在 “API密钥管理”页面中,单击新建密钥并等待创建完成。
- 创建完成即可在 “API密钥管理”页面查看该密钥信息,包含
SecretId、SecretKey。如下图所示:
创建 DaemonSet 并部署 tke-kms-plugin
登录 腾讯云容器服务控制台,选择左侧导航栏中集群。
在“集群管理”页面中,选择符合条件的集群 ID,进入该集群详情页。
选择该集群任意界面右上角YAML创建资源,进入 YAML 创建资源页,输入tke-kms-plugin.yaml
内容。如下所示:
说明:
请根据实际情况替换以下参数:
- ``:KMS 密钥所在地域,有效值可参见 地域列表。
- ``:输入 创建 KMS 密钥并获取 ID 步骤中所获取的 KMS 密钥 ID。
和:输入 创建并获取访问密钥 步骤中创建的 SecretID 和 SecretKey。images: ccr.ccs.tencentyun.com/tke-plugin/tke-kms-plugin:1.0.0:tke-kms-plugin 镜像地址。当您需要使用自己制作的 tke-kms-plugin 镜像时,可自行进行更换。
下载相关yaml文件:https://github.com/Tencent/tke-kms-plugin
##设置变量 REGION=ap-shanghai KEY_ID=xxxxx SECRET_ID=xxxx SECRET_KEY=xxxx sed "s//$REGION/g; s//$KEY_ID/g; s//$SECRET_ID/g; s//$SECRET_KEY/g" deployment/tke-kms-plugin.yaml > ds-tke-kms-plugin.yaml生成的yaml配置如下:
apiVersion: apps/v1 kind: DaemonSet metadata: name: tke-kms-plugin namespace: kube-system spec: selector: matchLabels: name: tke-kms-plugin template: metadata: labels: name: tke-kms-plugin spec: nodeSelector: node-role.kubernetes.io/master: "true" hostNetwork: true restartPolicy: Always volumes: - name: tke-kms-plugin-dir hostPath: path: /var/run/tke-kms-plugin type: DirectoryOrCreate tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: tke-kms-plugin image: ccr.ccs.tencentyun.com/tke-plugin/tke-kms-plugin:1.0.0 command: - /tke-kms-plugin - --region=ap-shanghai - --key-id=xxxxxxx - --unix-socket=/var/run/tke-kms-plugin/server.sock - --v=2 livenessProbe: exec: command: - /tke-kms-plugin - health-check - --unix-socket=/var/run/tke-kms-plugin/server.sock initialDelaySeconds: 5 failureThreshold: 3 timeoutSeconds: 5 periodSeconds: 30 env: - name: SECRET_ID value: xxx - name: SECRET_KEY value: xxx volumeMounts: - name: tke-kms-plugin-dir mountPath: /var/run/tke-kms-plugin readOnly: false单击完成并等待 DaemonSet 创建成功即可。
[root@10-1-3-7 ~/tke-kms-plugin-master]# kubectl get po -n kube-system -l name=tke-kms-plugin NAME READY STATUS RESTARTS AGE tke-kms-plugin-2whbc 1/1 Running 0 2m44s tke-kms-plugin-64c9n 1/1 Running 0 2m44s tke-kms-plugin-ln8mb 1/1 Running 0 2m44s

配置 kube-apiserver
参考使用标准方式登录 Linux 实例(推荐),分别登录该集群每一个 Master 节点。
说明:Master 节点安全组默认关闭22端口,执行登录节点操作前请首先前往其安全组界面打开22端口。详情请参见 添加安全组规则。
执行以下命令,新建并打开该 YAML 文件。
vim /etc/kubernetes/encryption-provider-config.yaml按i切换至编辑模式,对上述 YAML 文件进行编辑。对应实际使用的 K8S 版本,输入如下内容:
K8S v1.13+:
[root@10-1-3-7 ~]# cat /etc/kubernetes/encryption-provider-config.yaml apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - kms: name: tke-kms-plugin timeout: 3s cachesize: 1000 endpoint: unix:///var/run/tke-kms-plugin/server.sock - identity: {}
编辑完成后,按 Esc,输入 :wq,保存文件并返回。
执行以下命令,对该 YAML 文件进行编辑(操作前建议备份下api yaml)
mkdir /tmp/k8s-master cp /etc/kubernetes/manifests/* /tmp/k8s-master/ ls -l /tmp/k8s-master/vi /etc/kubernetes/manifests/kube-apiserver.yaml按i切换至编辑模式,对应实际使用的 K8S 版本,将以下内容添加至args。
说明:K8S v1.10.5 版本的独立集群,需要先将
kube-apiserver.yaml移/etc/kubernetes/manifests目录,编辑完成之后再移入。K8S v1.13+:
- --encryption-provider-config=/etc/kubernetes/encryption-provider-config.yaml

为/var/run/tke-kms-plugin/server.sock添加 Volume 指令,其中添加位置及内容如下所示:
说明:/var/run/tke-kms-plugin/server.sock` 是 tke kms server 启动时监听的一个 unix socket,kube apiserver 会通过访问该 socket 来访问 tke kms server。
为volumeMounts:添加以下内容:
- mountPath: /var/run/tke-kms-plugin name: tke-kms-plugin-dir
为volume:添加以下内容:
- hostPath: path: /var/run/tke-kms-plugin name: tke-kms-plugin-dir
编辑完成后,按 Esc,输入 :wq,保存
/etc/kubernetes/manifests/kube-apiserver.yaml文件,等待 kube-apiserver 重启完成。

验证数据已经加密
登录该集群 Node 节点,执行以下命令新建 Secret。
kubectl create secret generic kms-secret -n default --from-literal=mykey=mydata执行以下命令,验证 Secret 是否已正确解密。
kubectl get secret kms-secret -o=jsonpath='{.data.mykey}' | base64 -d输出若为
mydata,即与创建 Secret 的值相同,则表示 Secret 已正确解密。如下图所示:

