目录
[2.1 创建ConfigMap(4种方式)](#2.1 创建ConfigMap(4种方式))
[2.1.1 指定ConfigMap的参数创建](#2.1.1 指定ConfigMap的参数创建)
[2.1.2 指定配置文件创建ConfigMap](#2.1.2 指定配置文件创建ConfigMap)
[2.1.3 通过一个文件内的多个键值对创建ConfigMap](#2.1.3 通过一个文件内的多个键值对创建ConfigMap)
[2.1.4 yaml文件创建ConfigMap](#2.1.4 yaml文件创建ConfigMap)
[2.2 使用ConfigMap(2种方式)](#2.2 使用ConfigMap(2种方式))
[2.2.1 环境变量evn](#2.2.1 环境变量evn)
[2.2.2 数据卷volume](#2.2.2 数据卷volume)
[2.3 ConfigMap的动态更新(数据卷volume方式才支持动态更新)](#2.3 ConfigMap的动态更新(数据卷volume方式才支持动态更新))
[3.1 创建Secret](#3.1 创建Secret)
[3.1.1 账号密码文件创建](#3.1.1 账号密码文件创建)
[3.1.2 yaml文件创建](#3.1.2 yaml文件创建)
[3.2 使用Secret](#3.2 使用Secret)
[3.2.1 环境变量env使用](#3.2.1 环境变量env使用)
[3.2.2 数据卷volume使用](#3.2.2 数据卷volume使用)
前言
当镜像制作完成后被用来创建Pod时,如果需要修改镜像中的一些参数值则比较麻烦------需要重新制作镜像。能否让镜像根据实际的需要,自动读取响应的配置信息呢?这时就需要使用Kubernetes的配置管理。
一、为什么需要配置管理
在实际的应用开发过程中会遇到这样的情况:在开发Web应用时,在开发环境需要链接M有SQL数据库;而在生产环境中需要链接Redis数据库,这两套相互独立的环境。就需要为应用指定不同的参数来满足实际的要求。如果不能很好的管理这些配置信息,则运维工作将变得无比烦恼。
为了解决这样的问题,Kubernetes提供了自己的解决方案,它将配置信息作为一种独立的资源存入配置中心,并将其以注入的方式提供给Pod使用。如果更新了配置中心的配置信息,则Pod会自动加载更新后的配置信息。Kubernetes主要通过ConfigMap和Secret两种方式来实现配置信息的管理。
二、使用ConfigMap管理Pod的配置信息
ConfigMap是用来存储配置信息的Kubernetes资源对象。ConfigMap采用明文的方式将所有的配置信息都存储在ETCD中。在ConfigMap创建成功后,就可以在Pod中使用ConfigMap了。
2.1 创建ConfigMap(4种方式)
2.1.1 指定ConfigMap的参数创建
创建
kubectl create cm demo-configmap1 \
> --from-literal=db.host=localhost \
> --from-literal=db.port=3306 \
> --from-literal=user=admin \
> --from-literal=password=123456configmap/demo-configmap1 created
查看
[root@master activemq-cluster]# kubectl get cm
NAME DATA AGE
demo-configmap1 4 115s
[root@master activemq-cluster]# kubectl describe cm demo-configmap1Name: demo-configmap1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
db.host:
localhost
db.port:
3306
password:
123456
user:
admin
BinaryData
====
Events: <none>
2.1.2 指定配置文件创建ConfigMap
[root@master ~]# tree configmap-demo/
configmap-demo/
├── mysql.properties
└── redis.properties
[root@master ~]# cat configmap-demo/redis.properties
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master ~]# cat configmap-demo/mysql.properties
mysql.host=127.0.0.1
mysql.port=3306
mysql.password=123456
创建configmap
[root@master ~]# kubectl create cm demo-configmap2 --from-file=./configmap-demo /
configmap/demo-configmap2 created
查看
[root@master ~]# kubectl describe cm demo-configmap2
Name: demo-configmap2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
mysql.properties:
mysql.host=127.0.0.1
mysql.port=3306
mysql.password=123456
redis.properties:
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
BinaryData
====
Events: <none>
2.1.3 通过一个文件内的多个键值对创建ConfigMap
[root@master configmap-demo3]# cat << EOF > env-config.txt
> db.host=localhost
> db.port=3306
> user=admin
> password=123456
> EOF
[root@master configmap-demo3]# kubectl create cm demo-configmap3 --from-env-file=env-config.txt
configmap/demo-configmap3 created
[root@master configmap-demo3]# kubectl describe cm demo-configmap3
Name: demo-configmap3
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
user:
admin
db.host:
localhost
db.port:
3306
password:
123456
BinaryData
====
Events: <none>
2.1.4 yaml文件创建ConfigMap
这里展示了2种写法
[root@master configmap-demo4]# cat config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: demo-configmap4
data:
db.host: localhost
db.port: "3306"
user: |
admin
password: |
"123456"
[root@master configmap-demo4]# kubectl apply -f config.yaml
configmap/demo-configmap4 created
查看
[root@master configmap-demo4]# kubectl describe cm demo-configmap4
Name: demo-configmap4
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
db.host:
localhost
db.port:
3306
password:
"123456"
user:
admin
BinaryData
====
Events: <none>
2.2 使用ConfigMap(2种方式)
2.2.1 环境变量evn
[root@master configmap]# cat configmap-usage01.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-usage01
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "echo $(HOST) $(PORT)" ]
env:
- name: HOST
valueFrom:
configMapKeyRef:
name: demo-configmap4 # configmap的name
key: db.host # configmap中的key值
- name: PORT
valueFrom:
configMapKeyRef:
name: demo-configmap4
key: db.portrestartPolicy: Never
[root@master configmap]# kubectl apply -f configmap-usage01.yaml
pod/configmap-usage01 created
查看日志 (host 和ip均读入容器内)
[root@master configmap]# kubectl logs -f configmap-usage01
localhost 3306
2.2.2 数据卷volume
[root@master configmap]# cat configmap-usage02.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-usage02
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "cat /etc/config/redis.properties && sleep 200000" ]
volumeMounts:
- name: config-volume
mountPath:/etc/config#不写subPath 挂在的时候会把/etc/config文件清空,下边配置会只挂在redis.properties文件到该目录下
#mountPath: /etc/config/redis.properties
#subPath: redis.propertiesvolumes:
- name: config-volume
configMap:
name: demo-configmap2# items配置要挂在到卷的文件,不配置表示全部挂在
#items:
# - key: redis.properties # configMap对应的key
# path: redis.properties # 重新映射的文件名
restartPolicy: Never
Kubernetes中安装部署ActiveMQ集群(手把手式记录)-CSDN博客 可参照第三点的案例配置
2.3 ConfigMap的动态更新(数据卷volume方式才支持动态更新)
案例演示
bash
[root@master share]# vim configmap-usage.yaml
i
apiVersion: v1
kind: Pod
metadata:
name: configmap-usage
spec:
containers:
- name: busybox
image: busybox
command: ['sh', '-c', 'watch -n 2 "cat /etc/config/redis.properties"']
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: demo-configmap2
restartPolicy: Never
查看日志输出,标识成功使用configMap
bash
[root@master share]# kubectl get cm demo-configmap -o yaml > demo-configmap.yaml # 这里每次修改都要重新执行,基于版本修改
[root@master share]# vi demo-configmap.yaml
apiVersion: v1
data:
mysql.properties: |
mysql.host=127.0.0.1
mysql.port=3306
mysql.password=123456
redis.properties: |
redis.host=localhost # 这里修改了
redis.port=6379
redis.password=123456
kind: ConfigMap
metadata:
creationTimestamp: "2023-04-18T01:55:07Z"
name: demo-configmap
namespace: default
resourceVersion: "2544156"
uid: adfd480b-d926-4c77-bba2-73b291c6e0b3
~
#执行命令修改
[root@master share]# kubectl apply -f demo-configmap.yaml
# 查看修改成功
[root@master share]# kubectl describe cm demo-configmap
查看pod打印日志
bash
[root@master share]# kubectl logs configmap-usage
# 前面文件设置每2秒钟查看一次,这里过几秒中后会查看到配置信息已经被修改,这也实现了动态配置功能
Every 2.0s: cat /etc/config/redis.properties 2023-04-18 04:02:27
redis.host=127.0.0.11
redis.port=6379
redis.password=123456
三、使用Secret管理Pod的配置信息
Secret也是Kubernetes配置管理管理的一种方式,它采用Base64编码机制保存配置信息。与ConfigMap不同的是,Secret中包含敏感的信息,例如用户的登录密码、Token等。这些敏感信息使用Secret来保存,可以更好的控制他们的用途,并降低意外暴露的风险。在成功创建Secret后,可以通过环境变量或数据卷的方式在Pod中使用它。
3.1 创建Secret
3.1.1 账号密码文件创建
[root@master secret]# echo dolphinchen > username.txt
[root@master secret]# echo password123 > password.txt
[root@master secret]# ls
password.txt username.txt
[root@master secret]# kubectl create secret generic demo-secret1 --from-file=username.txt --from-file=password.txt
secret/demo-secret1 created
[root@master secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-bdv4x kubernetes.io/service-account-token 3 19d
demo-secret1 Opaque 2 6s
[root@master secret]# kubectl describe secret demo-secret1
Name: demo-secret1
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 12 bytes
username.txt: 12 bytes
3.1.2 yaml文件创建
由于Secret是采用Base64编码机制来保存配置信息的,因此在创建yaml文件前,需要先得到配置信息的Base 64编码。
- 得到账号"admin"和密码"hello123"的Base64编码。
[root@master secret]# echo 'admin' | base64
YWRtaW4K
[root@master secret]# echo 'hello123' | base64
aGVsbG8xMjMK
- 创建demo-secret2.yaml文件
[root@master secret]# cat demo-secret2.yaml
apiVersion: v1
kind: Secret
metadata:
name: demo-secret2
type: Opaque
data:
username: YWRtaW4K
password: aGVsbG8xMjMK
- 执行命令创建Secret
[root@master secret]# kubectl apply -f demo-secret2.yaml
secret/demo-secret2 created
[root@master secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-bdv4x kubernetes.io/service-account-token 3 19d
demo-secret1 Opaque 2 7m56s
demo-secret2 Opaque
3.2 使用Secret
3.2.1 环境变量env使用
- secret-usage01.yaml创建
[root@master secret]# cat secret-usage01.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-usage01
spec:
containers:
- name: secret-usage01
image: nginx
imagePullPolicy: IfNotPresent
env:
name: USERNAME
valueFrom:
secretKeyRef:
name: demo-secret2
key: usernamename: PASSWORD
valueFrom:
secretKeyRef:
name: demo-secret2
key: password
restartPolicy: Never
- 创建Pod
[root@master secret]# kubectl apply -f secret-usage01.yaml
pod/secret-usage01 created
- 进入容器查看变量信息
[root@master secret]# kubectl exec -it secret-usage01 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@secret-usage01:/# echo $USERNAME
adminroot@secret-usage01:/# echo $PASSWORD
hello123
3.2.2 数据卷volume使用
- 创建secret-usage02.yaml
[root@master secret]# cat secret-usage02.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-usage02
spec:
containers:
- name: secret-usage02
image: redis
imagePullPolicy: IfNotPresent
**volumeMounts:
- name: foo
mountPath: /etc/foo
readOnly: true
volumes:- name: foo
secret:
secretName: demo-secret2**
- 执行命令创建pod
[root@master secret]# kubectl apply -f secret-usage02.yaml
pod/secret-usage02 created
- kubectl exec 命令进入容器查看
[root@master secret]# kubectl exec -it secret-usage02 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@secret-usage02:/data# cd /etc/foo/
root@secret-usage02:/etc/foo# ls
password username
root@secret-usage02:/etc/foo# cat username
adminroot@secret-usage02:/etc/foo# cat password
hello123
四、secret类型之私有镜像仓库使用
创建Docker harbor的secret信息:
因为,k8s拉取镜像与Docker拉取镜像是不同方式,所以k8s需要创建一个属于自己的拉取镜像的方式。
k8s拉取公开项目可以直接拉取,拉取私有项目需要配置secret密码
docker-registry: 创建一个给Docker registry容器镜像仓库使用的secret
generic: 从本地file,directory或者literal value创建一个secret(这是大多数情况使用的),也就是资源清单中的type:Opaque是一个意思
tls: 创建一个TLS secret
4.1 响应式创建secret资源
[K8S@k8s-master ~]$ kubectl create secret docker-registry dolphin-harbor --docker-username=admin --docker-password=Harbor12345 --docker-email=123@admin.com --docker-server=core.harbor.eastcom.com:30710
secret/dolphin-harbor created
[K8S@k8s-master ~]$ kubectl get secret
NAME TYPE DATA AGE
default-token-l2nz8 kubernetes.io/service-account-token 3 422d
dolphin-harbor kubernetes.io/dockerconfigjson 1 13s
4.2 拉取harbor私有仓库测试
4.2.1 私有仓库镜像
4.2.2 创建pod测试文件(不配置secret docker-registry)
镜像拉取失败
[K8S@k8s-master ~]$ cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-02
spec:
containers:
- name: c1
image: core.harbor.eastcom.com:30710/nginx:latest
[K8S@k8s-master ~]$ kubectl apply -f pod.yaml
pod/pod-secret-02 created
[K8S@k8s-master ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-0 1/1 Running 0 10d
nfs-client-provisioner-76b5dc7886-scf79 1/1 Running 7 (10d ago) 36d
nfs-devops-provisioner-866787c4d7-k52rq 1/1 Running 7 (10d ago) 35d
pod-secret-02 0/1 ErrImagePull 0 4s
ubuntu 1/1 Running 0 27h
4.2.3 imagePullSecret 指定secret docker-registry拉取镜像
[K8S@k8s-master ~]$ cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-02
spec:
**imagePullSecrets:
- name: dolphin-harbor**
containers:
- name: c1
image: core.harbor.eastcom.com:30710/dolphintest/nginx:latest
镜像拉取成功