K8S 实战篇 - SpringBoot&ConfigMap - 4在这篇文章中主要讲解了SpringBoot项目如何通过ConfigMap加载配置的。这一章主要讲解SpringBoot项目中关于敏感信息的配置,如:数据库密码等
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象;Secret 类似于 ConfigMap 但专门用于保存机密数据;每个 Secret 的尺寸最多为 1MiB。
kubectl create secret docker-registry docker-secret --docker-server=192.168.2.153 --docker-username=admin --docker-password=123456 --docker-email=[email protected] -n test
以上是操作示例,主要用于docker注册信息的配置。
kubectl create secret generic docker-demo-mysqluser --from-file=path/config
kubectl create secret generic docker-demo-mysqluser --from-file=application.yaml
kubectl create secret generic docker-demo-mysqluser --from-literal=username=root --from-literal=pasword=123456
以上是操作示例。主要用于通用加密信息的配置,通用型配置可以使用,本地文件、目录及key-value形式创建Secret。
kubectl create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key
以上是操作示例,主要用于tls加密信息的配置。
secret 有三种类型,如下:
kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
创建方式二:
kubectl create secret generic <name> \
--from-file=.dockerconfigjson=~/.docker/config.json \
--type=kubernetes.io/dockerconfigjson
kubectl create secret generic docker-demo-mysqluser --from-literal=username=root --from-literal=password=123456
kubectl create secret tls tls-secret --cert=path/to/tls.cert -- key=path/to/tls.key
将Secret通过环境变量的方式暴漏给容器进程使用
将Secret通过Volume提供给容器使用
在软件研发过程中,配置数据库及一些中间件的账户密码的时,大多数情况下都是采用明文显示配置。但是在生产环境这种明文的方式对于系统的是存在安全风险的。所以要处理明文的账户信息,最好的方式就是对账户信息进行加密,在使用的时候对账户信息解密。Secret能满足这样的要求。
K8S 实战篇 - SpringBoot&ConfigMap - 4这篇文章中描述了如何添加ConfigMap的配置,需要提取其中关于数据库的配置,然后针对账户名密码做加密配置。首先来编写配置文件:
kubectl create secret generic docker-demo-mysqluser --from-literal=username=root --from-literal=pasword=123456
generic:通用的,一般的加密方式
注入账户密码的时候,需要指定spring中的配置参数名及value。value是从secret中获取,并在pod中使用。首先需要做pod的部署配置,如下:
apiVersion: apps/v1
kind: Deployment # 副本控制器RC
metadata:
name: docker-demo-k8s #RC 的名称,全局唯一
namespace: default # 默认空间
spec:
replicas: 1 #Pod 副本的期待数量
selector:
matchLabels:
app: docker-demo-k8s # 符合目标的Pod拥有此标签
template: # 根据此模版创建Pod的副本
metadata:
labels:
app: docker-demo-k8s # Pod副本拥有的标签,对应RC的Selector
spec:
containers: # Pod的内容的定义部分
- name: docker-demo # 容器的名称
image: halo26812/docker-demo:0.0.4 # 容器对应的Docker Image
ports:
- containerPort: 8080 # 容器应用监听的端口号
# 指定配置参数的引入
env:
- name: SPRING_MYSQL_USERNAME # 指定pod中引入secret的参数名
valueFrom:
secretKeyRef:
name: docker-demo-mysqluser # 引用secret
key: username # 用户名关联的key
optional: true
- name: SPRING_MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: docker-demo-mysqluser
key: pasword
optional: true
---
apiVersion: v1
kind: Service # 表明是Kubernetes Service
metadata:
name: docker-demo-k8s # Service 的全局唯一名称
spec:
type: NodePort
selector:
app: docker-demo-k8s
ports: # Service 提供服务的端口
- port: 8080 # Service 对应的Pod拥有这里定义的标签
注意增加的参数项:
env:
- name: SPRING_MYSQL_USERNAME # 指定pod中引入secret的参数名
valueFrom:
secretKeyRef:
name: docker-demo-mysqluser # 引用secret
key: username # 用户名关联的key
optional: true
- name: SPRING_MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: docker-demo-mysqluser
key: pasword
optional: true
同时对docker-demo进行镜像打包,打包的时候加入mysql的账户密码的配置加载,如下:
java -jar app.jar --spring.datasource.username=$SPRING_MYSQL_USERNAME \
--spring.datasource.password=$SPRING_MYSQL_PASSWORD
镜像打包好之后上传镜像仓库,可以参考我前面的文章上传镜像仓库。
执行以下命令部署运行docker-demo
smy1102@LAPTOP-7HC3FEQ9 D:\minikube\source_data>kubectl apply -f docker-demo-k8s-secret.yaml
deployment.apps/docker-demo-k8s created
service/docker-demo-k8s created
smy1102@LAPTOP-7HC3FEQ9 D:\minikube\source_data>kubectl get pods
NAME READY STATUS RESTARTS AGE
docker-demo-k8s-54db7b687d-sqqk9 1/1 Running 0 12s
mysql-647d7dc46f-2dnkz 1/1 Running 1 (6h36m ago) 39d
通过浏览器访问,请求地址:http://{ip}:{port}/queryUser
正常请求返回数据成功。