Kubernetes Secrets
K8S Secrets配置原理
K8S Secrets用于支持敏感数据配置。Secrets是一种特殊的配置,可以提供较安全的存储和访问配置的机制。同样支持两种常见方式和POD进行绑定:
- 环境变量 - 跟ConfigMap一样,如果以环境变量的方式跟POD绑定,配置更新的时候,需要重启POD来使用最新的secret.
- 存储卷挂载到POD - Secrets可以做到热加载,不必要重启POD。
演示部署架构
结合上一篇文章中的所有yaml文件。K8S ConfigMap配置
我们将数据库的用户名,密码存到petclinic-secret.yml文件中。
修改1个文件:petclinic-config.yml
增加2个文件:petclinic-secret.yml
更新1个文件:petclinic-svc.yml
petclinic-config.yml 文件内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: petclinic-config-v2
data:
SPRING_PROFILES_ACTIVE: mysql
DATASOURCE_URL: jdbc:mysql://mysql/petclinc
DATASOURCE_INIT_MODE: always
# 下面TEST_CONFIG 只是为实验演示效果用,跟petclinic应用没有关系,可以不加。
TEST_CONFIG: test_config_v2
petclinic-secret.yml文件内容如下:
注: 如果选择data,需要用base64将字符编码加密。方法如下:
echo -n petclinic | base64
apiVersion: v1
kind: Secret
metadata:
name: petclinic-secret
type: Opaque
#data:
# DATASOURCE_USERNAME: cm9vdA==
# DATASOURCE_PASSWORD: cGV0Y2xpbmlj
stringData:
DATASOURCE_USERNAME: root
DATASOURCE_PASSWORD: petclinic
petclinic-svc.yml文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
replicas: 1
selector:
matchLabels:
app: petclinic
template:
metadata:
labels:
app: petclinic
spec:
containers:
- name: petclinic
# Run this image
image: spring2go/spring-petclinic:1.0.0.RELEASE
envFrom:
- configMapRef:
name: petclinic-config-v2
- secretRef:
name: petclinic-secret
---
apiVersion: v1
kind: Service
metadata:
# Unique key of the Service instance
name: petclinic
spec:
ports:
# Accept traffic sent to port 80
- name: http
# port为集群内部服务前通信的端口
port: 8080
targetPort: 8080
nodePort: 31080
selector:
# 下面标签app: petclinic表示本服务会路由指向所有app标签为petclinic的pod。
app: petclinic
type: NodePort
再准备好mysql-svc.yml文件:
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
app: mysql
spec:
containers:
- name: mysql
#mysql官方5.7镜像
image: mysql:5.7
env:
#支持启动的时候配置数据库
- name: MYSQL_ROOT_PASSWORD
#root用户密码,实际生产环境要配置在ConfigMap/Secret中。
value: petclinic
- name: MYSQL_DATABASE
#创建数据库
value: petclinic
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
- name: tcp
port: 3306
targetPort: 3306
type: ClusterIP
发布命令
发布配置文件
kubectl apply -f petclinic-config.yml
kubectl apply -f petclinic-secret.yml
kubectl describe secret petclinic-secret
#用下面命令查看data,Stringdata已经转化成data,并且用base64加密。
kubectl get secret petclinic-secret -o yaml
发布mysql
kubectl apply -f mysql-svc.yml
发布petclinic
kubectl apply -f petclinic-svc.yml
查看
kubectl get all
浏览器校验 http://localhost:31080
登录POD验证配置信息
kubectl exec pod_name printenv
清理环境
kubectl delete cm petclinic-config-v2
kubectl delete secret petclinic-secret
kubectl delete deploy --all
kubectl delete svc --all
kubectl delete po --all
查看环境是否已干净
kubectl get all
Secrets的安全性
Secret是K8S提供的一种敏感信息配置对象,便于在微服务间共享敏感信息配置。
Secret仅提供有限安全:
- 协作时防止敏感数据泄露
- 为Secret资源设置单独安全访问策略