ConfigMap
简介
什么是ConfigMap
ConfigMap
是一种资源类型,用于存储非敏感性的配置数据,如环境变量、命令行参数、配置文件等。
这些数据可以被 Kubernetes 中的 Pod 使用,用于配置应用程序。
主要用于存储配置,使配置文件与镜像文件分离,使容器化的应用具有可移植性。
主要特点和用途
- 存储非敏感数据:
ConfigMap
用于存储敏感信息以外的配置数据,如环境变量、命令行参数、配置文件等。 - 动态配置:
ConfigMap
允许动态地更新 Pod 的配置,而不需要重新构建镜像或重新部署 Pod。 - 集中管理:可以将多个 Pod 的配置集中存储在同一个
ConfigMap
中,便于管理和维护。 - 版本控制:
ConfigMap
支持版本控制,可以为不同的配置版本创建不同的ConfigMap
对象。 - 安全:
ConfigMap
支持加密敏感数据,如密码、OAuth 令牌等。 - 多种使用方式:可以通过多种方式在 Pod 中使用
ConfigMap
中的数据,包括环境变量、命令行参数、配置文件等。
注意事项
- ConfigMap 需要在 Pod 启动前创建出来;
- 只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;
- 当 Pod 挂载 ConfigMap 绑定的目录时,目录并不会挂载到 Pod 内,只有目录下的文件会被挂载;
- 使用yaml创建ConfigMap时,如果使用了文件挂载形式,那么VOLUME中不加subPath会以覆盖的形式挂载。
定义ConfigMap
创建ConfigMap–命令创建
通常再用这个方式,将一个配置文件创建成ConfigMap。
- 创建目录
mkdir -p /root/configmap/
- 编辑ConfigMap配置文件
cat >> /root/configmap/resolv.conf << EOF
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF
cat >> /root/configmap/redis.conf << EOF
bind 192.168.108.130
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"
dir /usr/local/redis/data/
EOF
- 创建ConfigMap
#格式
kubectl create configmap configMap名称 --from-file=配置文件路径或目录
#将/root/configmap/下所有文件创建成ConfigMap
kubectl create configmap test-config --from-file=/root/configmap/
#仅针对redis.conf配置文件创建成ConfigMap
kubectl create configmap configmap-redis --from-file=/root/configmap/redis.conf
- 查看ConfigMap
kubectl get configmaps test-config
# NAME DATA AGE
# test-config 2 2m14s
- 查看ConfigMap配置内容
kubectl describe configmaps test-config
# Name: test-config
# Namespace: default
# Labels: <none>
# Annotations: <none>
# Data
# ====
# redis.conf:
# ----
# bind 192.168.108.130
# port 6379
# requirepass 1qaz!QAZ
# protected-mode yes
# timeout 0
# databases 16
# daemonize yes
# pidfile /usr/local/redis/pid/redis_6379.pid
# loglevel notice
# logfile "/usr/local/redis/logs/redis.log"
# dir /usr/local/redis/data/
# resolv.conf:
# ----
# nameserver 8.8.8.8
# nameserver 114.114.114.114
# Events: <none>
创建ConfigMap–字面创建
- 创建ConfigMap
kubectl create configmap key-value-configmap --from-literal=ip=192.168.23.138 --from-literal=port=22
- 查看ConfigMap
kubectl get configmaps
# NAME DATA AGE
# configmap-redis 1 29m
# key-value-configmap 2 7s
# kube-root-ca.crt 1 6d23h
- 查看ConfigMap配置内容
kubectl describe configmaps key-value-configmap
# Name: key-value-configmap
# Namespace: default
# Labels: <none>
# Annotations: <none>
# Data
# ====
# ip:
# ----
# 192.168.23.138
# port:
# ----
# 22
# Events: <none>
创建ConfigMap–yaml创建
- 编辑yaml-配置文件
apiVersion: v1
kind: ConfigMap #定义这是一个ConfigMap的资源
metadata:
name: test-2-configmap #定义ConfigMap的名称
namespace: default #指定了ConfigMap所在命名空间
labels:
app: test-2-configmap #定义了 ConfigMap 的标签,可以用于选择器。
data: #定义ConfigMap所包含的配置资源
redis.conf: | #此处定义了一个redis的配置
bind 192.168.108.130
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"
dir /usr/local/redis/data/
resolv.conf: |
nameserver 8.8.8.8
nameserver 114.114.114.114
- 编辑yaml-KeyValue
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-busybox
namespace: default
labels:
app: configmap-redis
data:
HOSTNAME: "192.168.23.138"
PORT: "2222"
PASSWORD: "WangMingQu@123456"
USERNAME: "wangmingqu"
- 创建ConfigMap
kubectl create -f configmap-2.yaml
- 查看ConfigMap
kubectl get configmaps
# NAME DATA AGE
# kube-root-ca.crt 1 6d22h
# test-2-configmap 2 4s
# test-config 2 7m
- 查看ConfigMap配置内容
kubectl describe configmaps test-2-configmap
# Name: test-2-configmap
# Namespace: default
# Labels: app=test-2-configmap
# Annotations: <none>
# Data
# ====
# redis.conf:
# ----
# bind 192.168.108.130
# port 6379
# requirepass 1qaz!QAZ
# protected-mode yes
# timeout 0
# databases 16
# daemonize yes
# pidfile /usr/local/redis/pid/redis_6379.pid
# loglevel notice
# logfile "/usr/local/redis/logs/redis.log"
# dir /usr/local/redis/data/
# resolv.conf:
# ----
# nameserver 8.8.8.8
# nameserver 114.114.114.114
# Events: <none>
创建ConfigMap–generate创建
- 创建目录
mkdir -p /root/configmap/
- 编译ConfigMap配置文件
cat >> /root/configmap/resolv.conf << EOF
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF
cat >> /root/configmap/redis.conf << EOF
bind 192.168.108.130
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"
dir /usr/local/redis/data/
EOF
- 创建generate文件
#注意:
#1. 此处只能使用kustomization.yaml的名称,否则将会报错;
#2. kustomization.yaml中
cat >> kustomization.yaml << EOF
configMapGenerator:
- name: test-configmap-generator #定义ConfigMap的名称
files:
- configmap/redis.conf #指定配置文件,只能指定文件不能指定目录;此处路径为相对路径,相对kustomization.yaml文件的路径
EOF
- 创建ConfigMap
kubectl apply -k .
#注意:-k后一要有“.”
- 检查ConfigMap
kubectl get configmaps
# NAME DATA AGE
# configmap-redis 1 40m
# key-value-configmap 2 11m
# kube-root-ca.crt 1 6d23h
# test-configmap-generator-d7f8f5tt9h 1 9s
- 检查ConfigMap配置内容
kubectl describe configmaps test-configmap-generator-d7f8f5tt9h
# Name: test-configmap-generator-d7f8f5tt9h
# Namespace: default
# Labels: <none>
# Annotations: <none>
# Data
# ====
# redis.conf:
# ----
# bind 192.168.108.130
# port 6379
# requirepass 1qaz!QAZ
# protected-mode yes
# timeout 0
# databases 16
# daemonize yes
# pidfile /usr/local/redis/pid/redis_6379.pid
# loglevel notice
# logfile "/usr/local/redis/logs/redis.log"
# dir /usr/local/redis/data/
# Events: <none>
应用ConfigMap
以变量形式挂载
- 编辑yaml
apiVersion: v1
kind: ConfigMap #定义了这是一个ConfigMap类型的资源
metadata:
name: configmap-busybox #定义了ConfigMap资源的名称,此名称在Pod引用ConfigMap时起到关联Pod用途
namespace: default #指定ConfigMap所在命名空间
labels:
app: configmap-redis #指定ConfigMap的标签
data:
HOSTNAME: "192.168.23.138" #以KeyValue的形式指定ConfigMap记录的配置,注意此处的Value必须是字符串形式,需要加双引号
PORT: "2222"
PASSWORD: "WangMingQu@123456"
USERNAME: "wangmingqu"
---
apiVersion: apps/v1
kind: Deployment #定义了这是一个Deployment类型的资源
metadata:
name: deployment-busybox #定义Deployment的名称
namespace: default
labels:
app: deployment-busybox #指定Deployment的标签
spec:
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox #定义Pod的名称
imagePullPolicy: IfNotPresent
image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
command:
- sleep
- "3600"
env: #指定ConfigMap的配置以变量的是形式挂载到Pod
- name: CONTAINER_HOSTNAME #定义Pod中容器使用的变量名称,使用此名称可以调用对应的值
valueFrom:
configMapKeyRef:
name: configmap-busybox #指定Pod从哪个ConfigMap的名称中获取配置,此处要与ConfigMap中metadata.name定义的名称保持一致
key: HOSTNAME #指定获取ConfigMap中的哪个Key,此处与ConfigMap中定义的data中定义的名称要保持一致
- name: CONTAINER_PORT
valueFrom:
configMapKeyRef:
name: configmap-busybox
key: PORT
- name: CONTAINER_PASSWORD
valueFrom:
configMapKeyRef:
name: configmap-busybox
key: PASSWORD
- name: CONTAINER_USERNAME
valueFrom:
configMapKeyRef:
name: configmap-busybox
key: USERNAME
restartPolicy: Always
- 创建服务
kubectl create -f configmap-deployment-pod-busybox-env.yaml
- 验证服务
kubectl exec -it deployment-busybox-77bddf9fcc-rpft2 -- sh
# / # echo $CONTAINER_HOSTNAME
# 192.168.23.138
以变量形式批量挂载
- 编辑yaml
apiVersion: v1
kind: ConfigMap #定义了这是一个ConfigMap类型的资源
metadata:
name: configmap-busybox #定义了ConfigMap资源的名称,此名称在Pod引用ConfigMap时起到关联Pod用途
namespace: default #指定ConfigMap所在命名空间
labels:
app: configmap-busybox #指定ConfigMap的标签
data:
busybox: |
HOSTNAME 192.168.23.138
PORT 2222
PASSWORD WangMingQu@123456
USERNAME wangmingqu
---
apiVersion: apps/v1
kind: Deployment #定义了这是一个Deployment类型的资源
metadata:
name: deployment-busybox #定义Deployment的名称
namespace: default
labels:
app: deployment-busybox #指定Deployment的标签
spec:
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox #定义Pod的名称
imagePullPolicy: IfNotPresent
image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
command:
- "sleep"
- "3600"
envFrom:
- configMapRef:
name: configmap-busybox #定义Pod引用的ConfigMap配置作为变量
restartPolicy: Always
- 创建服务
kubectl create -f configmap-deployment-busybox-envfrom.yaml
- 验证服务
exec -it deployment-busybox-6947c87fb6-gzfv4 -- sh
# / # env
# KUBERNETES_PORT=tcp://10.96.0.1:443
# KUBERNETES_SERVICE_PORT=443
# HOSTNAME=deployment-busybox-6947c87fb6-gzfv4
# SHLVL=1
# HOME=/root
# busybox=HOSTNAME 192.168.23.138
# PORT 2222
# PASSWORD WangMingQu@123456
# USERNAME wangmingqu
# TERM=xterm
# KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# KUBERNETES_PORT_443_TCP_PORT=443
# KUBERNETES_PORT_443_TCP_PROTO=tcp
# KUBERNETES_SERVICE_PORT_HTTPS=443
# KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
# KUBERNETES_SERVICE_HOST=10.96.0.1
# PWD=/
以文件形式挂载
- 编辑yaml
apiVersion: v1
kind: ConfigMap #定义这是一个ConfigMap类型资源
metadata:
name: configmap-redis #定义ConfigMap资源名称,用于关联Deployment中Pod的容器
namespace: default
labels:
app: configmap-redis
data:
redis.conf: | #将Redis配置文件写入ConfigMap中容器
dir /data/
bind 0.0.0.0
port 6380
requirepass 1qaz!QAZ
protected-mode no
timeout 0
databases 16
loglevel notice
pidfile /data/redis-6380.pid
---
apiVersion: apps/v1
kind: Deployment #定义了一个Deployment类型资源
metadata:
name: deployment-redis #定义Deployment资源的名称
namespace: default
labels:
app: deployment-redis
spec:
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis-one
image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6380 #由于配置文件定义了Redis的监听端口,此处要与其保持一致
volumeMounts: #定义了容器挂载的卷
- mountPath: /usr/local/redis/conf/ #定义了卷的挂载路径
name: redis-conf-volumes #定义了卷的名称,这个卷名称要与 volumes 部分定义的保持一致
command: #定义了容器启动后执行的命令
- "sh"
- "-c"
- "redis-server /usr/local/redis/conf/redis.conf" #指定了Redis启动时使用的配置文件
restartPolicy: Always
volumes: #定义了 Pod 使用的卷信息
- name: redis-conf-volumes #定义了卷的名称,与spec.template.spec.containers.volumeMounts.name要保持一致
configMap: #定义了该卷是一个 ConfigMap 类型的卷
name: configmap-redis #定义了 ConfigMap 的名称,这个 ConfigMap 中存储了 Redis 配置文件的内容。
- 创建服务
kubectl create -f configmap-deployment-pod-redis-volume.yaml
- 验证服务
kubectl exec -it deployment-redis-74bf7fbd7b-stbtn -- /bin/bash
# root@deployment-redis-74bf7fbd7b-stbtn:/data# redis-cli -p 6380
# 127.0.0.1:6380> AUTH 1qaz!QAZ
# OK
以文件形式挂载–subPath
- 编辑yaml
apiVersion: v1
kind: ConfigMap #表示这是一个 ConfigMap 资源。
metadata:
name: redis-config #定义了 ConfigMap 的名称。
namespace: default
labels:
app: redis
data: #包含了一系列键值对,其中键是配置文件的名称,值是文件的内容。
redis.conf: |
dir /data/
port 6380
bind 0.0.0.0
appendonly no
protected-mode no
pidfile /data/redis-6379.pid
---
apiVersion: apps/v1
kind: Deployment #表示这是一个 Deployment 资源。
metadata:
name: redis #定义了 Deployment 的名称。
namespace: default
labels:
app: redis
spec:
selector:
matchLabels:
app: redis #使用标签选择器 matchLabels: app: redis 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
template:
metadata:
labels:
app: redis
spec:
containers: #定义了容器模板。
- name: redis #定义了容器的名称。
image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
command:
- "sh"
- "-c"
- "redis-server /usr/local/redis/redis.conf"
ports:
- containerPort: 6380
volumeMounts:
- name: config #定义了卷的名称。
mountPath: /usr/local/redis/ #定义了卷的挂载路径。
subPath: redis.conf #定义了配置文件在卷中的路径,这意味着 ConfigMap 中存储的数据将被挂载到 /usr/local/redis/example.conf
volumes: #定义了 Pod 使用的卷
- name: config #定义了卷的名称。
configMap: #定义了该卷是一个 ConfigMap 类型的卷。
name: redis-config #定义了 ConfigMap 的名称,这个 ConfigMap 中存储了 Redis 配置文件的内容。
- 创建服务
kubectl create -f configmap-deployment-pod-redis-subpath.yaml
Secret
简介
什么是Secret
Secret
是一种资源类型,用于存储敏感信息,如密码、OAuth 令牌、SSH 密钥、证书等。
这些敏感信息在 Kubernetes 集群中以加密的形式存储,以保证安全性。
主要用于存储敏感信息,将这些信息放在Secret中比放在Pod的定义或容器镜像中更加安装、灵活。
主要特点和用途
- 存储敏感信息:
Secret
用于存储敏感信息,如密码、OAuth 令牌、SSH 密钥、证书等。 - 加密存储:
Secret
中的数据会被加密存储,以保证敏感信息的安全性。 - 版本控制:
Secret
支持版本控制,你可以为不同的配置版本创建不同的Secret
对象。 - 多种使用方式:你可以通过多种方式在 Pod 中使用
Secret
中的数据,包括环境变量、命令行参数、配置文件等。 - 安全引用:在 Pod 中引用
Secret
时,Kubernetes 会自动解密数据,并在 Pod 中以安全的方式使用。
特别注意事项
- 使用yaml创建Secret时,如果同时有data和stringData,则只使用stringData。
- 使用yaml创建Secret时,如果使用stringData,则Value必须是字符串形式。
- 使用yaml创建Secret时,如果使用了文件挂载形式,那么VOLUME中不加subPath会以覆盖的形式挂载。
存储类型拓展
- Opaque:
- 这是默认类型,用于存储任何类型的数据。
- 数据会被 Base64 编码,但不会被加密。
- 适用于存储非敏感信息,如环境变量或配置文件。
- kubernetes.io/service-account-token:
- 用于存储 Kubernetes 服务账户的令牌。
- 数据会被加密存储。
- kubernetes.io/dockercfg 和 kubernetes.io/dockerconfigjson:
- 用于存储 Docker 认证信息,如登录凭据。
- 数据会被加密存储。
- kubernetes.io/basic-auth 和 kubernetes.io/tls:
- 用于存储基本认证凭据和 TLS 证书。
- 数据会被加密存储。
- bootstrap.kubernetes.io/token:
- 用于存储集群引导令牌。
- 数据会被加密存储。
- bootstrap.kubernetes.io/kubeconfig:
- 用于存储 kubeconfig 文件,用于访问 Kubernetes API。
- 数据会被加密存储。
- bootstrap.kubernetes.io/signer:
- 用于存储签名密钥,用于对 Pod 进行签名。
- 数据会被加密存储。
- bootstrap.kubernetes.io/token:
- 用于存储集群引导令牌。
- 数据会被加密存储。
- bootstrap.kubernetes.io/kubeconfig:
- 用于存储 kubeconfig 文件,用于访问 Kubernetes API。
- 数据会被加密存储。
- bootstrap.kubernetes.io/signer:
- 用于存储签名密钥,用于对 Pod 进行签名。
- 数据会被加密存储。
定义Secret
创建Secret–命令创建
- 创建目录
mkdir -p /root/secret
- 编辑Secret配置文件
#注意:此处一个文件一个账号或密码
echo "wangmingqu" > /root/secret/username.txt
echo "WangMingQu@123" > /root/secret/password.txt
- 创建Secret
kubectl create secret generic username-password-test --from-file=/root/secret/username.txt --from-file=/root/secret/password.txt
- 查看Secret
kubectl get secrets
# NAME TYPE DATA AGE
# default-token-vrnhx kubernetes.io/service-account-token 3 7d16h
# username-password-test Opaque 2 20s
- 查看Secret内容
kubectl get secrets username-password-test -o yaml
# apiVersion: v1
# data:
# password.txt: d2FuZ0AxMjMKbWluZ0AxMjMKcXVAMTIzCg==
# username.txt: d2FuZwptaW5nCnF1Cg==
# kind: Secret
# metadata:
# creationTimestamp: "2024-07-18T01:58:05Z"
# managedFields:
# - apiVersion: v1
# fieldsType: FieldsV1
# fieldsV1:
# f:data:
# .: {}
# f:password.txt: {}
# f:username.txt: {}
# f:type: {}
# manager: kubectl-create
# operation: Update
# time: "2024-07-18T01:58:05Z"
# name: username-password-test
# namespace: default
# resourceVersion: "431219"
# uid: 9db93e93-fe78-4f7a-8c03-db9b92b6af1b
# type: Opaque
创建Secret–字面创建
- 创建Secret
kubectl create secret generic username-password-db --from-literal=username=WangMingQu --from-literal=password=WangMingQu@123
- 查看Secret
kubectl get secrets
# NAME TYPE DATA AGE
# default-token-vrnhx kubernetes.io/service-account-token 3 7d16h
# username-password-db Opaque 2 18s
# username-password-test Opaque 2 7m13s
- 查看Secret内容
kubectl get secrets username-password-db -o yaml
# apiVersion: v1
# data:
# password: V2FuZ01pbmdRdUAxMjM=
# username: V2FuZ01pbmdRdQ==
# kind: Secret
# metadata:
# creationTimestamp: "2024-07-18T02:05:00Z"
# managedFields:
# - apiVersion: v1
# fieldsType: FieldsV1
# fieldsV1:
# f:data:
# .: {}
# f:password: {}
# f:username: {}
# f:type: {}
# manager: kubectl-create
# operation: Update
# time: "2024-07-18T02:05:00Z"
# name: username-password-db
# namespace: default
# resourceVersion: "431716"
# uid: 2b5b30cf-c281-4cff-b86b-adf3031982a5
# type: Opaque
创建Secret–yaml创建(手动转译账号密码)
- 加密账号和密码
#加密账号
echo WangMingQu | base64
# V2FuZ01pbmdRdQo=
#加密密码
echo WangMingQu@123456 | base64
# V2FuZ01pbmdRdUAxMjM0NTYK
- 编辑yaml
apiVersion: v1
kind: Secret #表示这是一个 Secret 资源
metadata:
name: secret-up #定义了 Secret 的名称
namespace: default
labels:
app: username-password
data: #包含了一系列键值对,其中键是 Secret 的键名,值是加密后的敏感信息。
username: V2FuZ01pbmdRdQo= #base64加密过的账号
password: V2FuZ01pbmdRdUAxMjM0NTYK #base64加密过的密码
type: Opaque #表示 Secret 中的数据是原始的,没有被特别处理或加密
- 创建Secret
kubectl create -f secret-m.yaml
- 查看Secret
kubectl get secrets
# NAME TYPE DATA AGE
# default-token-vrnhx kubernetes.io/service-account-token 3 7d16h
# secret-up Opaque 2 8s
- 查看Secret内容
kubectl get secrets secret-up -o yaml
# apiVersion: v1
# data:
# password: V2FuZ01pbmdRdUAxMjM0NTYK
# username: V2FuZ01pbmdRdQo=
# kind: Secret
# metadata:
# creationTimestamp: "2024-07-18T02:28:27Z"
# labels:
# app: username-password
# managedFields:
# - apiVersion: v1
# fieldsType: FieldsV1
# fieldsV1:
# f:data:
# .: {}
# f:password: {}
# f:username: {}
# f:metadata:
# f:labels:
# .: {}
# f:app: {}
# f:type: {}
# manager: kubectl-create
# operation: Update
# time: "2024-07-18T02:28:27Z"
# name: secret-up
# namespace: default
# resourceVersion: "433405"
# uid: d19e12a5-19c3-4e10-b7a1-4ed246215294
# type: Opaque
创建Secret–yaml创建(自动转译账号密码)
- 编辑yaml
apiVersion: v1
kind: Secret #表示这是一个 Secret 资源
metadata:
namespace: default
name: secret-up-auth #定义了 Secret 的名称
labels:
app: secret-up-auth
stringData: #包含了一系列键值对,其中键是 Secret 的键名,值是加密后的敏感信息。可以自动转译账号密码
username: "wangmingqu" #直接填入账号
password: "WangMingQu@1234567890" #直接写入密码
type: Opaque #这是默认类型,用于存储任何类型的数据
- 创建Secret
kubectl create -f secret-a.yaml
- 查看Secret
kubectl get secrets
# NAME TYPE DATA AGE
# default-token-vrnhx kubernetes.io/service-account-token 3 7d16h
# secret-up Opaque 2 4m28s
# secret-up-auth Opaque 2 9s
- 查看Secret内容
kubectl get secrets secret-up-auth -o yaml
# apiVersion: v1
# data:
# password: V2FuZ01pbmdRdUAxMjM0NTY3ODkw
# username: d2FuZ21pbmdxdQ==
# kind: Secret
# metadata:
# creationTimestamp: "2024-07-18T02:32:46Z"
# labels:
# app: secret-up-auth
# managedFields:
# - apiVersion: v1
# fieldsType: FieldsV1
# fieldsV1:
# f:data:
# .: {}
# f:password: {}
# f:username: {}
# f:metadata:
# f:labels:
# .: {}
# f:app: {}
# f:type: {}
# manager: kubectl-create
# operation: Update
# time: "2024-07-18T02:32:46Z"
# name: secret-up-auth
# namespace: default
# resourceVersion: "433713"
# uid: 8d8d7aec-eafb-40c4-bafd-afd9e276adb0
# type: Opaque
创建Secret–generate创建
注意:用法与ConfigMap一致。
- 创建目录
mkdir -p /root/secret/mysql
- 创建Secret文件
echo "ChangMengKa" > /root/secret/mysql/username.txt
echo "ChangMengKa@123456789" > /root/secret/mysql/password.txt
- 创建generate文件
cat >> kustomization.yaml << EOF
secretGenerator:
- name: secret-mysql
files:
- secret/mysql/username.txt
- secret/mysql/password.txt
EOF
- 创建Secret
kubectl apply -k .
- 查看Secret
kubectl get secrets
# NAME TYPE DATA AGE
# default-token-vrnhx kubernetes.io/service-account-token 3 7d16h
# secret-mysql-8hm549672d Opaque 2 2m23s
# secret-up Opaque 2 21m
# secret-up-auth Opaque 2 16m
- 查看Secret内容
kubectl get secrets secret-mysql-8hm549672d -o yaml
# apiVersion: v1
# data:
# password.txt: Q2hhbmdNZW5nS2FAMTIzNDU2Nzg5Cg==
# username.txt: Q2hhbmdNZW5nS2EK
# kind: Secret
# metadata:
# annotations:
# kubectl.kubernetes.io/last-applied-configuration: |
# {"apiVersion":"v1","data":{"password.txt":"Q2hhbmdNZW5nS2FAMTIzNDU2Nzg5Cg==","username.txt":"Q2hhbmdNZW5nS2EK"},"kind":"Secret","metadata":{"annotations":{},"name":"secret-mysql-8hm549672d","namespace":"default"},"type":"Opaque"}
# creationTimestamp: "2024-07-18T02:47:10Z"
# managedFields:
# - apiVersion: v1
# fieldsType: FieldsV1
# fieldsV1:
# f:data:
# .: {}
# f:password.txt: {}
# f:username.txt: {}
# f:metadata:
# f:annotations:
# .: {}
# f:kubectl.kubernetes.io/last-applied-configuration: {}
# f:type: {}
# manager: kubectl-client-side-apply
# operation: Update
# time: "2024-07-18T02:47:10Z"
# name: secret-mysql-8hm549672d
# namespace: default
# resourceVersion: "434748"
# uid: 18afa634-38bc-4b98-ba52-6bb102401b1e
# type: Opaque
加密&解密
- 说明
Secret的用户和密码是采用Base64加密算法加密,可以被正常解密;
密码有特殊字符时,可以使用单引号(‘’)将密码括起来,这样不用进行转译;
- 加密
echo "WangMingQu" | base64
# V2FuZ01pbmdRdQ==
echo "WangMingQu@123" | base64
# V2FuZ01pbmdRdUAxMjM=
- 解密
echo V2FuZ01pbmdRdQ== | base64 --decode
# WangMingQu
echo V2FuZ01pbmdRdUAxMjM= | base64 --decode
# WangMingQu@123
应用Secret
以变量形式挂载
- 编辑yaml
apiVersion: v1
kind: Secret #表示这是一个 Secret 资源。
metadata:
name: secret-busybox #定义了 Secret 的名称。
namespace: default
labels:
app: secret-busybox
stringData: #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
username: "wangmingqu"
password: "wangmingqu@1234567890"
type: Opaque #表示 Secret 中的数据是原始的,没有被特别处理或加密。
---
apiVersion: apps/v1
kind: Deployment #表示这是一个 Deployment 资源。
metadata:
name: deployment-busybox #定义了 Deployment 的名称。
namespace: default
labels:
app: deployment-busybox
spec:
selector: #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers: #定义了容器模板。
- name: busybox #定义了容器的名称。
imagePullPolicy: IfNotPresent
image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
command:
- sleep
- "3600"
env: #定义了容器环境变量。
- name: envsecretusername #定义了一个环境变量,其值从 secret-busybox Secret 中的 username 键获取。
valueFrom:
secretKeyRef:
name: secret-busybox
key: username
- name: envsecretpassword #定义了一个环境变量,其值从 secret-busybox Secret 中的 password 键获取。
valueFrom:
secretKeyRef:
key: password
name: secret-busybox
restartPolicy: Always
- 创建服务
kubectl create -f secret-busybox-env.yaml
- 查看Secret内容
kubectl get secrets secret-busybox -o yaml
# apiVersion: v1
# data:
# password: d2FuZ21pbmdxdUAxMjM0NTY3ODkw
# username: d2FuZ21pbmdxdQ==
# kind: Secret
# metadata:
# creationTimestamp: "2024-07-18T05:10:22Z"
# labels:
# app: secret-busybox
# managedFields:
# - apiVersion: v1
# fieldsType: FieldsV1
# fieldsV1:
# f:data:
# .: {}
# f:password: {}
# f:username: {}
# f:metadata:
# f:labels:
# .: {}
# f:app: {}
# f:type: {}
# manager: kubectl-create
# operation: Update
# time: "2024-07-18T05:10:22Z"
# name: secret-busybox
# namespace: default
# resourceVersion: "445012"
# uid: 49f06a64-a0b0-4826-8852-2980dd5c7f2c
# type: Opaque
- 验证服务
kubectl exec -it deployment-busybox-6f7cb9cc9f-wrndz -- sh
# / # echo $envsecretusername
# wangmingqu
# / # echo $envsecretpassword
# wangmingqu@1234567890
以变量形式批量挂载
- 编辑yaml
apiVersion: v1
kind: Secret #表示这是一个 Secret 资源。
metadata:
name: secret-busybox #定义了 Secret 的名称。
namespace: default
labels:
app: secret-busybox
stringData: #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
username: "wangmingqu"
password: "wangmingqu@1234567890"
type: Opaque #表示 Secret 中的数据是原始的,没有被特别处理或加密。
---
apiVersion: apps/v1
kind: Deployment #表示这是一个 Deployment 资源。
metadata:
name: deployment-busybox #定义了 Deployment 的名称。
namespace: default
labels:
app: deployment-busybox
spec:
selector: #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers: #定义了容器模板。
- name: busybox #定义了容器的名称。
imagePullPolicy: IfNotPresent
image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
command:
- sleep
- "3600"
envFrom:
- secretRef:
name: secret-busybox
restartPolicy: Always
- 创建服务
kubectl create -f secret-depolyment-busybox-envfrom.yaml
- 查看Secret内容
kubectl get secrets secret-busybox -o yaml
# apiVersion: v1
# data:
# password: d2FuZ21pbmdxdUAxMjM0NTY3ODkw
# username: d2FuZ21pbmdxdQ==
# kind: Secret
# metadata:
# creationTimestamp: "2024-07-18T05:25:18Z"
# labels:
# app: secret-busybox
# managedFields:
# - apiVersion: v1
# fieldsType: FieldsV1
# fieldsV1:
# f:data:
# .: {}
# f:password: {}
# f:username: {}
# f:metadata:
# f:labels:
# .: {}
# f:app: {}
# f:type: {}
# manager: kubectl-create
# operation: Update
# time: "2024-07-18T05:25:18Z"
# name: secret-busybox
# namespace: default
# resourceVersion: "446194"
# uid: 95ac4bbe-19bb-4f80-8631-5a46845f0375
# type: Opaque
- 验证服务
kubectl exec -it deployment-busybox-5bf79c7654-r48p9 -- sh
# / # env
# KUBERNETES_SERVICE_PORT=443
# KUBERNETES_PORT=tcp://10.96.0.1:443
# HOSTNAME=deployment-busybox-5bf79c7654-r48p9
# SHLVL=1
# username=wangmingqu
# HOME=/root
# TERM=xterm
# KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# KUBERNETES_PORT_443_TCP_PORT=443
# password=wangmingqu@1234567890
# KUBERNETES_PORT_443_TCP_PROTO=tcp
# KUBERNETES_SERVICE_PORT_HTTPS=443
# KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
# KUBERNETES_SERVICE_HOST=10.96.0.1
# PWD=/
# / #
以文件形式挂载
- 编辑yaml
apiVersion: v1
kind: Secret #表示这是一个 Secret 资源。
metadata:
name: secret-file #定义了 Secret 的名称。
namespace: default
labels:
app: secret-file
stringData: #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
username: "wangmingqu"
password: "wangminbqu@123"
type: Opaque
---
apiVersion: apps/v1
kind: Deployment #表示这是一个 Deployment 资源。
metadata:
name: deployment-file #定义了 Deployment 的名称。
namespace: default
labels:
app: deployment-file
spec:
selector:
matchLabels:
app: busybox #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
template:
metadata:
labels:
app: busybox
spec:
containers: #定义了容器模板。
- name: busybox #定义了容器的名称。
imagePullPolicy: IfNotPresent
image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
command:
- sleep
- "3600"
volumeMounts: #定义了容器挂载的卷。
- mountPath: /usr/local/ #定义了卷的挂载路径。
name: volume-file #定义了卷的名称,这个卷将在 volumes 部分定义。
volumes: #定义了 Pod 使用的卷。
- name: volume-file #定义了卷的名称。
secret: #定义了该卷是一个 Secret 类型的卷。
secretName: secret-file #定义了 Secret 的名称,这个 Secret 中存储了用户名和密码。
restartPolicy: Always
- 创建服务
kubectl create -f secret-depolyment-busybox-volume.yaml
- 查看Secret内容
kubectl get secrets
# NAME TYPE DATA AGE
# default-token-vrnhx kubernetes.io/service-account-token 3 7d20h
# secret-file Opaque 2 10m
- 验证服务
kubectl exec -it deployment-file-75bd86d4bc-ql27p -- sh
# / # cat /usr/local/password
# wangminbqu@123/ #
# / # cat /usr/local/username
# wangmingqu/ #
以文件形式挂载–subPath
- 编辑yaml
apiVersion: v1
kind: Secret #表示这是一个 Secret 资源。
metadata:
name: secret-file #定义了 Secret 的名称。
namespace: default
labels:
app: secret-file
stringData: #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
username: "wangmingqu"
password: "wangminbqu@123"
type: Opaque
---
apiVersion: apps/v1
kind: Deployment #表示这是一个 Deployment 资源。
metadata:
name: deployment-file #定义了 Deployment 的名称。
namespace: default
labels:
app: deployment-file
spec:
selector:
matchLabels:
app: busybox #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
template:
metadata:
labels:
app: busybox
spec:
containers: #定义了容器模板。
- name: busybox #定义了容器的名称。
imagePullPolicy: IfNotPresent
image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
command:
- sleep
- "3600"
volumeMounts: #定义了容器挂载的卷。
- mountPath: /usr/local/ #定义了卷的挂载路径。
name: volume-file #定义了卷的名称,这个卷将在 volumes 部分定义。
subPath: username-passowrd.txt #定义了配置文件在卷中的路径,这意味着 Secret 中存储的数据将被挂载到 /usr/local/username-passowrd.txt
volumes: #定义了 Pod 使用的卷。
- name: volume-file #定义了卷的名称。
secret: #定义了该卷是一个 Secret 类型的卷。
secretName: secret-file #定义了 Secret 的名称,这个 Secret 中存储了用户名和密码。
restartPolicy: Always
- 创建服务
kubectl create -f secret-depolyment-busybox-subpath.yaml
Pod拉取私有镜像–ImagePullSecret(命令行)
- 说明
- ImagePullSecret可以在Pod拉取私有镜像仓库时使用的账号密码;
- ImagePullSecret里面的账号信息会传递给kubectl,然后kubectl就可以拉取有账号密码的私有仓库中的镜像;
- 创建服务
#格式
kubectl create secret docker-registry Secret名称 --docker-server=私有仓库地址 --docker-username=私有仓库账号 --docker-password=私有仓库密码 --docker-email=私有仓库邮箱
#举例
kubectl create secret docker-registry secret-ali-registry --docker-server=registry.cn-beijing.aliyuncs.com/publicspaces/nginx --docker-username=15515190288 --docker-password=cmk521cmk --docker-email=15515190288@163.com
- 查看Secret
kubectl get secrets
# NAME TYPE DATA AGE
# default-token-vrnhx kubernetes.io/service-account-token 3 7d20h
# secret-ali-registry kubernetes.io/dockerconfigjson 1 6s
# secret-file Opaque 2 26m
- 应用Secret
apiVersion: apps/v1
kind: Deployment #定义Deployment资源类型
metadata:
name: deployment-nginx #定义Deployment的名称
namespace: default #定义Deployment所在命名空间
labels: #定义Deployment的标签信息
app: nginx
type: web
spec: #定义ReplicaSet的信息
replicas: 3 #定义Pod中容器的副本数量
strategy: #定义升级、回滚、部署的策略
type: RollingUpdate #定义更新策略为滚动更新策略
rollingUpdate: #定义更新的策略
maxSurge: 25% #定义滚动更新时,一次添加副本数为25%,也可以设置为数字;如果设置为0,那么maxSurge就不能为0
maxUnavailable: 25% #定义滚动更新时,最大不可用副本数为25%,也可以设置为数字;如果设置为0,那么maxUnavailable就不能为0
revisionHistoryLimit: 10 #定义留存副本的历史记录个数,设置为0表示不保留历史数据
minReadySeconds: 30 #定义在滚动更新时,新Pod在准备就绪后等待30秒后才会开始接收流量,常与探针配合使用
progressDeadlineSeconds: 600
selector: #selector下的labels要与template的labels保持一致,否则无法管理Pod
matchLabels:
app: nginx #指定标签要与template中标签保持一致,新版本中一旦定义标签后无法修改
template: #template下的labels要与selector的labels保持一致,否则无法管理Pod
metadata:
labels:
app: nginx #指定标签要与selector中标签保持一致,新版本中一旦定义标签后无法修改
spec: #定义Pod的容器信息
imagePullSecrets: #定义使用Secret写入私有仓库账号密码
- name: secret-ali-registry #指定使用的Secret名称
containers: #定义一个Pod的容器
- name: nginx-web #定义Pod中容器名称
image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1 #定义Pod中容器拉取的镜像
imagePullPolicy: IfNotPresent #定义Pod中容器拉取镜像策略
restartPolicy: Always #定义Pod中容器的启动策略
热更新
注意事项
- ConfigMap和Secret如果是以subPath的形式挂载的,那么Pod不会感知到ConfigMap和Secret的更新;
- 如果Pod的变量来自于ConfigMap和Secret中定义的内容,那么ConfigMap和Secret更新后也不会更新Pod中的变量;
ConfigMap热更新
在大多数情况下,使用 kubectl apply
命令是更好的选择,因为它可以自动处理资源版本的更新,而 kubectl set
命令需要你手动指定资源版本。
edit更新
使用edit编辑后等待约10s后将会完成更新,推荐使用apply
#格式
kubectl edit configmap ConfigMap的名称 -n 命名空间
#举例
kubectl edit configmap configmap.yaml -n <namespace>
apply更新
#格式
kubectl apply -f ConfigMap文件 -n 命名空间
#举例
kubectl apply -f configmap.yaml -n <namespace>
replace更新
先调整配置文件,然后将其导出成yaml文件显示在屏幕上,最后将其replace
#格式
kubectl create configmap ConfigMap名称 --from-file=配置文件路径 --dry-run -o yaml | kubectl replace -f
#举例
kubectl create configmap test-configmap --from-file=/root/configmap/redis.conf --dry-run -o yaml | kubectl replace -f-
Secret热更新
在大多数情况下,使用 kubectl apply
命令是更好的选择,因为它可以自动处理资源版本的更新,而 kubectl set
命令需要你手动指定资源版本。
edit更新
使用edit编辑后等待约10s后将会完成更新,推荐使用apply
#格式
kubectl edit secrets Secret的名称 -n 命名空间
#举例
kubectl edit secrets secret.yaml -n <namespace>
apply更新
#格式
kubectl apply -f Secret文件 -n 命名空间
#举例
kubectl apply -f secret.yaml -n <namespace>
replace更新
先调整配置文件,然后将其导出成yaml文件显示在屏幕上,最后将其replace
#格式
kubectl create secret ConfigMap名称 --from-file=配置文件路径 --dry-run -o yaml | kubectl replace -f-
#举例
kubectl create secret test-configmap --from-file=/root/secret/password.txt --dry-run -o yaml | kubectl replace -f-
不可变(immutable)
概念
容器挂载了ConfigMap或Secret,如果配置出现错误就会更新到容器中导致故障发生。这就需要将ConfigMap和Secret设置成不可变的,所以引入了immutable。
应用
ConfigMap应用immutable
apiVersion: v1
kind: ConfigMap #定义这是一个ConfigMap的资源
metadata:
name: test-2-configmap #定义ConfigMap的名称
namespace: default #指定了ConfigMap所在命名空间
labels:
app: test-2-configmap #定义了 ConfigMap 的标签,可以用于选择器。
data: #定义ConfigMap所包含的配置资源
redis.conf: | #此处定义了一个redis的配置
bind 192.168.108.130
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"
dir /usr/local/redis/data/
resolv.conf: |
nameserver 8.8.8.8
nameserver 114.114.114.114
immutable: true #设置ConfigMap不可变
Secret应用immutable
apiVersion: v1
kind: Secret #表示这是一个 Secret 资源
metadata:
namespace: default
name: secret-up-auth #定义了 Secret 的名称
labels:
app: secret-up-auth
stringData: #包含了一系列键值对,其中键是 Secret 的键名,值是加密后的敏感信息。可以自动转译账号密码
username: wangmingqu #直接填入账号
password: WangMingQu@1234567890 #直接写入密码
type: Opaque
immutable: true #开启Secret不可变