ConfigMap
ConfigMap 是 Kubernetes 中用于存储非机密的配置数据的对象,可以将配置数据分离于容器映像,从而实现更灵活的配置管理。ConfigMap 允许你将配置信息以键值对的形式存储,并可以在 Pod 中以环境变量、命令行参数或挂载文件的方式使用。
创建 ConfigMap
- 通过命令行创建
你可以使用 kubectl create configmap 命令直接从文件或键值对创建 ConfigMap。例如:
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
或者从文件创建:
kubectl create configmap my-config --from-file=path/to/config-file
- 通过 YAML 文件创建
你也可以通过 YAML 文件定义 ConfigMap,然后使用 kubectl apply 创建。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
# 定义单行数据
key1: value1
key2: value2
# 定义多行数据
my.cfg: |
datadir: "/var/lib/mysql"
basedir: "/usr/share/mysql"
socket: "/tmp/mysql.sock"
使用以下命令应用配置:
kubectl apply -f configmap.yaml
查看 ConfigMap
- 查看所有 ConfigMap
使用以下命令列出当前命名空间中的所有 ConfigMap:
kubectl get configmaps
- 查看特定 ConfigMap
要查看特定 ConfigMap 的详细信息,可以使用以下命令:
kubectl describe configmap <configmap-name>
例:
kubectl describe configmap my-config
- 查看 ConfigMap 的 YAML 格式
如果你想查看 ConfigMap 的 YAML 配置,可以使用以下命令:
这将以 YAML 格式输出 ConfigMap 的详细信息,包括数据和元数据。
kubectl get configmap <configmap-name> -o yaml
使用 ConfigMap
- 作为环境变量
pod基于env环境变量引入cm资源
你可以在 Pod 的容器中使用 ConfigMap 中的键作为环境变量:
configMapKeyRef字段
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
env:
- name: MY_CONFIG_KEY
valueFrom:
# 指定引用的configMap资源
configMapKeyRef:
# 指定configMap的名称
name: my-config
# 指定configMap的KEY
key: key1
- 作为命令行参数
在启动容器时,可以将 ConfigMap 的值作为命令行参数传递给容器:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
args: ["--config", "$(MY_CONFIG_KEY)"]
env:
- name: MY_CONFIG_KEY
valueFrom:
configMapKeyRef:
name: my-config
key: key1
- 作为挂载文件
ConfigMap 也可以作为卷挂载到 Pod 的文件系统中:
挂载文件夹:
该方式挂载后,ConfigMap 中的每个键都会在 /etc/config 下生成一个文件,其内容为对应的值。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: my-config
或者挂载为文件
apiVersion: v1
kind: Pod
metadata:
name: linux85-volume-cm-008
spec:
volumes:
- name: data
# 指定存储卷的类型为configMap
configMap:
# 指定configMap的名称
name: linux85-config
# 引用configMap的key
items:
# 指定key的名称
- key: student.info
# 可以暂时理解为指定文件的名称
path: linux85-student.info
containers:
- name: web
image: nginx:1.20.1-alpine
command: ["tail","-f","/etc/hosts"]
volumeMounts:
- name: data
mountPath: /etc/nginx/nginx.conf
# 当subPath的值和configMap.items.path相同时,mountPath的挂载点是一个文件而非目录!
subPath: linux85-student.info
volumes:
定义一个名为 data 的卷,类型为 ConfigMap。
configMap:
name: 指定引用的 ConfigMap 名称 linux85-config。
items: 列出要从 ConfigMap 中引用的键。
key: student.info,这是 ConfigMap 中的一个键。
path: linux85-student.info,指定在挂载时生成的文件名
指定将名为 data 的卷挂载到容器内的路径 /etc/nginx/nginx.conf。
subPath: 使用 subPath 指定挂载的具体文件名 linux85-student.info,这意味着挂载的是单个文件,而不是整个目录。
示例:
apiVersion: v1
kind: Pod
metadata:
name: linux85-games-ketanglianxi-002
spec:
# hostNetwork: true
nodeName: k8s232.com
volumes:
- name: data
configMap:
name: linux85-games
items:
- key: nginx.conf
path: nginx.conf
containers:
- name: game
image: games:v0.1
volumeMounts:
- name: data
mountPath: /usr/local/nginx/conf/nginx.conf
subPath: nginx.conf
# 指定容器的端口映射相关字段
ports:
# 指定容器的端口号
- containerPort: 80
# 绑定主机的IP地址
hostIP: "0.0.0.0"
# 指定绑定的端口号
hostPort: 88
# 给该端口起一个别名,要求唯一
name: game
# 指定容器的协议
protocol: TCP
---
apiVersion: v1
kind: ConfigMap
metadata:
name: linux85-games
data:
nginx.conf: |
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root /usr/local/nginx/html/bird/;
server_name game01.com;
}
server {
listen 80;
root /usr/local/nginx/html/pinshu/;
server_name game03.com;
}
server {
listen 80;
root /usr/local/nginx/html/tanke/;
server_name game05.com;
}
server {
listen 80;
root /usr/local/nginx/html/pingtai/;
server_name game02.com;
}
server {
listen 80;
root /usr/local/nginx/html/chengbao/;
server_name game04.com;
}
}
secret
在 Kubernetes 中,Secret 是一种用于存储敏感信息的对象,如密码、OAuth 令牌和 SSH 密钥等。使用 Secret 可以安全地管理敏感数据,而无需将这些数据直接暴露在 Pod 定义中。
创建 Secret
- 通过命令行创建
你可以使用 kubectl create secret 命令创建 Secret。例如:
kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypassword
或者从文件创建:
kubectl create secret generic my-secret --from-file=path/to/secret-file
- 通过 YAML 文件创建
你也可以通过 YAML 文件定义 Secret,然后使用 kubectl apply 创建。例如:
#先加密
username | base64
bXl1c2Vy
password | base64
bXlwYXNzd29yZA==
#然后编写yaml 文件
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: bXl1c2Vy # base64 编码的值
password: bXlwYXNzd29yZA== # base64 编码的值
#使用以下命令应用配置:
kubectl apply -f secret.yaml
查看 Secret
#查看所有 Secrets
kubectl get secrets
#查看特定 Secret 的详细信息
kubectl describe secret <secret-name>
#查看 Secret 的具体内容
kubectl get secret <secret-name> -o yaml
#如果你想查看某个键的具体内容,可以使用以下命令:
kubectl get secret <secret-name> -o jsonpath="{.data.<key-name>}" | base64 --decode
#示例
#假设你有一个名为 my-secret 的 Secret,查看内容的命令可以是:
kubectl get secret my-secret -o jsonpath="{.data.password}" | base64 --decode
使用 Secret
Secret 可以通过多种方式在 Pod 中使用:
其实和上面的configmap类似
- 作为环境变量
可以将 Secret 的键作为环境变量注入到容器中:
apiVersion: v1
kind: Pod
metadata:
name: linux85-game-secret-001
spec:
containers:
- name: game
image: games:v0.7
env:
- name: LINUX85_USERNAME
valueFrom:
# 指定引用的secret资源
secretKeyRef:
# 指定secret的名称
name: es-https
# 指定secret的KEY
key: username
- 作为挂载文件
Secret 也可以作为卷挂载到 Pod 的文件系统中:
apiVersion: v1
kind: Pod
metadata:
name: linux85-volume-secret-003
spec:
volumes:
- name: data
# 指定存储卷的类型为secret
secret:
# 指定secret的名称
secretName: es-https
items:
- key: username
path: username.info
- key: password
path: password.info
- key: hostip
path: hostip.info
containers:
- name: web
image: nginx:1.20.1-alpine
command: ["tail","-f","/etc/hosts"]
volumeMounts:
- name: data
# mountPath: /oldboyedu-data
mountPath: /etc/nginx/nginx.conf
subPath: username.info
- name: data
mountPath: /etc/nginx/password.conf
subPath: password.info
- name: data
mountPath: /etc/nginx/hostip.conf
subPath: hostip.info