小言_互联网的博客

kubernetes配置资源管理

635人阅读  评论(0)

目录

一、Secret

1.Secret 类型 

2.创建 Secret

(1)用kubectl create secret命令创建Secret

(2)内容用 base64 编码,创建Secret

3.使用方式

二、ConfigMap

1.创建 ConfigMap

(1)使用文件创建 

(2)使用字面值创建 

2.Pod 中使用 ConfigMap 

(1)使用 ConfigMap 来替代环境变量

(2)Pod的创建

3.用 ConfigMap 设置命令行参数 

4.通过数据卷插件使用ConfigMap 

(1)ConfigMap 的热更新

(2)ConfigMap 更新后滚动更新 Pod


一、Secret

       Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。

1.Secret 类型 

1)kubernetes.io/service-account-token:由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;
2)Opaque :base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;
3)kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息。

Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:

1)作为挂载到一个或多个容器上的卷 中的文件。
2)作为容器的环境变量。
3)由 kubelet 在为 Pod 拉取镜像时使用。

应用场景:凭据
https://kubernetes.io/docs/concepts/configuration/secret/

2.创建 Secret

(1)用kubectl create secret命令创建Secret


  
  1. echo -n 'zhangsan' > username.txt
  2. echo -n 'abc1234' > password.txt
  3. kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt
  4. kubectl get secrets
  5. kubectl describe secret mysecret

get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑

(2)内容用 base64 编码,创建Secret


  
  1. echo -n zhangsan | base64
  2. echo -n abc1234 | base64
  3. vim secret.yaml
  4. apiVersion: v1
  5. kind: Secret
  6. metadata:
  7. name: mysecret1
  8. type: Opaque
  9. data:
  10. username:
  11. password:
  12. kubectl create -f secret.yaml
  13. kubectl get secrets
  14. kubectl get secret mysecret1 -o yaml

3.使用方式

1)将 Secret 挂载到 Volume 中,以 Volume 的形式挂载到 Pod 的某个目录下


  
  1. vim secret-test.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: mypod
  6. spec:
  7. containers:
  8. - name: nginx
  9. image: nginx
  10. volumeMounts:
  11. - name: secrets
  12. mountPath: "/etc/secrets"
  13. readOnly: true
  14. volumes:
  15. - name: secrets
  16. secret:
  17. secretName: mysecret
  18. kubectl create -f secret-test.yaml
  19. kubectl get pods
  20. kubectl exec -it seret-test bash
  21. # cd /etc/secrets/
  22. # ls
  23. # vi password.txt
  24. # vi username.txt

2)将 Secret 导出到环境变量中


  
  1. vim secret-test1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: mypod1
  6. spec:
  7. containers:
  8. - name: nginx
  9. image: nginx
  10. env:
  11. - name: TEST_USER
  12. valueFrom:
  13. secretKeyRef:
  14. name: mysecret1
  15. key: username
  16. - name: TEST_PASSWORD
  17. valueFrom:
  18. secretKeyRef:
  19. name: mysecret1
  20. key: password
  21. kubectl apply -f secret-test1.yaml
  22. kubectl get pods
  23. kubectl exec -it mypod bash
  24. # echo $TEST_USER
  25. # echo $TEST_PASSWORD

二、ConfigMap

与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。

1.创建 ConfigMap


  
  1. mkdir /opt/configmap/
  2. vim /opt/configmap/game.properties
  3. enemies=aliens
  4. lives=3
  5. enemies.cheat= true
  6. enemies.cheat.level=noGoodRotten
  7. secret.code.passphrase=UUDDLRLRBABAS
  8. secret.code.allowed= true
  9. secret.code.lives=30
  10. vim /opt/configmap/ui.properties
  11. color.good=purple
  12. color.bad=yellow
  13. allow.textmode= true
  14. how.nice.to.look=fairlyNice
  15. ls /opt/configmap/
  16. game.properties
  17. ui.properties
  18. kubectl create configmap game-config --from-file=/opt/configmap/
  19. --from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
  20. kubectl get cm
  21. kubectl get cm game-config -o yaml

(1)使用文件创建 

只要指定为一个文件就可以从单个文件中创建 ConfigMap
--from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的


  
  1. kubectl create configmap game-config- 2 -- from-file= /opt/configmap/game. properties -- from-file= /opt/configmap/ui. properties
  2. kubectl get configmaps game-config- 2 -o yaml
  3. kubectl describe cm game-config- 2

(2)使用字面值创建 


  
  1. 使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下
  2. kubectl create configmap special- config --from-literal=special.how=very --from-literal=special.type=good

  
  1. kubectl get configmaps special -config -o yaml
  2. kubectl delete cm --all
  3. kubectl delete pod --all

2.Pod 中使用 ConfigMap 

(1)使用 ConfigMap 来替代环境变量


  
  1. vim env.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: special-config
  6. namespace: default
  7. data:
  8. special.how: very
  9. special.type: good
  10. ---
  11. apiVersion: v1
  12. kind: ConfigMap
  13. metadata:
  14. name: env-config
  15. namespace: default
  16. data:
  17. log_level: INFO
  18. kubectl create -f env.yaml
  19. kubectl get cm

(2)Pod的创建


  
  1. vim test-pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: test-pod
  6. spec:
  7. containers:
  8. - name: busybox
  9. image: busybox: 1.28. 4
  10. command: [ "/bin/sh", "-c", "env" ]
  11. env:
  12. - name: SPECIAL_HOW_KEY
  13. valueFrom:
  14. configMapKeyRef:
  15. name: special-config
  16. key: special.how
  17. - name: SPECIAL_TYPE_KEY
  18. valueFrom:
  19. configMapKeyRef:
  20. name: special-config
  21. key: special.type
  22. envFrom:
  23. - configMapRef:
  24. name: env-config
  25. restartPolicy: Never
  26. kubectl create -f test-pod.yaml
  27. kubectl get pods

  
  1. kubectl logs pod-test
  2. KUBERNETES_SERVICE_PORT= 443
  3. KUBERNETES_PORT= tcp: //
  4. HOSTNAME=pod-test
  5. SHLVL= 1
  6. SPECIAL_HOW_KEY=very 赋值变量 SPECIAL_HOW_KEY 的值为 special-config 的 special. how: very
  7. HOME=/root
  8. SPECIAL_TYPE_KEY=good 赋值变量 SPECIAL_TYPE_KEY 的值为 special-config 的 special. type: good
  9. KUBERNETES_PORT_443_TCP_ADDR= 10.0 .0 .1
  10. PATH= /usr/local/ sbin: /usr/local/ bin: /usr/ sbin: /usr/ bin: /sbin:/bin
  11. KUBERNETES_PORT_443_TCP_PORT= 443
  12. KUBERNETES_PORT_443_TCP_PROTO=tcp
  13. log_level= INFO 引入 env-config 的变量 log_level: INFO
  14. KUBERNETES_PORT_443_TCP= tcp: //
  15. KUBERNETES_SERVICE_PORT_HTTPS= 443
  16. KUBERNETES_SERVICE_HOST=
  17. PWD=/

3.用 ConfigMap 设置命令行参数 


  
  1. vim test-pod2.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: test-pod2
  6. spec:
  7. containers:
  8. - name: busybox
  9. image: busybox: 1.28. 4
  10. command:
  11. - /bin/sh
  12. - -c
  13. - echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
  14. env:
  15. - name: SPECIAL_HOW_KEY
  16. valueFrom:
  17. configMapKeyRef:
  18. name: special-config
  19. key: special.how
  20. - name: SPECIAL_TYPE_KEY
  21. valueFrom:
  22. configMapKeyRef:
  23. name: special-config
  24. key: special.type
  25. envFrom:
  26. - configMapRef:
  27. name: env-config
  28. restartPolicy: Never
  29. kubectl create -f test-pod2.yaml
  30. kubectl get pods
  31. kubectl logs test-pod2

4.通过数据卷插件使用ConfigMap 

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


  
  1. vim test-pod3.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: test-pod3
  6. spec:
  7. containers:
  8. - name: busybox
  9. image: busybox:1.28.4
  10. command: [ "/bin/sh", "-c", "sleep 36000" ]
  11. volumeMounts:
  12. - name: config-volume
  13. mountPath: /etc/config
  14. volumes:
  15. - name: config-volume
  16. configMap:
  17. name: special-config
  18. restartPolicy: Never
  19. kubectl create -f test-pod3.yaml
  20. kubectl get pods
  21. kubectl exec -it test-pod3 sh
  22. # cd /etc/config/
  23. # ls
  24. # vi special.how
  25. # vi special.type

(1)ConfigMap 的热更新


  
  1. vim test-pod4.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: log- config
  6. namespace: default
  7. data:
  8. log_level: INFO
  9. ---
  10. apiVersion: extensions/v1beta1
  11. kind: Deployment
  12. metadata:
  13. name: my-nginx
  14. spec:
  15. replicas: 1
  16. template:
  17. metadata:
  18. labels:
  19. run: my-nginx
  20. spec:
  21. containers:
  22. - name: my-nginx
  23. image: nginx
  24. ports:
  25. - containerPort: 80
  26. volumeMounts:
  27. - name: config-volume
  28. mountPath: /etc/ config
  29. volumes:
  30. - name: config-volume
  31. configMap:
  32. name: log- config
  33. kubectl apply -f test-pod5.yaml
  34. kubectl get pods
  35. kubectl exec -it my-nginx -76b6489f44 -6dwxh -- cat /etc/config/log_level
  36. INFO
  37. kubectl edit configmap log- config

等大概10秒左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新 

kubectl exec -it my-nginx-76b6489f44-6dwxh -- cat /etc/config/log_level

(2)ConfigMap 更新后滚动更新 Pod

更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新


  
  1. kubectl patch deployment my -nginx --patch '{ "spec": { "template": { "metadata": { "annotations": { "version/config": "20210525" }}}}}'
  2. kubectl get pods

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


转载:https://blog.csdn.net/Drw_Dcm/article/details/127791654
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场