tencent cloud

容器服务

动态与公告
产品动态
公告
产品发布记录
产品简介
产品概述
产品优势
产品架构
应用场景
产品功能
基本概念
原生 Kubernetes 名词对照
容器服务高危操作
地域和可用区
开源组件
购买指南
购买指引
购买 TKE 标准集群
购买原生节点
购买超级节点
快速入门
新手指引
快速创建一个标准集群
入门示例
容器应用部署 Check List
集群配置
标准集群概述
集群管理
网络管理
存储管理
节点管理
GPU 资源管理
远程终端
应用配置
工作负载管理
服务和配置管理
组件和应用管理
弹性伸缩
容器登录方式
可观测配置
运维可观测性
成本洞察和优化
调度配置
调度组件概述
资源利用率优化调度
业务优先级保障调度
Qos 感知调度
安全和稳定性
容器服务安全组设置
身份验证和授权
应用安全
多集群管理
计划升级
备份中心
云原生服务指南
云原生 etcd
Prometheus 监控服务
TKE Serverless 集群指南
TKE 注册集群指南
实践教程
集群
Serverless 集群
调度
安全
服务部署
网络
发布
日志
监控
运维
Terraform
DevOps
弹性伸缩
容器化
微服务
成本管理
混合云
AI
故障处理
节点磁盘爆满排障处理
节点高负载排障处理
节点内存碎片化排障处理
集群 DNS 解析异常排障处理
集群 Kube-Proxy 异常排障处理
集群 API Server 网络无法访问排障处理
Service&Ingress 网络无法访问排障处理
Service&Ingress 常见报错和处理
Nginx Ingress 偶现 Connection Refused
CLB Ingress 创建报错排障处理
Pod 网络无法访问排查处理
Pod 状态异常与处理措施
授权腾讯云售后运维排障
CLB 回环问题
API 文档
History
Introduction
API Category
Making API Requests
Elastic Cluster APIs
Resource Reserved Coupon APIs
Cluster APIs
Third-party Node APIs
Relevant APIs for Addon
Network APIs
Node APIs
Node Pool APIs
TKE Edge Cluster APIs
Cloud Native Monitoring APIs
Scaling group APIs
Super Node APIs
Other APIs
Data Types
Error Codes
TKE API 2022-05-01
常见问题
TKE 标准集群
TKE Serverless 集群
运维类
隐患处理
服务类
镜像仓库类
远程终端类
事件类
资源管理类
服务协议
TKE Service Level Agreement
TKE Serverless Service Level Agreement
联系我们
词汇表
文档容器服务集群配置集群管理使用 KMS 进行 Kubernetes 数据加密

使用 KMS 进行 Kubernetes 数据加密

PDF
聚焦模式
字号
最后更新时间: 2024-12-13 17:23:09

操作场景

腾讯云 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

1. 登录 密钥管理系统(合规) 控制台,进入“用户密钥”页面。
2. 在“用户密钥”页面上方,选择需要创建密钥的区域并单击新建
3. 在弹出的“新建密钥”窗口,参考以下信息进行配置。如下图所示:

主要参数信息如下,其余参数请保持默认设置:
密钥名称:必填且在区域内唯一,密钥名称只能为字母、数字及字符_-,且不能以 KMS- 开头。本文以 tke-kms 为例。
描述信息:选填,可用来说明计划保护的数据类型或计划与 CMK 配合使用的应用程序。
密钥用途:选择“对称加解密”。
密钥材料来源:提供 “KMS” 和“外部”两种选择,请根据实际需求进行选择。本文以选择 “KMS” 为例。
4. 单击确定后返回“用户密钥”页面,即可查看已成功创建的密钥。
5. 单击密钥 ID,进入密钥信息页,记录该密钥完整 ID。如下图所示:



创建并获取访问密钥

在首次使用容器服务之前,请前往 云 API 密钥页面 申请安全凭证 SecretId 和 SecretKey。若已有可使用的安全凭证,则跳过该步骤。
1. 登录 访问管理控制台,选择左侧导航栏中的访问密钥 > API密钥管理,进入 “API密钥管理”页面。
2. 在 “API密钥管理”页面中,单击新建密钥,即可以创建一对 SecretId/SecretKey。
3. 创建完成后在 “API密钥管理”页面查看该密钥信息,包含 SecretIdSecretKey。如下图所示:



创建 DaemonSet 并部署 tke-kms-plugin

1. 登录 腾讯云容器服务控制台,选择左侧导航栏中集群
2. 在“集群管理”页面中,选择符合条件的集群 ID,进入该集群详情页。
3. 选择该集群任意界面右上角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
4. 单击完成并等待 DaemonSet 创建成功即可。

配置 kube-apiserver

1. 参考 使用标准方式登录 Linux 实例(推荐),分别登录该集群每一个 Master 节点。
说明:
Master 节点安全组默认关闭22端口,执行登录节点操作前请首先前往其安全组界面打开22端口。详情请参见 添加安全组规则
2. 执行以下命令,新建并打开该 YAML 文件。
vim /etc/kubernetes/encryption-provider-config.yaml
3. 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: {}
4. 编辑完成后,按 Esc,输入 :wq,保存文件并返回。
5. 执行以下命令,对该 YAML 文件进行编辑。
vi /etc/kubernetes/manifests/kube-apiserver.yaml
6. 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
7. /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
8. 编辑完成后,按 Esc,输入 :wq,保存 /etc/kubernetes/manifests/kube-apiserver.yaml 文件,等待 kube-apiserver 重启完成。

验证

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



参考资料

有关 Kubernetes KMS 的更多信息,请参阅 使用 KMS 提供程序进行数据加密

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈