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
在这里插入图片描述

正常请求返回数据成功。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐