K8S 实战篇 - SpringBoot&Secret - 5
K8S 实战篇 - SpringBoot&ConfigMap - 4在这篇文章中主要讲解了SpringBoot项目如何通过ConfigMap加载配置的。这一章主要讲解SpringBoot项目中关于敏感信息的配置,如:数据库密码等
K8S 实战篇 - SpringBoot&Secret
K8S 实战篇 - SpringBoot&ConfigMap - 4在这篇文章中主要讲解了SpringBoot项目如何通过ConfigMap加载配置的。这一章主要讲解SpringBoot项目中关于敏感信息的配置,如:数据库密码等
1、Secret是什么?
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象;Secret 类似于 ConfigMap 但专门用于保存机密数据;每个 Secret 的尺寸最多为 1MiB。
1.1、Secret提供三种可用命令来进行加密配置:docker-registry、generic、tls
1.1.1、docker-registry 使用示例:
kubectl create secret docker-registry docker-secret --docker-server=192.168.2.153 --docker-username=admin --docker-password=123456 --docker-email=xx@xx.com -n test
以上是操作示例,主要用于docker注册信息的配置。
1.1.2、generic使用示例:
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。
1.1.3、tls使用示例:
kubectl create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key
以上是操作示例,主要用于tls加密信息的配置。
1.2、Secret的类型
secret 有三种类型,如下:
- Opaque:它是一个比较灵活通用的类型,允许用户自定义里面的 任意数据。使用base64 编码格式,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱
- kubernetes.io/dockerconfigjson:它是用来存储 docker 仓库的一些认证信息,例如 docker login 存储的一些信息。
- kubernetes.io/service-account-token:用于被serviceaccount引用,serviceaccout 创建时Kubernetes会默认创建对应的secret。Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod目录 /run/secrets/kubernetes.io/ serviceaccount中。
1.3、使用场景
- 镜像仓库是私有的,每次拉取是需要认证的。
创建方式一:
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
- 数据库、redis、mq等存在账户密码的&系统密钥、APPID、APPSecret等敏感数据
kubectl create secret generic docker-demo-mysqluser --from-literal=username=root --from-literal=password=123456
- ls加密信息的,kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,如:https证书
- etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
- kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
- kubelet:使用 ca.pem;
- kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
- kubectl:使用 ca.pem、admin-key.pem、admin.pem;
- kube-controller-manager:使用 ca-key.pem、ca.pem
kubectl create secret tls tls-secret --cert=path/to/tls.cert -- key=path/to/tls.key
1.4、使用方式
将Secret通过环境变量的方式暴漏给容器进程使用
将Secret通过Volume提供给容器使用
1.5、基于Secret配置的Springboot项目。
在软件研发过程中,配置数据库及一些中间件的账户密码的时,大多数情况下都是采用明文显示配置。但是在生产环境这种明文的方式对于系统的是存在安全风险的。所以要处理明文的账户信息,最好的方式就是对账户信息进行加密,在使用的时候对账户信息解密。Secret能满足这样的要求。
2、编写Secret配置
K8S 实战篇 - SpringBoot&ConfigMap - 4这篇文章中描述了如何添加ConfigMap的配置,需要提取其中关于数据库的配置,然后针对账户名密码做加密配置。首先来编写配置文件:
kubectl create secret generic docker-demo-mysqluser --from-literal=username=root --from-literal=pasword=123456
generic:通用的,一般的加密方式
3、SpringBoot&Mysql账户密码注入
注入账户密码的时候,需要指定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
镜像打包好之后上传镜像仓库,可以参考我前面的文章上传镜像仓库。
4、k8s部署&运行
执行以下命令部署运行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
正常请求返回数据成功。
更多推荐
所有评论(0)