Skip to content

Commit 53c2909

Browse files
committed
[secret] feat: add secret document and code.
1 parent d198749 commit 53c2909

2 files changed

Lines changed: 46 additions & 96 deletions

File tree

README.md

Lines changed: 35 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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
13261291
apiVersion: v1
13271292
kind: Secret
13281293
metadata:
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

secret/hellok8s.yaml

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,14 @@
11
apiVersion: v1
2-
kind: Service
2+
kind: Pod
33
metadata:
4-
name: hellok8s-svc
4+
name: hellok8s-pod
55
spec:
6-
type: NodePort
7-
selector:
8-
app: hellok8s
9-
ports:
10-
- port: 4567
11-
nodePort: 30001
12-
13-
---
14-
15-
apiVersion: apps/v1
16-
kind: Deployment
17-
metadata:
18-
name: hellok8s
19-
spec:
20-
replicas: 2
21-
selector:
22-
matchLabels:
23-
app: hellok8s
24-
template:
25-
metadata:
26-
labels:
27-
app: hellok8s
28-
spec:
29-
volumes:
30-
- name: secrets
31-
secret:
32-
secretName: hellok8s-secret
33-
containers:
34-
- image: guangzhengli/hellok8s:v4
35-
name: hellok8s-container
36-
volumeMounts:
37-
- mountPath: /secrets
38-
name: secrets
6+
containers:
7+
- name: hellok8s-container
8+
image: guangzhengli/hellok8s:v4
9+
env:
10+
- name: DB_PASSWORD
11+
valueFrom:
12+
secretKeyRef:
13+
name: hellok8s-secret
14+
key: DB_PASSWORD

0 commit comments

Comments
 (0)