特殊存储卷
特殊存储卷:ConfigMap+Secret
可用于生成环境变量传递给pod,或者直接以存储卷方式让pod获取配置文件
修改容器中应用配置的方式:
- 自定义命令行参数: args: []
- 把配置文件放入容器内
- 环境变量: 应用本身支持环境变量
- 存储卷
ConfigMap:
属于另类的存储卷,用于存放pod的配置文件等,在k8s中起配置中心的作用
支持动态修改配置
configMAP是键值对的方式存数据,并且与pvc一样,属于命名空间的资源
configmap的2种工作方式:
- 以pod方式运行: 为所有pod提供配置中心,以变量的方式,注入到pod,替换pod中的环境变量,实现配置修改
- 以存储卷方式: 当做存储卷挂载,pod启动时直接挂载存储卷,加载配置
配置语法:
以存储卷方式:
kubectl explain cm
kubectl explain pod.spec.volumes
kubectl explain pod.spec.containers.volumeMounts
apiVersion
kind: ConfigMap
metadata
binaryData #二进制数据格式,二选一
data #数据,键值对,加上 "|"后,可换行写
immutable: 布尔值 #数据是否只读,true为只读,只能修改元数据;false为随时修改,默认为空,也就是false
---
pod.spec:
volumes:
- name: 名称
configMap:
#name和items的区别是,前者的cm被挂载后的文件是原名,后者挂载后的文件名是修改过的
- name: cm名称 #直接引用configmap
items: #引用configmap,但对引用的文件重命名
- key: cm名称
path: 重命名文件名称
defaultMode: 文件权限
containers:
volumeMounts:
- name: 卷名称
mountPath: 挂载路径
以环境变量方式:
kubectl explain pod.spec.containers.env
pod.spec.containers.env:
name #变量名
value #值
valueFrom #从其他地方获取变量值
configMapKeyRef #从configmap获取
key #cm的key
name
optional
fieldRef #从同一个yml文件中取值,如metadata.name
resourceFieldRef #资源类
secretKeyRef #从secret中获取
案例:
例1: 命令行创建configmap
kubectl create configmap xxx --from-literal=t1=123 --from-literal=t2=qwe
kubectl describe cm xxx
例2: 把文件内容当做value
vim ngx-www.conf
server {
server_name www.hj.com;
listen 80;
root /data/web/;
}
kubectl create configmap ngx-www --from-file=./ngx-www.conf
kubectl describe cm ngx-www

例3: yml文件创建
apiVersion: v1
kind: ConfigMap
metadata:
name: ngx-conf
data:
ngx-conf: |
server {
listen 80;
index index.html;
location / {*/
root /data/web;
}
}
例4: 使用configmap做环境变量
1)准备cm的内容
vim ngx-www.conf
server {
server_name www.hj.com;
listen 80;
root /data/web/;
}
kubectl create configmap ngx-www --from-file=./ngx-www.conf
2)创建pod,调用cm的变量
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-cm
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: ngx-cm
template:
metadata:
labels:
app: ngx-cm
spec:
containers:
- name: alpine
image: alpine
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 90000"]
env:
- name: WWW_CONF
valueFrom:
configMapKeyRef:
name: ngx-www
key: ngx-www.conf
存储卷方式1:
1)使用上面创建的ngx-www的cm
2)创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-cm-1
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: ngx-cm-1
template:
metadata:
labels:
app: ngx-cm-1
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: ngx-conf
mountPath: /etc/nginx/conf.d/
volumes:
- name: ngx-conf
configMap:
- name: ngx-www
3)测试访问
kubectl get po
kubectl exec -it pod-cm2 bash
cat /etc/nginx/conf.d/ngx-www.conf
mkdir -p /data/web/
echo `hostname -i` >> /data/web/index.html
curl 127.0.0.1
4)修改ngx-www的cm,再次测试
kubectl edit cm ngx-www
#修改端口为8080,等待一段时间,让apiserver同步配置给pod
kubectl exec -it pod-cm2 bash
cat /etc/nginx/conf.d/ngx-www.conf
nginx -s reload
curl 127.0.0.1:8080
存储卷方式2:
apiVersion: v1
kind: ConfigMap
metadata:
name: ngx-conf
data:
ngx-conf: |
server {
listen 80;
server_name xx;
index index.html;
root /data/web;
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-cm
spec:
selector:
matchLabels:
app: ngx-cm
template:
metadata:
labels:
app: ngx-cm
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: web
mountPath: /data/web
- name: conf
mountPath: /etc/nginx/conf.d/
volumes:
- name: web
nfs:
server: 2.2.2.10
path: /data/nfs
readOnly: false
- name: conf
configMap:
name: ngx-conf
items:
- key: ngx-conf
path: xx.conf
---
apiVersion: v1
kind: Service
metadata:
name: ngx-svc
spec:
selector:
app: ngx-cm
type: NodePort
ports:
- name: http
targetPort: 80
nodePort: 30010
port: 80
Secret:
属于另类的存储卷,对内容进行base64编码转换,并没有实际加密
功能与configmap一样,但用于保存需要加密的配置,数据库的密码等
配置语法:
kubectl explain secret
apiVersion: v1
data:
user-key: UVZGRGNEUTBTbXRVT0RWUlJYaEJRWEZaV0RJMGMwNTFVV1ozTVU5a1Fqa3daR2hOYVdjOVBRbz0=
kind: Secret
metadata:
name: k8s-ceph-user
namespace: default
type #指定类型
#Opaque 用户定义的任意数据
#kubernetes.io/service-account-token s令牌
#kubernetes.io/dockercfg ~/.dockercfg 文件的序列化形式
#kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式
#kubernetes.io/basic-auth 用于基本身份认证的凭据
#kubernetes.io/ssh-auth 用于SSH身份认证的凭据
#kubernetes.io/tls 用于TLS客户端或者服务器端的数据
#bootstrap.kubernetes.io/token 启动引导令牌数据
#kubernetes.io/rbd ceph的用户key信息村
命令:
kubectl create secret -h
docker-registry #pod.spec中的imagePullSecrets镜像仓库的认证信息,需要用此保存
tls #用于证书、https等
generic #除了2个以外都是用此保存
资源对象:
使用与configmap一模一样
kubectl explain pod.spec.volumes.secret
pod.spec:
imagePullSecrets: #从镜像仓库拉取镜像需要密码时,在此处可引用提前生成的secret
- name: 密钥名
案例:
例: 创建一个被base64转码的mysql密码secret,并在pod中使用
1) 创建secret
kubectl create secret generic mysql-root-pw --from-literal=passwd=123456
#对转码后的mysql密码进行解码
kubectl get secrets mysql-root-pw -o yaml|egrep -w "^\ +passwd"
echo MTIzNDU2 |base64 -d
2)使用secret
apiVersion: apps/v1
kind: Deployment
metadata:
name: alp-se
spec:
selector:
matchLabels:
app: alp-se
template:
metadata:
labels:
app: alp-se
spec:
containers:
- name: alpine
image: alpine
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 90000"]
env:
- name: MYSQL_PW
valueFrom:
secretKeyRef:
name: mysql-root-pw
key: passwd

浙公网安备 33010602011771号