Kubernetes 配置管理
1.1.1 Secret
Secret 的主要作用就是加密数据
1、Secret 应用场景
对 用户名 和 密码 进行加密
2、Secret 三种类型
- Opaque:使用 base64 编码存储信息,可以通过 base64 –decode 解码获得原始数据,因此安全性弱
- kubernetes.io/dockerconfigjson:用于存储 docker registry 的认证信息
- kubernetes.io/service-account-token:用于被 serviceaccount 引用
serviceaccout 创建时 Kubernetes 会默认创建对应的 secret
Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
3、Secret 创建
(1)命令行方式创建 Secret
1 2 3 4 5 6 7 8 9 10 11
| echo -n "admin" > ./username.txt echo -n "123456" > ./password.txt
# 使用 kubectl create secret 命令创建 secret kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt # secret/db-user-pass created
# 查看 secret kubectl get secrets # NAME TYPE DATA AGE # db-user-pass Opaque 2 59s
|
(2)yaml 文件方式创建 Secret
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| echo -n 'admin' | base64 # YWRtaW4= echo -n '123456' | base64 # MWYxZjFmMWYxZg==
# 创建 secret:创建 yaml 文件 cat > secret.yaml << EOF apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYxZjFmMWYxZg== EOF
# 创建 secret:使用 yaml 文件创建 secret kubectl create -f secret.yaml # secret/mysecret created
# 查看 secret kubectl get secrets | grep mysecret # mysecret Opaque 2 32s
# 查看 secret 详细信息 kubectl describe secrets mysecret # 查看 secret yaml 文件 kubectl get secrets mysecret -o yaml
|
4、Secret 使用【两种方式】
(1)将 Secret 挂载到 Volume 中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| cat > mypod1.yaml << EOF apiVersion: v1 kind: Pod metadata: name: mypod1 spec: containers: - name: mypod1 image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret EOF
kubectl create -f mypod1.yaml # pod/mypod1 created kubectl get pods | grep mypod # mypod1 1/1 Running 0 48s kubectl exec -it mypod1 /bin/bash
# root@mypod1:/data# cd /etc/foo/ root@mypod1:/etc/foo# ls password username root@mypod1:/etc/foo# cat password 123456 root@mypod1:/etc/foo# cat username admin root@mypod1:/etc/foo#
|
(2)将 Secret 设置为环境变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| cat > mypod2.yaml << EOF apiVersion: v1 kind: Pod metadata: name: mypod2 spec: containers: - name: mypod2 image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password restartPolicy: Never EOF kubectl create -f mypod2.yaml # pod/mypod2 created kubectl get pods | grep mypod # mypod1 1/1 Running 0 4m39s # mypod2 0/1 ContainerCreating 0 6s # 等 mypod2 running 之后在进入容器 kubectl exec -it mypod2 /bin/bash
# root@mypod2:/data# env | grep -E "USERNAME|PASSWORD" SECRET_USERNAME=admin SECRET_PASSWORD=123456
|
1.2.1 ConfigMap
ConfigMap 作用是存储不加密的数据到 etcd 中
1、应用场景
配置文件
2、创建
1.yaml 文件方式创建
1 2 3 4 5 6 7 8 9 10 11
| cat > configmap-test01.yaml << EOF apiVersion: v1 kind: ConfigMap metadata: name: cm-test01 data: appconf01: value01 appconf02: value02 EOF
kubectl create -f configmap-test01.yaml
|
2.命令行方式创建
读取文件方式(也可以是目录)通过–from-file参数从文件中读取。可以指定 key 的名称,若不指定,则默认使用文件名为 key
1 2 3 4 5 6 7
| cat > test.properties << EOF key01:value01 key02:value02 conf01: value03 EOF
kubectl create cm cm-test-file --from-file=test.properties
|
3、查询
1 2 3 4 5 6 7 8 9 10
| # 查看 configmap 列表 kubectl get configmap # 查看 configmap 详情 kubectl describe configmap cm-test01 kubectl describe configmap cm-test-file kubectl describe cm cm-test-literal # 查看 yaml 输出 kubectl get cm cm-test01 -o yaml kubectl get configmap cm-test-file -o yaml kubectl get cm cm-test-literal -o yaml
|
4、更新
1 2 3 4 5 6
| # 方式一:edit kubectl edit cm cm-test01 # 查看更新是否生效 kubectl describe cm cm-test01 # 方式二:apply kubectl apply -f configmap-test01.yaml
|
5、删除
1 2 3 4
| # 方式一:通过 yaml 文件删除 kubectl delete -f configmap-test01.yaml # 方式二:直接删除资源 kubectl delete cm cm-test-file
|
6、使用 【yaml 文件有误,以下四种方式无误】
容器应用对 ConfigMap 的使用主要是两种:
- 通过环境变量获取 ConfigMap 的内容:
spec.env和spec.envFrom
- 通过卷 volume 挂载的方式将 ConfigMap 的内容挂载到容器内部的文件或目录:
spec.volumes
(1)spec.env 【环境变量】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| vim pod-test01.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test001 spec: containers: - name: cm-test image: tomcat:8 command: [ "/bin/sh", "-c", "env | grep APP"] env: - name: APPCONF01 # 定义环境变量的名称 valueFrom: # key “appconf01”的值获取 configMapKeyRef: name: cm-test01 # 环境变量的值来自于 configmap cm-test01 key: appconf01 # configmap 中的配置 key 为 appconf01 - name: APPCONF02 # 定义环境变量的名称 valueFrom: # key “appconf02”的值获取 configMapKeyRef: name: cm-test01 # 环境变量的值来自于 configmap cm-test01 key: appconf02 # configmap 中的配置 key 为 appconf02 restartPolicy: Never # 重启策略:从不。
kubectl create -f pod-test01.yaml kubectl get pods | grep cm kubectl logs cm-pod-test001
|
2)spec.envFrom 【环境变量】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| vim pod-test02.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test002 spec: containers: - name: cm-test2 image: tomcat:8 command: [ "/bin/sh", "-c", "env"] envFrom: - configMapRef: name: cm-test01 # 根据 ConfigMap cm-test01 资源自动生成环境变量 restartPolicy: Never
kubectl create -f pod-test02.yaml kubectl get po
|
(3)指定 items【卷挂载方式】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| vim pod-test03.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test003 spec: containers: - name: cm-test3 image: tomcat:8 volumeMounts: - name: vm-01-1 mountPath: /conf volumes: - name: vm-01-1 configMap: name: cm-test-file items: - key: key-testproperties path: test.properties restartPolicy: Never
kubectl create -f pod-test03.yaml kubectl get po
|
(4)不指定 items【卷挂载方式】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| vim pod-test04.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test004 spec: containers: - name: cm-test4 image: tomcat:8 volumeMounts: - name: vm-02-2 mountPath: /conf volumes: - name: vm-02-2 configMap: name: cm-test-file restartPolicy: Never
kubectl create -f pod-test04.yaml kubectl get po
# 进入容器查看 kubectl exec -it cm-pod-test004 -c cm-test4 -- bash root@cm-pod-test004:/usr/local/tomcat# ls /conf
|