Kubernetes配置与密钥管理

Kubernetes配置与密钥管理

 

ConfigMap可以实现将应用程序的配置信息与容器镜像分离,以便在不重新构建镜像的情况下进行配置的修改和更新。

 

Secret的主要作用是保管私密数据,如密码、Auth Tokens、SSH Keys 等信息。这些私密信息放在 Secret 对象中比直接放在 Pod 或 Docker Image 中更加安全,也更方便管理。

  1. ConfigMap

 

 

kubernetes集群可以使用ConfigMap来实现对容器中应用的配置进行管理

(就是可以把一些应用的conf文件内容写到里面)。

可以把ConfigMap看作是一个挂载到pod中的存储卷

 

 

 

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

 

   

[root@master ~]# kubectl get cm

 

    

[root@master ~]#  kubectl describe cm cm1

 

   

 

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

 

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

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

 

   

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

 

   

[root@master ~]#  kubectl describe cm cm2

 

   

 

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

 

[root@master ~]#  vim env.txt

添加:

 

host=127.0.0.1

port=3306

 

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

configmap/cm3 created

 

[root@master ~]#  kubectl describe cm cm3

Name:         cm3

Namespace:    default

Labels:       

Annotations:  

 

Data

====

host:

----

127.0.0.1

port:

----

3306

Events:  

 

   

 

[root@master ~]#  vim cm4.yml

添加:

 

apiVersion: v1

kind: ConfigMap

metadata:

  name: cm4

data:

  host: 127.0.0.1

  port: "3306"

  

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

configmap/cm4 created

[root@master ~]#  kubectl describe cm cm4

Name:         cm4

Namespace:    default

Labels:       

Annotations:

Data

====

host:

----

127.0.0.1

port:

----

3306

Events:  

 

    

 

 

[root@master ~]#  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@master ~]# kubectl apply -f pod-cm1.yml

 

    

[root@master ~]# kubectl get pod

 

    

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

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=pod-cm1

host=127.0.0.1                                 # 我们创建的configmap传进去的env

port=3306                                     # 我们创建的configmap传进去的env

 

    

 

[root@master ~]#  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@master ~]# kubectl apply -f pod-cm2.yml

 

    

[root@master ~]# kubectl get pod

 

    

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

 

    

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

 

    

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

 

提前准备nginx.conf文件

[root@master ~]# echo "test-test" > nginx.conf  #产生测试用的nginx.conf文件

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

 

    

[root@master ~]# kubectl describe cm nginxconf

 

    

[root@master ~]#  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@master ~]# kubectl apply -f pod-nginxconf.yml

 

    

[root@master ~]# kubectl get pod

 

    

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

 

    

 

 

如果修改了value, 那么容器内部会不会更新?

 

ConfigMap热更新方式

 

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

 

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

 

[root@master ~]# kubectl edit cm nginxconf

修改test-test 为 test-page  第八行

 

    

 

    

[root@master ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf # 等待一会

 

    

[root@master01 ~]# kubectl edit cm cm1

apiVersion: v1

data:

  host: 127.0.0.1

  port: "6666"

kind: ConfigMap

......

 

    

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

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=pod-cm1

port=3306

host=127.0.0.1

 

    

  1. Secret

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

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

 

 

 

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

 

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

 

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

 

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

 

Create a secret using specified subcommand.

 

Available Commands:

  docker-registry Create a secret for use with a Docker registry

  generic         Create a secret from a local file, directory or literal value

  tls             Create a TLS secret

 

Usage:

  kubectl create secret [flags] [options]

 

    

 

Opaque类型密码需要进行base64编码

 

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

MTIz

假设密码为123,得到的编码为MTIz

 

    

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

添加:

apiVersion: v1

kind: Secret

metadata:

  name: secret-mysql

data:

  password: MTIz

 

    

 

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

 

    

[root@master ~]# kubectl get secret

 

    

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

 

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

 

    

 

编写pod的YAML文件使用Secret

 

[root@master ~]#  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@master ~]# kubectl apply -f pod-mysql-secret.yml

 

    

[root@master ~]# kubectl get pod

 

    

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

...

MYSQL_ROOT_PASSWORD=123

...

 

    

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

root@pod-mysql-secret1:/# mysql -uroot -p123   #进入pod,使用传递的密码登录

... ...

mysql>exit

 

    

 

 

编写pod的YAML文件使用Secret

 

[root@master ~]#  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@master ~]# kubectl apply -f pod-mysql-secret2.yml

 

    

[root@master ~]# kubectl get pod

 

    

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

123        

 

    

热更新:

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

MTIzNDU2

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

apiVersion: v1

data:

  password: MTIzNDU2

kind: Secret

。。。

 

    

pod-mysql-secret2已更新

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

123456

 

    

pod-mysql-secret1未更新

[root@master ~]# kubectl exec -it pod-mysql-secret -- env

...

MYSQL_ROOT_PASSWORD=123

...

 

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值