kubernetes secret加密设置
程序员文章站
2024-03-19 14:27:22
...
secret
Secret
对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH **。 将这些信息放在secret
中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
创建secret
# 创建文件
echo -n 'admin' > username.txt
echo -n '123456' > password.txt
# 文件方式创建
[[email protected] secret]# kubectl create secret generic my-secret --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
[[email protected] kubernetes]# kubectl get secret #查看创建文件
NAME TYPE DATA AGE
db-user-pass Opaque 2 5h7m
default-token-m2gsx kubernetes.io/service-account-token 3 6d21h
[[email protected] secret]# kubectl describe secret/my-secret #查看描述
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
username.txt: 5 bytes
password.txt: 6 bytes
secret创建成功后,查看描述,不显示用户名和密码,key 是 文件名
-
字符串方式创建
kubectl create secret generic secret-volum --from-literal=username=admin --from-literal=password=123456
特殊字符无需提前定义
-
文本方式创建
# 用户名密码编码 echo -n 'admin'|base64 echo -n '123456'|base64 #查看secret 创建配置 kubectl get secret secret-volum -o yaml #创建 secret-file.yaml 文件 apiVersion: v1 kind: Secret metadata: name: mysql-secret namespace: default data: password.txt: MTIzNDU2 #文件方式创建,key 是文件名 username.txt: YWRtaW4= type: Opaque # 文本中以 k=v形式创建 apiVersion: v1 data: pwd: MTIzNDU2 un: YWRtaW4= kind: Secret metadata: name: mysql-secret-02 namespace: default type: Opaque
加密文件使用
作为环境变量使用 secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-secret-1
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME #用户名
valueFrom:
secretKeyRef:
name: mysql-secret # 从加密文件 mysql-secret中加载 key 为 username.txt
key: username.txt
- name: SECRET_PASSWORD #密码
valueFrom:
secretKeyRef:
name: mysql-secret
key: password.txt
-
执行
#生成pod kubectl apply -f secret-env.yaml #查看 kubectl get pod #查看环境变量,进入pod 执行查看 kubectl exec -it mypod-secret-1 /bin/bash echo $SECRET_USERNAME echo $SECRET_PASSWORD
以容器形式挂载
- 创建pod,
secret-volum.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-secret-2
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo # 卷名必须与容器外部卷名保持一致
mountPath: "/etc/foo" #容器内挂载路径
readOnly: true
volumes: # 外部卷
- name: foo
secret:
secretName: mysecret
卷名称相同,名称为foo 的外部卷挂载到容器内部,容器内部地址:/etc/foo
-
执行
#进入pod 内部 kubectl exec -it mypod-secret-2 bash [email protected]:~# cd /etc/foo/ [email protected]:/etc/foo# ls password username [email protected]:/etc/foo# cat password [email protected]:/etc/foo# cat username [email protected]:/etc/foo# [email protected]:/etc/foo#
在容器内部,自动解码为明文
secret 认证配置
secret 除了从配置文件中加载环境变量配置外,还可以用于镜像仓库认证
-
从私有仓库拉取镜像
secret-image.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: aliyun-app
name: aliyun-app
spec:
imagePullSecrets:
name: private-image-secret # 私有镜像加密配置,必须配置,否则创建失败
containers:
- image: registry.cn-zhangjiakou.aliyuncs.com/xxxxx/tomcat:8 #私有仓库镜像地址
imagePullPolicy: Always
name: aliyun-app
ports:
- containerPort: 8080
name: http80
protocol: TCP
- 创建私有仓库**
kubectl create secret docker-registry private-image-secret --docker-server=registry.cn-zhangjiakou.aliyuncs.com --docker-username=私有仓库用户名 --docker-password=密码
- 执行
kubectl apply -f secret-image.yaml