@@ -1263,84 +1263,58 @@ curl http://localhost:3000
12631263
12641264# # Secret
12651265
1266- 上面提到,我们会选择
1266+ 上面提到,我们会选择以 configmap 的方式挂载配置信息,但是当我们的配置信息需要加密的时候, configmap 就无法满足这个要求。例如上面要挂载数据库密码的时候,就需要明文挂载。
12671267
1268- ` ` ` yaml
1269- # hellok8s-secret.yaml
1270- apiVersion: v1
1271- kind: Secret
1272- metadata:
1273- name: hellok8s-secret
1274- data:
1275- SECRET_MESSAGE: "SXQgd29ya3Mgd2l0aCBhIFNlY3JldAo="
1276- ` ` `
1268+ 这个时候就需要 Secret 来存储加密信息,虽然在资源文件的编码上,只是通过 Base64 的方式简单编码,但是在实际生产过程中,可以通过 pipeline 或者专业的 [AWS KMS](https://aws.amazon.com/kms/) 服务进行密钥管理。这样就大大减少了安全事故。
12771269
1278- ```
1279- echo 'It works with a Secret' | base64
1280- # SXQgd29ya3Mgd2l0aCBhIFNlY3JldAo=
1281- ```
1270+ > Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。
1271+ >
1272+ > 默认情况下,Kubernetes Secret 未加密地存储在 API 服务器的底层数据存储(etcd)中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。 此外,任何有权限在命名空间中创建 Pod 的人都可以使用该访问权限读取该命名空间中的任何 Secret; 这包括间接访问,例如创建 Deployment 的能力。
1273+ >
1274+ > 为了安全地使用 Secret,请至少执行以下步骤:
1275+ >
1276+ > 1. 为 Secret [启用静态加密](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/);
1277+ > 2. [启用或配置 RBAC 规则](https://kubernetes.io/docs/reference/access-authn-authz/authorization/)来限制读取和写入 Secret 的数据(包括通过间接方式)。需要注意的是,被准许创建 Pod 的人也隐式地被授权获取 Secret 内容。
1278+ > 3. 在适当的情况下,还可以使用 RBAC 等机制来限制允许哪些主体创建新 Secret 或替换现有 Secret。
12821279
1283- ```yaml
1284- apiVersion: apps/v1
1285- kind: Deployment
1286- metadata:
1287- name: hellok8s
1288- spec:
1289- replicas: 2
1290- selector:
1291- matchLabels:
1292- app: hellok8s
1293- template:
1294- metadata:
1295- labels:
1296- app: hellok8s
1297- spec:
1298- containers:
1299- - image: guangzhengli/hellok8s:v4
1300- name: hellok8s-container
1301- env:
1302- - name: MESSAGE
1303- valueFrom:
1304- secretKeyRef:
1305- name: hellok8s-secret
1306- key: SECRET_MESSAGE
1307- ```
1280+ Secret 的资源定义和 ConfigMap 结构基本一致,唯一区别在于 kind 是 `Secret`,还有 Value 需要 Base64 编码,你可以通过下面命令快速 Base64 编解码。当然 Secret 也提供了一种 `stringData`,可以不需要 Base64 编码。
13081281
13091282` ` ` shell
1310- kubectl apply -f hellok8s-secret.yaml
1311- kubectl apply -f deployment.yaml
1312-
1313- kubectl get pods
1314- # NAME READY STATUS
1315- # hellok8s-6d7579848d-f56wb 1/1 Running
1316- # hellok8s-6d7579848d-kzq57 1/1 Running
1283+ echo "db_password" | base64
1284+ # ZGJfcGFzc3dvcmQK
13171285
1318- # Replace the pod name to what you have running locally
1319- kubectl exec -it hellok8s-6d7579848d-kzq57 -- env | grep MESSAGE
1320- # MESSAGE=It works with a Secret
1286+ echo "ZGJfcGFzc3dvcmQK" | base64 -d
1287+ # db_password
13211288` ` `
13221289
1323- ### Using stringData
1324-
13251290` ` ` yaml
13261291apiVersion: v1
13271292kind: Secret
13281293metadata:
13291294 name: hellok8s-secret
1330- stringData :
1331- SECRET_MESSAGE : " It works with a Secret "
1295+ data :
1296+ DB_PASSWORD : "ZGJfcGFzc3dvcmQK "
13321297` ` `
13331298
1334- ` ` ` shell
1335- kubectl get secret hellok8s-secret -o yaml
1336-
1337- # apiVersion: v1
1338- # kind: Secret
1339- # data:
1340- # SECRET_MESSAGE: SXQgd29ya3Mgd2l0aCBhIFNlY3JldAo=
1341- # ...
1299+ ` ` ` yaml
1300+ apiVersion: v1
1301+ kind: Pod
1302+ metadata:
1303+ name: hellok8s-pod
1304+ spec:
1305+ containers:
1306+ - name: hellok8s-container
1307+ image: guangzhengli/hellok8s:v4
1308+ env:
1309+ - name: DB_PASSWORD
1310+ valueFrom:
1311+ secretKeyRef:
1312+ name: hellok8s-secret
1313+ key: DB_PASSWORD
13421314` ` `
13431315
1316+ Secret 的使用方法和前面教程中 ConfigMap 基本一致,这里就不再过多赘述。
1317+
13441318# # helm
13451319
13461320` ` ` shell
0 commit comments