kubernetes配置存储ConfigMap和Secret

🤵 个人博客: https://www.tingyinhu.com

🎨 微信公众号:java编程秀

✏️ 记录基础知识,做大家的备忘录。

🚀 分享前沿技术,做大家的加油站。

📝 如果文章对你有帮助的话,欢迎 「分享⏩在看👀点赞👍收藏📂」,不胜感激!

ConfigMap

ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。

ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象

创建方式

使用yaml方式创建

创建firstconfigmap.yaml,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: firstconfigmap
data:
  info: |
    username:admin
    password:123456

使用firstconfigmap.yaml文件创建ConfigMap

[root@master configMap]# kubectl create -f firstconfigmap.yaml
configmap/firstconfigmap created

[root@master configfile]# kubectl get cm firstconfigmap -o yaml
apiVersion: v1
data:
  info: |
    username:admin
    password:123456
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-28T03:55:46Z"
  name: firstconfigmap
  namespace: default
  resourceVersion: "2715136"
  selfLink: /api/v1/namespaces/default/configmaps/firstconfigmap
  uid: c927e3c5-a344-4557-882b-4df9f071862f
使用目录创建

configfile目录下创建game.file和ui.properties,内容如下:

[root@master configfile]# cat /root/k8sstudy/configMap/configfile/game.file
version=1.17
name=dave
age=18
[root@master configfile]# cat /root/k8sstudy/configMap/configfile/ui.properties 
level=2
color=yellow

$ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl

创建ConfigMap

[root@master configfile]# kubectl create configmap game-config --from-file=/root/k8sstudy/configMap/configfile

[root@master configfile]# kubectl get cm game-config -o yaml
apiVersion: v1
data:
  game.file: |
    version=1.17
    name=dave
    age=18
  ui.properties: |
    level=2
    color=yellow
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-28T01:10:55Z"
  name: game-config
  namespace: default
  resourceVersion: "2691042"
  selfLink: /api/v1/namespaces/default/configmaps/game-config
  uid: a2a59ae1-a829-4fe2-b445-5867ebe71074

–from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容

使用文件创建

只要指定为一个文件就可以从单个文件中创建 ConfigMap

[root@master configfile]# kubectl create configmap game-config-2 --from-file=game.file

[root@master configfile]# kubectl get cm game-config-2 -o yaml
apiVersion: v1
data:
  game.file: |
    version=1.17
    name=dave
    age=18
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-28T06:04:38Z"
  name: game-config-2
  namespace: default
  resourceVersion: "2733972"
  selfLink: /api/v1/namespaces/default/configmaps/game-config-2
  uid: ba0a4d4c-11f4-4731-a018-ff4a7a972308

–from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的

使用字面值创建

使用文字值创建,格式如下:

[root@master configfile]# kubectl create cm ll-config --from-literal=name=dave-l --from-literal=password=pass-l

[root@master configfile]# kubectl get cm ll-config -o yaml
apiVersion: v1
data:
  name: dave-l
  password: pass-l
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-28T06:18:45Z"
  name: ll-config
  namespace: default
  resourceVersion: "2736035"
  selfLink: /api/v1/namespaces/default/configmaps/ll-config
  uid: 36a00a9c-a6b5-4651-a332-61a73ab2c690

利用 --from-literal 参数传递配置信息,该参数可以使用多次.

Pod 中使用

使用 ConfigMap 来替代环境变量

创建 cm-env-pod.yaml,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-env-pod
spec:
  containers:
    - name: cm-env-nginx
      image: nginx:1.17.1
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: USERNAME
          valueFrom:
            configMapKeyRef:
              name: ll-config
              key: name
        - name: PASSWORD
          valueFrom:
            configMapKeyRef:
              name: ll-config
              key: password
      envFrom:
        - configMapRef:
            name: ll-config
  restartPolicy: Never

002.png

用 ConfigMap 设置命令行参数

创建 cm-command-pod.yaml,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-command-pod
spec:
  containers:
    - name: cm-command-nginx
      image: nginx:1.17.1
      command: [ "/bin/sh", "-c", "echo $(USERNAME) $(PASSWORD)" ]
      env:
        - name: USERNAME
          valueFrom:
            configMapKeyRef:
              name: ll-config
              key: name
        - name: PASSWORD
          valueFrom:
            configMapKeyRef:
              name: ll-config
              key: password
  restartPolicy: Never

003.png

通过数据卷使用ConfigMap

在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容

创建 cm-volume-pod.yaml,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-volume-pod
spec:
  containers:
    - name: cm-volume-pod-nginx
      image: nginx:1.17.1
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: game-config
  restartPolicy: Never
[root@master configMap]# kubectl exec -it cm-volume-pod /bin/sh
# cd /etc/config
# ls
game.file  ui.properties
# cat game.file
version=1.17
name=dave
age=18
# cat ui.properties
level=2
color=yellow

ConfigMap 的热更新

创建 hot-update-deploy.yaml 文件,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hot-update
spec:
  replicas: 1
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
        - name: my-nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: log-config
[root@master configMap]# kubectl exec `kubectl get pods -l run=my-nginx  -o=name|cut -d "/" -f2` cat /etc/config/log_level
INFO

修改 ConfigMap

[root@master configMap]# kubectl edit configmap log-config
configmap/log-config edited

修改 log_level 的值为 DEBUG 等待大概 10 秒钟时间,再次查看环境变量的值

[root@master configMap]# kubectl exec `kubectl get pods -l run=my-nginx  -o=name|cut -d "/" -f2` cat /etc/config/log_level
DEBUG

特别注意 :

configMap 如果以 ENV 的方式挂载至容器,修改 configMap 并不会实现热更新

ConfigMap 更新后滚动更新 Pod

更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新

[root@master configMap]# kubectl patch deployment hot-update --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20221128001" }}}}}'

.spec.template.metadata.annotations 中添加 version/config,每次通过修改 version/config 来触发滚动更新

更新 ConfigMap 后:

  • 使用该 ConfigMap 挂载的 Env 不会同步更新
  • 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

Secret

Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。

Secret 有三种类型:

  • Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
  • Opaque :base64 编码格式的 Secret,用来存储密码、密钥等
  • kubernetes.io/dockerconfigjson :用来存储私有 docker 仓库的认证信息

Service Account

Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中

[root@master configMap]# kubectl run my-nginx --image nginx:1.17.1
deployment.apps/my-nginx created
[root@master configMap]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-867d94c55f-mnc9w   1/1     Running   0          32s
[root@master configMap]# kubectl exec my-nginx-867d94c55f-mnc9w ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token

Opaque Secret

创建

Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:

[root@master secret]# echo -n "admin" | base64
YWRtaW4=
[root@master secret]# echo -n "1a2b3c4d5f6g" | base64
MWEyYjNjNGQ1ZjZn

my-secrets.yml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MWEyYjNjNGQ1ZjZn
  username: YWRtaW4=
[root@master secret]# kubectl create -f my-secrets.yml 
secret/mysecret created
[root@master secret]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-dzwqk   kubernetes.io/service-account-token   3      47d
mysecret              Opaque                                2      31s
tls-secret            kubernetes.io/tls                     2      17d
[root@master secret]# kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  12 bytes
username:  5 bytes
使用
Secret 挂载到 Volume 中
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: seret-pod
  name: seret-pod
spec:
  volumes:
    - name: volumes12
      secret:
        secretName: mysecret
  containers:
    - image: nginx:1.17.1
      name: secret-nginx
      volumeMounts:
        - name: volumes12
          mountPath: "/data"
[root@master secret]# kubectl exec -it seret-pod /bin/sh
# cd /data
# ls
password  username
# cat password
1a2b3c4d5f6g
# cat username
admin
Secret 导出到环境变量中

创建 secret-deploy.yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: secret-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: secret-deploy
  template:
    metadata:
      labels:
        app: secret-deploy
    spec:
      containers:
        - name: pod-1
          image: nginx:1.17.1
          ports:
            - containerPort: 80
          env:
            - name: TEST_USER
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: username
             - name: TEST_PASSWORD
               valueFrom:
                 secretKeyRef:
                   name: mysecret
                   key: password

004.png

kubernetes.io/dockerconfigjson

使用 Kuberctl 创建 docker 仓库认证的 secret

[root@master secret]# kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret/myregistrykey created
[root@master secret]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-dzwqk   kubernetes.io/service-account-token   3      47d
myregistrykey         kubernetes.io/dockerconfigjson        1      50s
mysecret              Opaque                                2      25m
tls-secret            kubernetes.io/tls                     2      17d
[root@master secret]# kubectl describe secret myregistrykey
Name:         myregistrykey
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/dockerconfigjson

Data
====
.dockerconfigjson:  161 bytes

在创建 Pod 的时候,通过 imagePullSecrets 来引用刚创建的 myregistrykey

apiVersion: v1
kind: Pod
metadata:
  name: pull-secret-pod
spec:
  containers:
    - image: nginx:1.17.1
      name: pull-secret-nginx
  imagePullSecrets:
      name: myregistrykey
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楚洛瞬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值