一、ConfigMap

什么是configmap

  • kubernetes集群可以使用ConfigMap来实现对容器中应用的配置管理
  • 可以把ConfigMap看作是一个挂载到pod中的存储卷

创建ConfigMap的4种方式

创建ConfigMap的方式有4种:

1, 通过直接在命令行中指定configmap参数创建

即(--from-literal=key=value)

kubectl create configmap cm1 --from-literal=host=127.0.0.1 --from-literal=port=3306 kubectl get cm

kubectl describe cm cm1

2, 通过指定文件创建,

即将一个配置文件创建为一个ConfigMap,--from-file=文件路径 echo -n 127.0.0.1 > host echo -n 3306 > port kubectl create configmap cm2 --from-file=./host --from-file=./port kubectl get cm

kubectl describe cm cm2

3, 通过一个文件内多个键值对

( --from-env-file=文件路径 )

vim env.txt

host=127.0.0.1
port=3306

kubectl create configmap cm3 --from-env-file=env.txt kubectl get cm

kubectl describe cm cm3

4, 通过YMAL文件创建

vim cm4.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm4
data:
  host: 127.0.0.1
  port: "3306"

kubectl apply -f cm4.yml kubectl get cm kubectl describe cm cm4

ConfigMap的2种使用方式

使用ConfigMap有2种方式:

1.通过环境变量的方式传递给pod

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名称
 kubectl apply -f pod-cm1.yml
 kubectl get pods
 kubectl exec pod-cm1 -- env

2.通过volume的方式挂载到pod内

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的名称

kubectl apply -f pod-cm2.yml kubectl get pod

kubectl exec pod-cm2 -- ls /etc/mysql

kubectl exec pod-cm2 -- cat /etc/mysql/host

kubectl exec pod-cm2 -- cat /etc/mysql/port

subpath参数拓展讨论

1, 准备一个配置文件

cat index.html

haha
2, 创建configmap

kubectl create configmap nginx-index --from-file=index.html

3, 创建测试pod

vim subpath-cm.yaml

apiVersion: v1
kind: Pod
metadata:
  name: subpath-cm
spec:
  containers:
  - name: c1
    image: nginx:1.15-alpine
    volumeMounts:
    - name: nginx-config
      mountPath: /usr/share/nginx/html/index.html		# configmap要挂载并覆盖的绝对路径
      subPath: index.html							    # 这里要写相对路径

  volumes:
  - name: nginx-config
    configMap:
      name: nginx-index									# 对应上面创建的configmap

kubectl apply -f subpath-cm.yaml

4, 进去测试
kubectl exec -it subpath-cm -- /bin/sh
/ # cat /usr/share/nginx/html/index.html
haha											# 可以看到主面文件被覆盖了
/ # exit

补充说明: 也可以用nginx.conf做成configmap覆盖/etc/nginx/nginx.conf,但必须是nginx.conf配置文件要能启动容器,否则启不了容器造成测试问题。

ConfigMap的热更新

提问:如果我在宿主机上修改了value, 那么容器内部会不会更新?

  • 通过环境变量的方式传递给pod。这种方式不会热更新
  • 通过volume的方式挂载到pod内。这种方式会热更新,大概需要半分钟左右。
  • 但是使用subpath挂载文件,也不能热更新

验证第1种方式

1, 编辑修改对应的configmap

kubectl edit cm cm1

apiVersion: v1
data:
  host: 127.0.0.1
  port: "3307"								3306修改成3307
kind: ConfigMap
metadata:
  creationTimestamp: "2020-11-07T12:07:04Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:host: {}
        f:port: {}
    manager: kubectl
    operation: Update
    time: "2020-11-07T12:07:04Z"
  name: cm1
  namespace: default
  resourceVersion: "169386"
  selfLink: /api/v1/namespaces/default/configmaps/cm1
  uid: f06cd44d-2ef9-48f2-9ccc-995f9d9ea2ad

2, 验证对应的pod里的变化,发现很久都不会改变

(环境变量方式)

kubectl exec pod-cm1 -- env |grep port

验证第2种方式

1, 编辑修改对应的configmap

kubectl edit cm cm2

apiVersion: v1
data:
  host: 127.0.0.1
  port: "3308"							 		 修改成3308
kind: ConfigMap
metadata:
  creationTimestamp: "2020-11-07T12:09:15Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:host: {}
        f:port: {}
    manager: kubectl
    operation: Update
    time: "2020-11-07T12:09:15Z"
  name: cm2
  namespace: default
  resourceVersion: "169707"
  selfLink: /api/v1/namespaces/default/configmaps/cm2
2, 验证对应的pod里的变化,一段时间后会改变

(卷挂载方式)

kubectl exec pod-cm2 -- cat /etc/mysql/port

二、Secret

什么是secret

Secret与ConfigMap类似,主要的区别是Secret存储的是密文,而ConfigMap存储的是明文。 所以ConfigMap可以用配置文件管理,而Secret可用于密码,密钥,token等敏感数据的配置管理。 kubectl create secret -h

Secret有4种类型:

  • Opaque: base64编码格式的Secret,用来存储密码、密钥、信息、证书等,类型标识符为generic
  • Service Account: 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中
  • kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息,类型标识为docker-registry。
  • kubernetes.io/tls: 用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。

创建mysql管理员密码Secret

我们使用Opaque类型来创建mysql密码Secret

1, 将明文密码进行base64编码

Opaque类型密码需要进行base64编码 echo -n 123 |base64

2, 编写创建secret的YAML文件

vim secret-mysql.yml

apiVersion: v1
kind: Secret
metadata:
 name: secret-mysql
data:
 password: MTIz

3, 创建secret并确认

kubectl apply -f secret-mysql.yml kubectl get secret |grep secret-mysql

Secret的2种使用方式

使用ConfigMap有2种方式:

1.通过环境变量的方式传递给pod**

1, 编写pod的YAML文件使用Secret

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:
            name: secret-mysql				# 对应创建的secret名字
            key: password
2, 创建pod

kubectl apply -f pod-mysql-secret.yml

3, 验证pod

kubectl get pods

4, 验证传入pod的变量效果

kubectl exec -it pod-mysql-secret1 -- /bin/bash root@pod-mysql-secret1:/# env |grep MYSQL_ROOT_PASSWORD

root@pod-mysql-secret1:/# mysql -p123

2.通过volume的方式挂载到pod内

1, 编写pod的YAML文件使用Secret

[root@master1 ~]# 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"    # 挂载目录(支持热更新),也可以使用subPath挂载文件(但不支持热更新)
      readOnly: true                    # 只读
  volumes:
  - name: vol-secret                    # 定义卷名
    secret:                             # 使用secret
      secretName: secret-mysql              # 对应创建好的secret名
2, 创建pod

kubectl apply -f pod-mysql-secret2.yml

3, 验证pod

kubectl get pods

4, 验证

kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password

5, 热更新测试

echo -n haha123 |base64

kubectl edit secret secret-mysql

apiVersion: v1
data:
  password: aGFoYTEyMw==					    密码改成haha123的base64编码
kind: Secret
metadata:
...

kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password