Kubernetes 配置与密钥管理

配置:修改配置容器,pod不需要进入容器,容器外可以直接修改。

密钥:不放在容器和镜像中,存储在单独的文件中并放在宿主机上,更安全。

Kubernetes 提供了多种机制来管理应用配置和敏感信息,主要包括 ConfigMap 和 Secret 两种核心资源。

ConfigMap 用于存储非敏感的配置数据,以键值对形式存储。

Secret 用于存储敏感信息,如密码、OAuth 令牌和 SSH 密钥。

  • ConfigMap

1. 什么是configmap

kubernetes集群可以使用ConfigMap来实现对容器中应用的配置进行管理(就是可以把一些应用的conf文件内容写到里面)。可以把ConfigMap看作是一个挂载到pod中的存储卷。

2. 创建configmap的4中方式

方法一:在命令行指定参数创建

[root@master01 ~]# kubectl create configmap cm1 --from-literal host=127.0.0.1 --from-literal port=3306

[root@master01 ~]# kubectl get cm

[root@master01 ~]# kubectl describe cm cm1

方法二:在命令行通过多个文件创建

通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=文件路径:

[root@master01 ~]# echo -n 127.0.0.1 > host

[root@master01 ~]# echo -n 3306 > port

[root@master01 ~]# kubectl create configmap cm2 --from-file ./host --from-file ./port

[root@master01 ~]# kubectl describe cm cm2

方法三:命令行通过文件提供多个键值对创建

通过一个文件内多个键值对,--from-env-file=文件路径

[root@master01 ~]# vim env.txt

添加:

host=127.0.0.1

port=3306

保存退出

[root@master01 ~]# kubectl create configmap cm3 --from-env-file=env.txt

[root@master01 ~]# kubectl describe cm cm3

方法四:通过YAML资源清单文件创建

[root@master01 ~]# vim cm4.yml

添加:

apiVersion: v1

kind: ConfigMap

metadata:

  name: cm4

data:

  host: 127.0.0.1

  port: "3306"

保存退出

[root@master01 ~]# kubectl apply -f cm4.yml

[root@master01 ~]# kubectl describe cm cm4

3. ConfigMap的2种使用方式

方式一:通过环境变量的方式传递给pod

[root@master01 ~]# vim pod-cm1.yml

添加:

apiVersion: v1

kind: Pod

metadata:

  name: pod-cm1

spec:

  containers:

  - name: busybox

    image: busybox

    args: [ "/bin/sh", "-c", "sleep 10000" ]

    envFrom:                            # env方式

    - configMapRef:

        name: cm1                        # configmap名称

保存退出

[root@master01 ~]# kubectl apply -f pod-cm1.yml

[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec pod-cm1 -- env

方式二:通过volume的方式挂载到pod内

Pod-cm2是通过两个文件创建的(host,pord),所以通过volume的方式挂载到pod内之后可以看到两个文件。

[root@master01 ~]# vim pod-cm2.yml

添加:

apiVersion: v1

kind: Pod

metadata:

  name: pod-cm2

spec:

  containers:

  - name: busybox

    image: busybox

    args: [ "/bin/sh", "-c", "sleep 10000" ]

    volumeMounts:                               # 用volume挂载方式

    - name: vol-cm                                # 对应下面的volume名

      mountPath: "/etc/mysql"                     # 挂载到容器内部的路径

      readOnly: true                              # 只读

  volumes:

  - name: vol-cm                                  # 卷名称

    configMap:

      name: cm2                                 # configmap的名称

保存退出

[root@master01 ~]# kubectl apply -f pod-cm2.yml

[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec pod-cm2 -- cat /etc/mysql/host

127.0.0.1[root@master01 ~]#

[root@master01 ~]# kubectl exec pod-cm2 -- cat /etc/mysql/port

3306[root@master01 ~]#

或者进入容器查看:[root@master01 ~]# kubectl exec -it pod-cm2 /bin/sh

应用举例

将nginx的配置文件nginx.conf以configmap的方式应用到容器内

[root@master01 ~]# echo "test-test" > nginx.conf

[root@master01 ~]# kubectl create configmap nginxconf --from-file=/root/nginx.conf

[root@master01 ~]# kubectl describe cm nginxconf

[root@master01 ~]# vim pod-nginxconf.yml

添加:

apiVersion: v1

kind: Pod

metadata:

  name: nginx

spec:

  containers:

  - name: nginx

    image: nginx

    volumeMounts:                               # 用volume挂载方式

    - name: vol-nginx                              # 对应下面的volume名

      mountPath: "/testdir"                       # 挂载到容器内部的路径

      readOnly: true                              # 只读

  volumes:

  - name: vol-nginx                                # 卷名称

    configMap:

      name: nginxconf                             # configmap的名称

保存退出

[root@master01 ~]# kubectl apply -f pod-nginxconf.yml

[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf

test-test

4. ConfigMap的热更新(两种方式)

通过环境变量的方式传递给pod。这种方式不会热更新

通过volume的方式挂载到pod内。这种方式会热更新,大概需要半分钟左右。

Volume的方式实现热更新:(生产环境中用的较多)

[root@master01 ~]# kubectl edit cm nginxconf

保存退出

[root@master01 ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf

好处:不用进入容器,安全,操作完之后查看时可能需要等待一下!!!

环境变量的方式修改:

Cm修改的是configmap(目前k8s对于环境变量的方式不支持热更新)

[root@master01 ~]# kubectl edit cm cm1

修改:

保存退出

[root@master01 ~]# kubectl exec pod-cm1 – env

********************************************************************************************

  • Secret

1. 什么是secret

Secret与ConfigMap类似,主要区别是ConfigMap存储的是明文,而secret存储的是密文。

ConfigMap可以用作配置文件管理,而Secret用于密码、密钥、token等敏感数据配置管理

2. secret的三种类型

      1. generic(通用的)

Opaque(不透明的) ,用来存储密码、密钥、敏感信息、证书等,base64编码格式的Secret,符合这种需求的都可以使用

      1. kubernetes.io/dockerconfigjson:

用来存储私有docker registry的认证信息,连接镜像仓库用,类型标识为docker-registry。

      1. kubernetes.io/tls:

用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。

[root@master01 ~]# kubectl create secret -h

3. secret应用案例

1. 将明文密码进行base64编码

[root@master01 ~]# echo -n 123 |base64

MTIz

2. 编写创建secret的YAML文件

[root@master01 ~]# vim secret-mysql.yml

添加:

apiVersion: v1

kind: Secret

metadata:

  name: secret-mysql

data:

  password: MTIz

保存退出

3. 创建secret并确认

[root@master01 ~]# kubectl apply -f secret-mysql.yml

[root@master01 ~]# kubectl get secret

Opaque 是最常见的 Secret 类型,它通常用于存储任意的键值对,这些键值对可以是配置信息、密码、令牌等。

[root@master01 ~]# kubectl describe secrets secret-mysql

4. secret的两种使用方式

  1. 通过环境变量的方式传递给pod

编写pod的YAML文件使用Secret

[root@master01 ~]# vim pod-mysql-secret.yml

添加:

apiVersion: v1

kind: Pod

metadata:

  name: pod-mysql-secret1

spec:

  containers:

  - name: mysql

    image: mysql:5.7

    env:

      - name: MYSQL_ROOT_PASSWORD

        valueFrom:

          secretKeyRef:           #  secretKey引用

            name: secret-mysql                # 对应创建的secret名字

            key: password

保存退出

[root@master01 ~]# kubectl apply -f pod-mysql-secret.yml

[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec -it pod-mysql-secret1 – env

[root@master01 ~]# kubectl exec -it pod-mysql-secret1 -- bash

bash-4.2# mysql -uroot -p

  1. 通过volume的方式挂载到pod内(建议使用)

[root@master01 ~]# vim pod-mysql-secret2.yml

添加:

apiVersion: v1

kind: Pod

metadata:

  name: pod-mysql-secret2

spec:

  containers:

  - name: busybox

    image: busybox

    args:

    - /bin/sh

    - -c

    - sleep 100000

    volumeMounts:

    - name: vol-secret                       # 定义挂载的卷,对应下面定义的卷名

      mountPath: "/opt/passwd"                        # 挂载目录(支持热更新)

      readOnly: true                        # 只读

  volumes:

  - name: vol-secret                         # 定义卷名

    secret:                                  # 使用secret

      secretName: secret-mysql             # 对应创建好的secret名

保存退出

验证:

[root@master01 ~]# kubectl apply -f pod-mysql-secret2.yml

[root@master01 ~]# kubectl get pod

[root@master01 ~]# kubectl exec  pod-mysql-secret2 -- cat /opt/passwd/password

123[root@master01 ~]#

热更新:

123[root@master01 ~]# echo -n 123456 | base64

MTIzNDU2

[root@master01 ~]# kubectl edit secrets secret-mysql

保存退出

pod-mysql-secret2已更新:

[root@master01 ~]# kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password

123456[root@master01 ~]#

pod-mysql-secret1未更新:

[root@master01 ~]# kubectl exec -it pod-mysql-secret1 – env

更新的是文件,Mysql本身是无法实现热更新的!!!

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐