错误手册
ConfigMap
概念
ConfigMap一般用于管理一些配置文件或者一些环境变量信息。
ConfigMap可以将配置和Pod分开,使配置文件的变更和管理更加便易。
ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
注意事项
- ConfigMap 需要在 Pod 启动前创建出来;
- 只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;
- 当 Pod 挂载 ConfigMap 绑定的目录时,目录并不会挂载到 Pod 内,只有目录下的文件会被挂载;
创建ConfigMap
命令创建ConfigMap
- 创建configmap
kubectl create configmap nginx-config --from-literal=nginx_pod=80 --from-literal=server_name=test.wang.com
create:创建服务
configmap:指定创建服务类型
nginx-config:指定ConfigMap的名称
–from-literal=:指定配置项
命令指定文件创建ConfigMap
- 创建key-value目录文件
mkdir -p /root/configmap/
cat >> /root/configmap/nginx.conf << EOF
server {
server_name test.wang.com;
listen 80;
}
EOF
cat >> /root/configmap/redis.conf << EOF
listen 6379
daemonize yes
EOF
- 生成configMap
#将指定一个文件夹下所有配置,创建一个configmap
kubectl create configmap nginx-redis-config --from-file=/root/configmap/
#指定一个文件
kubectl create configmap nginx-redis-config --from-file=/root/configmap/nginx.conf
–from-file=指定某个文件或某个文件夹下的所有文件
yaml创建ConfigMap
- ConfigMap默认配置文件
- 编辑yaml配置文件
apiVersion: v1
#指定资源类型
kind: ConfigMap
metadata:
#指定configmap的名称
name: nginx-config-test
#支持configmap的标签
labels:
app: nginx-config-test
#指定configmap的配置数据
data:
#指定一段configmap的资源(要注意“|”是必要项)
nginx.conf: |
server {
server_name test.bin.com;
listen 80;
}
#指定另一段configmap的资源(要注意“|”是必要项)
redis.conf: |
listen 6379
daemonize yes
- 生成ConfigMap
kubectl apply -f /root/configmap-nginx.yaml
查看ConfigMap
查看configmap名称
kubectl get configmaps
查看configmap内容
kubectl describe configmaps nginx-config
configmap内容
Name: nginx-redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
nginx.conf:
----
server {
server_name test.wang.com;
listen 80;
}
nginx.properties:
----
servername=www.baidu.com
path=/var/log/nginx/
user=nginx
group=nginx
redis.conf:
----
listen 6379
daemonize yes
Events: <none>
应用ConfigMap
以变量形式进行挂载
- 创建yaml文件
apiVersion: v1 # API 版本 (使用 kubectl explain ConfigMap(具体类型) 即可查看到对应版本号)
kind: ConfigMap # 类型为 ConfigMap
metadata:
name: configmap-busybox # ConfigMap 的名称 (绑定时需要用到)
data:
hostname: "192.169.1.211" # Key 和 Value
password: "1qaz!QAZ"
hostport: "3306"
describe: "test configmap busybox print"
---
apiVersion: v1
kind: Pod
metadata:
name: buxybox
spec:
containers:
- name: buxybox
image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
imagePullPolicy: IfNotPresent
command: ['/bin/sh','-c','env']
env: # 配置环境变量
- name: HostName # 变量名
valueFrom:
configMapKeyRef:
name: configmap-busybox # ConfigMap 名称 (要和上面对应)
key: hostname # ConfigMap 里边的 Key (要和上面对应)
- name: Password
valueFrom:
configMapKeyRef:
name: configmap-busybox
key: password
- name: HostPort
valueFrom:
configMapKeyRef:
key: hostport
name: configmap-busybox
- name: Describe
valueFrom:
configMapKeyRef:
key: describe
name: configmap-busybox
- 生成Pod
kubectl create -f configmap-busybox.yaml
- 检查变量
kubectl logs buxybox | egrep 'HostName|Password|HostPort|Describe'
以变量形式批量挂载
- 创建yaml文件
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-cm
data:
MYSQL_ROOT_PASSWORD: wang123
mysql.conf: |
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld]
port = 3306 # 监听端口
datadir = /var/lib/mysql # 数据库存储目录
socket = /var/run/mysqld/mysqld.sock
skip_name_resolve = ON # 禁用DNS解析,提高查询性能
max_connections = 1000 # 最大连接数
max_allowed_packet = 16M # 最大允许的数据包大小
innodb_buffer_pool_size = 128M # InnoDB缓存大小
[mysqld_safe]
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysql/mysql-error.log
[mysql]
default-character-set=utf8mb4
[mysqldump]
default-character-set=utf8mb4
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-dep
spec:
selector:
matchLabels:
app: mysql
replicas: 1 #设置副本数量为1,可以根据需求调整
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql-8 # 容器名称为mysql-container,可以自定义修改成你想要的名字。
image: registry.cn-beijing.aliyuncs.com/publicspaces/mysql:8.0.27 # 使用 MySQL 镜像
envFrom:
- configMapRef:
name: mysql-cm # 引用上面定义的 ConfigMap
ports:
- containerPort: 3306 # 暴露容器端口号为3306,外部应用程序可以通过此端口访问MySQL服务。
- 生成pod
kubectl create -f /root/mysql/cm-mysql.yaml
- 检查变量
kubectl exec -it mysql-deployment-585fc8c567-lpbnf -- mysql -uroot -p'wang123'
SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
以volume形式挂载
- 创建yaml文件
kind: ConfigMap
apiVersion: v1
metadata:
name: redis-config # ConfigMap 名称
namespace: default
labels:
app: redis
data:
redis.conf: |
dir /data/
port 6379
bind 0.0.0.0
appendonly no
protected-mode no
pidfile /data/redis-6379.pid
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
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/etc/redis/redis.conf"
ports:
- containerPort: 6379
volumeMounts:
- name: config # 挂载的目录名称
mountPath: /usr/local/etc/redis/ #注意此挂载会覆盖整个目录
volumes:
- name: config # 挂载的目录名称 (要和上面对应)
configMap:
name: redis-config # ConfigMap 名称 (要和上面对应)
- 生成pod
kubectl create -f /root/redis/cm-redis.yaml
- 检查变量
kubectl exec -it redis-564f9dcf4b-v4ch5 -- redis-cli
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379>
以volume形式的subpath挂载
- 注意
- 以volume形式挂载会影响整个挂载的目录。
- 可以使用subpath参数指定某个文件,从而减少影响范围。
- 使用subpath参数挂载的无法实现热更新。
- 创建yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: redis-config # ConfigMap 名称
namespace: default
labels:
app: redis
data:
redis.conf: |
dir /data/
port 6379
bind 0.0.0.0
appendonly no
protected-mode no
pidfile /data/redis-6379.pid
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
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/etc/redis/redis.conf"
ports:
- containerPort: 6379
volumeMounts:
- name: config # 挂载的目录名称
mountPath: /usr/local/etc/redis/
subPath: redis.conf
volumes:
- name: config # 挂载的目录名称 (要和上面对应)
configMap:
name: redis-config # ConfigMap 名称 (要和上面对应)
- 生成pod
kubectl create -f /root/redis/cm-redis.yaml
- 检查变量
kubectl exec -it redis-564f9dcf4b-v4ch5 -- redis-cli
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379>
Secret
概念
secret用于存储和管理一些敏感数据,比如密码、token、秘钥等。
secret有三种类型:
- Opaque:base64编码格式的secret,主要用于存储密码、秘钥等。数据可以通过base64-decode解码得到原始数据。
- Service Account:用于访问kubernetes api,是由kubernetes自动创建的,并会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount 目录中。
- Kubernetes.io/dockerconfigjson:用于存储私有docker registry的认证信息。
secret有三种加密方式:
- generic(通用的):保存密码数据等用它就可以;
- tls:保存私钥和证书;
- docker-registry:保存docker-registry的认证信息;
注意事项
- Opaque:可以解密,解密方式如:echo “MXFhekBXU1gzZWRjCg==” | base64 -d;可以加密,加密方式如:echo -n ‘wang123’ | base64
- 通过volume使用时可以在线更新,通过env不能在线更新。
创建Secret
命令创建Secret
- 创建Secret
kubectl create secret generic admin-sc --from-literal=password='1qaz!QAZ'
create:创建资源
secret:指定创建资源的类型
generic:指定secret使用的密码保存方式
admin-sc:指定secret的名称
–from-literal=:指定密码
命令指定文件创建Secret
- 创建key-value目录文件
mkdir /root/secret-password
echo "1qaz@WSX3edc$RFV" > /root/secret-password/admin.password
echo "Wang@ming_Qu123" > /root/secret-password/user.password
- 生成Secret
#将指定一个文件夹下所有配置,创建一个secret
kubectl create secret generic all-user --from-file=/root/secret-password/
#指定一个文件
kubectl create secret generic admin-user --from-file=/root/secret-password/admin.password
–from-file=指定某个文件或某个文件夹下的所有文件
yaml创建Secret
- Secret默认配置文件
- 编辑yaml配置文件
apiVersion: v1
#手动加密方式
data:
wang.password: d2FuZzEyMw==
ming.password: bWluZzEyMw==
qu.password: cXUxMjM=
# #自动加密方式
# stringData:
# username: administrator
# password: Yl5t2mt
kind: Secret
metadata:
name: admin-sec
namespace: default
type: Opaque
注意:data和stringData同时出现时,仅stringData生效,因为stringData的优先级更高。
- 生成Secret
kubectl create -f /root/secret-user.yaml
查看Secret
查看Secret名称
kubectl get secrets
查看Secret内容
kubectl describe secrets admin-sc
查看Secret的yaml
kubectl get secrets admin-sc -o yaml
Secret内容
Name: admin-sc
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 8 bytes
应用Secret
以变量的形式进行挂载
- 创建yaml
apiVersion: v1
kind: Secret
metadata:
name: secret-nginx
namespace: default
stringData:
username: wangmingqu
password: "1234567890"
type: Opaque
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
name: redis-dev
spec:
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
imagePullPolicy: IfNotPresent
env:
- name: UserName
valueFrom:
secretKeyRef:
key: username
name: secret-nginx
- name: Password
valueFrom:
secretKeyRef:
key: password
name: secret-nginx
- 生成pod
kubectl create -f /root/secret-password/redis.yaml
- 检查密码
kubectl exec -it redis-dev-5597b7c5c8-9kcr8 -- /bin/bash
echo $UserName
echo $Password
以volume形式挂载
- 创建yaml
kind: Secret
apiVersion: v1
metadata:
name: redis-secret # Secret 名称
namespace: default
labels:
app: redis
stringData:
username: wangmingqu
password: 12qwas!@QWAS
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
ports:
- containerPort: 6379
volumeMounts:
- name: secret # 挂载的目录名称
mountPath: /etc/redis/ #注意此挂载会覆盖整个目录
volumes:
- name: secret # 挂载的目录名称 (要和上面对应)
secret:
secretName: redis-secret # Secret 名称 (要和上面对应)
- 生成pod
kubectl create -f /root/redis/redis.yaml
- 检查密码
kubectl exec -it redis-595765bb79-v6rcr -- cat /etc/redis/password
kubectl exec -it redis-595765bb79-v6rcr -- cat /etc/redis/username