特殊存储卷

特殊存储卷:ConfigMap+Secret

可用于生成环境变量传递给pod,或者直接以存储卷方式让pod获取配置文件

修改容器中应用配置的方式:

  1. 自定义命令行参数: args: []
  2. 把配置文件放入容器内
  3. 环境变量: 应用本身支持环境变量
  4. 存储卷

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

image-20220802115234703

例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
posted @ 2022-09-02 15:57  suyanhj  阅读(119)  评论(0)    收藏  举报