Kubernetes 配置管理

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 使用【两种方式】

  • 以 Volume 形式
  • 以环境变量形式

(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. 命令行方式创建

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.envspec.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