一、Configmap配置管理
-
Configmap用于保存配置数据,以键值对形式存储
-
configMap资源提供了向pod注入配置数据的方法
-
旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性
-
典型的使用场景:
填充环境变量的值
设置容器内的命令行参数
填充卷的配置文件 -
创建ConfigMap的方式有4种:
-使用字面值创建
使用文件创建
使用目录创建
编写configmap的yaml文件创建
1创建cm的四种方式
1.1使用字面值创建
[root@node1 configmap]# kubectl create configmap mycm1 --from-literal=key1=111 --from-literal=key2=222
[root@node1 configmap]# kubectl get cm
NAME DATA AGE
mycm1 2 8s
[root@node1 configmap]# kubectl describe cm mycm1
1.2使用文件创建
[root@node1 configmap]# kubectl create configmap mycm2 --from-file=/etc/resolv.conf
configmap/mycm2 created
[root@node1 configmap]# kubectl get cm
NAME DATA AGE
mycm1 2 3m35s
mycm2 1 5s
文件名是key值,内容是vaule
1.3使用目录创建
[root@node1 configmap]# ls
network resolv.conf
[root@node1 configmap]# kubectl create configmap mycm3 --from-file=/root/manifest/configmap/
configmap/mycm3 created
[root@node1 configmap]# kubectl get cm
NAME DATA AGE
mycm1 2 14m
mycm2 1 10m
mycm3 2 5s
1.4使用yml文件创建
[root@node1 cm]# cat cm1.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: mycm4
data:
db_host: "172.25.0.250"
db_port: "3306"
[root@node1 cm]# kubectl apply -f cm1.yml
configmap/mycm4 created
[root@node1 cm]# kubectl get cm
NAME DATA AGE
mycm1 2 11h
mycm2 1 11h
mycm3 2 11h
mycm4 2 4s
2 如何使用configmap
- 通过环境变量的方式直接传递给pod
- 通过在pod的命令行下运行的方式
- 作为volume的方式挂载到pod内
2.1通过环境变量的方式直接给pod
自主命名key值
[root@node1 cm]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busyboxplus
command: ["/bin/sh", "-c", "env"]
env:
- name: key-one ##在这里起个key值的名字
valueFrom: #环境变量值从哪里来
configMapKeyRef: #从configmap来
name: mycm4 #从configmap的mycm4文件里来
key: db_host #将configmap的mycm4文件里key为db_host的值赋给key-one
- name: key-two
valueFrom:
configMapKeyRef:
name: mycm4
key: db_port
restartPolicy: Never
[root@node1 cm]# kubectl apply -f pod1.yml
pod/pod1 created
[root@node1 cm]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 4s
[root@node1 cm]# kubectl logs pod1
使用原来的key值:
[root@node1 cm]# cat pod2.yml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: busyboxplus
command: ["/bin/sh", "-c", "env"]
envFrom:
- configMapRef:
name: mycm4
restartPolicy: Never
[root@node1 cm]# kubectl apply -f pod2.yml
pod/pod2 created
[root@node1 cm]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 2m24s
pod2 0/1 Completed 0 4s
[root@node1 cm]# kubectl logd pod2
2.2通过在pod的命令行下运行的方式
[root@node1 cm]# cat pod3.yml
apiVersion: v1
kind: Pod
metadata:
name: poddd3
spec:
containers:
- name: p3
image: busyboxplus
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
envFrom:
- configMapRef:
name: mycm4
restartPolicy: Never
[root@node1 cm]# kubectl apply -f pod3.yml
pod/poddd3 created
[root@node1 cm]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 9m38s
pod2 0/1 Completed 0 7m18s
poddd3 0/1 Completed 0 8s
[root@node1 cm]# kubectl logs poddd3
172.25.0.250 3306
2.3作为volume的方式挂在到pod内
[root@node1 cm]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers: #设定容器
- name: pod1
image: myapp:v1
volumeMounts: #容器的挂载路径
- name: config-volume
mountPath: /config
volumes: #设定容器的卷
- name: config-volume
configMap:
name: mycm4
[root@node1 cm]# kubectl apply -f pod1.yml
pod/pod1 created
[root@node1 cm]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 4s
[root@node1 cm]# kubectl exec -it pod1 -- sh #进去看一下
/ # ls
bin dev home media proc run srv tmp var
config etc lib mnt root sbin sys usr
/ # cd config/
/config # ls
db_host db_port
/config # cat *
172.25.0.2503306
2.4 configmap热更新
key–>文件名
vaule–>文件的内容
创建一个文件server.conf–key值–>挂载目录下的文件名
[root@node1 cm]# cat server.conf
server {
listen 8000;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@node1 cm]# kubectl create configmap server --from-file=server.conf #将server文件加到cm里
configmap/server created
[root@node1 cm]# kubectl get cm #查看一下已经加到
NAME DATA AGE
mycm1 2 14h
mycm2 1 14h
mycm3 2 14h
mycm4 2 142m
server 1 17s
[root@node1 cm]# cat pod1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d/ 挂到此目录下
volumes:
- name: config-volume
configMap:
name: server #源是:cm里的server
[root@node1 cm]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx-6bb8847948-cm5bx 1/1 Running 0 4m41s 10.244.1.110 node2 <none> <none>
可以正常访问:
现在对cm 里的server文件修改:将端口号由8000---->9000
[root@node1 cm]# kubectl edit cm server
configmap/server edited
进入pod中查看:
修改cm 里 的值,隔几秒挂载点才会同步变化,configmap已生效,但是不能pod并没有重新加载,因此就算改了,也没有生效。
如何生效?
1.容器删除,重新生成,就重新读取配置文件
2.patch指令重新加载,手动触发,IP会变
[root@node1 cm]# kubectl patch deployments.apps my-nginx --patch '{"spec": {"template":
> {
"metadata": {
"annotations": {
"version/config": "20200628"}}}}}' #对整个deployment都更新
此时IP已变:端口号也已经更新
二、Secret配置管理
(1)Secret对象类型用来保存敏感信息,例如密码,OAuth令牌和ssh key。
敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
Pod 可以用两种方式使用 secret:
• 作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。
•当 kubelet 为 pod 拉取镜像时使用。
(2)Secret的类型:
• Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改
pod 以使用此类型的 secret。
• Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,
因此安全性弱。
• kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。对应的 secret 会自动挂载到
Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
每个namesapce下都有一个名为default的默认的ServiceAccout对象
• Opaque Secret 其value为base64编码后的值。
[root@node1 cm]# echo -n 'admin' > ./username.txt
[root@node1 cm]# echo -n 'westos' > ./password.txt
[root@node1 cm]# kubectl get secrets
NAME TYPE DATA AGE
default-token-ccttm kubernetes.io/service-account-token 3 5d19h
[root@node1 cm]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
[root@node1 cm]# kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 3s
default-token-ccttm kubernetes.io/service-account-token 3 5d19h
默认情况下get secret和describe 无法得到密码的内容,可以通过base64 -d得到。
编写yml文件创建secret
[root@node1 cm]# cat mysecret.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: d2VzdG9z
[root@node1 cm]# kubectl apply -f mysecret.yml
secret/mysecret created
[root@node1 cm]# kubectl get secrets
NAME TYPE DATA AGE
default-token-ccttm kubernetes.io/service-account-token 3 5d19h
mysecret Opaque
将secret挂载到卷中
[root@node1 cm]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
[root@node1 cm]# kubectl exec mysecret -- ls /secret
password
username
向指定路径映射secret密钥
secret文件创建secret
[root@node1 cm