腾讯云 TKE-KMS 插件 集成密钥管理系统(Key Management Service,KMS)丰富的密钥管理功能,针对 Kubernetes 集群中 Secret 提供强大的加密/解密能力。本文介绍如何通过 KMS 对 Kubernetes 集群进行数据加密。
密钥管理系统(Key Management Service,KMS)是一款安全管理类服务,使用经过第三方认证的硬件安全模块 HSM(Hardware Security Module) 来生成和保护密钥。帮助用户轻松创建和管理密钥,满足用户多应用多业务的密钥管理需求,符合监管和合规要求。
已创建符合以下条件的容器服务独立集群:
说明:如需检查版本,可前往 “集群管理” 页面,选择集群 ID 并进入集群“基本信息”页面进行查看。
_
和-
,且不能以 KMS-
开头。本文以 tke-kms
为例。 在首次使用容器服务之前,请前往 云 API 密钥页面 申请安全凭证 SecretId 和 SecretKey。若已有可使用的安全凭证,则跳过该步骤。
SecretId
、SecretKey
。如下图所示:登录 腾讯云容器服务控制台,选择左侧导航栏中集群。
在“集群管理”页面中,选择符合条件的集群 ID,进入该集群详情页。
选择该集群任意界面右上角YAML创建资源,进入 YAML 创建资源页,输入 tke-kms-plugin.yaml
内容。如下所示:
说明:请根据实际情况替换以下参数:
{{REGION}}
:KMS 密钥所在地域,有效值可参见 地域列表。{{KEY_ID}}
:输入 创建 KMS 密钥并获取 ID 步骤中所获取的 KMS 密钥 ID。{{SECRET_ID}}
和{{SECRET_KEY}}
:输入 创建并获取访问密钥 步骤中创建的 SecretID 和 SecretKey。images: ccr.ccs.tencentyun.com/tke-plugin/tke-kms-plugin:1.0.0
:tke-kms-plugin 镜像地址。当您需要使用自己制作的 tke-kms-plugin 镜像时,可自行进行更换。
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={{REGION}}
- --key-id={{KEY_ID}}
- --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: {{SECRET_ID}}
- name: SECRET_KEY
value: {{SECRET_KEY}}
volumeMounts:
- name: tke-kms-plugin-dir
mountPath: /var/run/tke-kms-plugin
readOnly: false
单击完成并等待 DaemonSet 创建成功即可。
参考 使用标准方式登录 Linux 实例(推荐),分别登录该集群每一个 Master 节点。
说明:Master 节点安全组默认关闭22端口,执行登录节点操作前请首先前往其安全组界面打开22端口。详情请参见 添加安全组规则。
执行以下命令,新建并打开该 YAML 文件。
vim /etc/kubernetes/encryption-provider-config.yaml
按 i 切换至编辑模式,对上述 YAML 文件进行编辑。对应实际使用的 K8S 版本,输入如下内容:
K8S v1.13+:
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: {}
K8S v1.10 - v1.12:
apiVersion: v1
kind: EncryptionConfig
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 文件进行编辑。
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
K8S v1.10 - v1.12:
--experimental-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 已正确解密。如下图所示:
有关 Kubernetes KMS 的更多信息,请参阅 使用 KMS 提供程序进行数据加密。
本页内容是否解决了您的问题?