configmap:实现配置信息和镜像解耦,实现方式为,将配置文件放到configmap对象中,然后在pod中通过volume挂载的方式实现关联,从而实现导入配置的目的;
使用场景:
通过configmap给pod定义全局环境变量;
通过configmap给pod传递命令参数,如mysql的登录名与密码,可以通过configmap传递;
通过configmap给pod中的容器服务提供配置文件,配置文件以挂载到容器的形式使用;
注意事项:
configmap需要在pod使用之前创建;
pod只能挂载同一个namespace中的configmap;
通常用于非安全加密的配置场景;
configmap通常是小于1M的配置场景;
# configmap测试;
apiVersion:v1
kind:ConfigMap
metadata:
name:nginx-config #此处没有指定namespace,表示创建在default空间内,如果调用configmap的pod在其他空间,则需要在metadata段中声明namespace;
data:
default:| #在此示例中default段中的内容是,nginx配置文件的一段,也就是说,之后运行nginx服务的pod会通过调用名为nginx-config这个ConfigMap资源来实现配置解耦;
server {
listen 80;
server_namewww.mysite.com;
index index.html index.php index.htm;
location / {
root /data/nginx/html;
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
}
}
}
---
#apiVersion: extensions/v1beta1
apiVersion:apps/v1
kind:Deployment
metadata:
name:nginx-deployment
spec:
replicas:1
selector:
matchLabels:
app:ng-deploy-80
template:
metadata:
labels:
app:ng-deploy-80
spec:
containers:
-name:ng-deploy-80
image:nginx:1.20.0
ports:
-containerPort:80
volumeMounts: #因为configmap是通过挂载的方式被pod调用,那么必然需要声明其挂载点位置;
#- mountPath: /data/nginx/html
# name: nginx-static-dir
-name:nginx-config #表示要挂载到容器内的什么位置;
mountPath: /etc/nginx/conf.d ##这个挂载位置的声明名称,这个名称通常是用来给yaml其他功能段做调用的;
volumes: #这里描述了要挂载的内容信息;
#- name: nginx-static-dir
# hostPath:
# path: /data/nginx
-name:nginx-config #要挂载内容的名称;
configMap: #说明挂载内容的类型是configmap;
name:nginx-config #configmap的名称;
items: #此段中声明了挂载哪个configmap;
-key:default #key的值引用的是在编写configmap资源对象时,所创建的default段中内容;
path:mysite.conf #表示这段内容要以mysite.conf文件的格式挂载,挂载位置就是volumeMounts中声明的mountPath: /etc/nginx/conf.d;
---
apiVersion:v1
kind:Service
metadata:
name:ng-deploy-80
spec:
ports:
-name:http
port:81
targetPort:80
nodePort:30019
protocol:TCP
type:NodePort
selector:
app:ng-deploy-80
Secret简介:
其功能类似于configmap,用来给pod提供额外的配置信息。但是Secret是一种包含少量敏感信息的对象,如密码,令牌,密钥等;
Secret的名称必须是合法的DNS子域名;
每个Secret的大小最多为1MiB,主要是为了确保用户创建了过大的Secret导致API服务和kubernetes的内存消耗。不过创建过多小文件也会导致内存消耗,所以可以通过使用资源配额来控制每个namespace中的Secret数量;
在通过yaml文件创建Secret时,可以设置data和stringData字段,两个字段都是可选的。data字段中的所有字符必须是base64编码的字符串,如果不希望执行这种编码字符串也可以选择使用stringData字段,stringData可以使用任何非加密的字符串作为其值,而被调用;
pod可以使用三种方式来调用Secret;
1.作为挂载到一个或多个pod卷中的crt文件或key文件;
2.作为容器的环境变量;
3.由kubelet在为pod拉取镜像时使用(与镜像仓库的认证);
Secret的类型:kubernetes支持多种的Secret类型,不同场景下对应不同Secret,不同类型Secret对应的配置参数也不同;
# Secret测试yaml;
apiVersion:v1
kind:Secret
metadata:
name:mysecret-data
namespace:myserver
type:Opaque
data: #字段中内容必须为base64编码加密的字符串;
user:YWRtaW4K
password:MTIzNDU2Cg==
age:MTgK #非base64加密的会报错
apiVersion:v1
kind:Secret
metadata:
name:mysecret-stringdata
namespace:myserver
type:Opaque
stringData: #非加密要求字段;
user:'admin'
password:'123456'
# secret,pod挂载测试;
apiVersion:apps/v1
kind:Deployment
metadata:
name:myserver-myapp-app1-deployment
namespace:myserver
spec:
replicas:1
selector:
matchLabels:
app:myserver-myapp-app1
template:
metadata:
labels:
app:myserver-myapp-app1
spec:
containers:
-name:myserver-myapp-app1
image:tomcat:7.0.94-alpine
ports:
-containerPort:8080
volumeMounts:
-mountPath:/data/myserver/auth
name:myserver-auth-secret
volumes:
-name:myserver-auth-secret
secret:
secretName:mysecret-data #挂载指定的secret(创建的secret类型yaml的名称),挂载后会将base64解密为明文;
---
apiVersion:v1
kind:Service
metadata:
name:myserver-myapp-app1
namespace:myserver
spec:
ports:
-name:http
port:8080
targetPort:8080
nodePort:30018
protocol:TCP
type:NodePort
selector:
app:myserver-myapp-app1
# 演示如何使用nginx,pod挂载secret类型的证书文件;
kubectl create secret tls myserver-tls-key --cert=./server.crt --key=./server.key -n myserver # 通过已经生成好的crt和key文件,使用kubectl命令直接创建一个名字为myserver-tls-key,资源对象类型为secret,secret类型为tls的pod;
apiVersion:v1
kind:ConfigMap
metadata:
name:nginx-config
namespace:myserver
data:
default:|
server {
listen 80;
server_namewww.mysite.com;
listen 443 ssl;
ssl_certificate /etc/nginx/conf.d/certs/tls.crt;
ssl_certificate_key /etc/nginx/conf.d/certs/tls.key;
location / {
root /usr/share/nginx/html;
index index.html;
if ($scheme = http ){ # 未加条件判断,会导致死循环
rewrite /https://www.mysite.compermanent;
}
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
}
}
}
---
#apiVersion: extensions/v1beta1
apiVersion:apps/v1
kind:Deployment
metadata:
name:myserver-myapp-frontend-deployment
namespace:myserver
spec:
replicas:1
selector:
matchLabels:
app:myserver-myapp-frontend
template:
metadata:
labels:
app:myserver-myapp-frontend
spec:
containers:
-name:myserver-myapp-frontend
image:nginx:1.20.2-alpine
ports:
-containerPort:80
volumeMounts:
-name:nginx-config
mountPath: /etc/nginx/conf.d/myserver
-name:myserver-tls-key
mountPath: /etc/nginx/conf.d/certs
volumes:
-name:nginx-config
configMap:
name:nginx-config
items:
-key:default
path:mysite.conf
-name:myserver-tls-key
secret:
secretName:myserver-tls-key
---
apiVersion:v1
kind:Service
metadata:
name:myserver-myapp-frontend
namespace:myserver
spec:
type:NodePort
ports:
-name:http
port:80
targetPort:80
nodePort:30020
protocol:TCP
-name:htts
port:443
targetPort:443
nodePort:30019
protocol:TCP
selector:
app:myserver-myapp-frontend
实验:如何通过secret tls类型验证登录私有镜像仓库;
首先创建secret
方法1:通过命令创建,需要明文填写账号密码;
kubectl create secret docker-registry keyName \ #创建一个docker-registry类型的secret资源对象,名称为keyName的pod;
--docker-server=registry.myserver.com \ #docker镜像仓库地址;
--docker-username=USER \ #登录名;
--docker-password=PASSWORD #密码;
方法2:通过docker认证文件创建;
# docker login --username=root@aliyun.comregistry.cn-qingdao.aliyuncs.com #先使用docker login登录镜像仓库站,目的是在本机生成验证文件,注意此处只是本机登录,创建的node无法登录;
# kubectl create secret generic aliyun-registy-images-pull-key \
--from-file=.dockerconfigjson=/root/.docker/config.json \ #将生成的验证信息导入到secret中;
--type=kubernetes.io/dockerconfigjson \ #指定创建的secret类型为kubernetes.io/dockerconfigjson;
-n myserver #指定namespace;
# 测试使用secert dockerconfigjson类型验证,连接镜像仓库;
#apiVersion: extensions/v1beta1
apiVersion:apps/v1
kind:Deployment
metadata:
name:myserver-myapp-frontend-deployment
namespace:myserver
spec:
replicas:1
selector:
matchLabels:
app:myserver-myapp-frontend
template:
metadata:
labels:
app:myserver-myapp-frontend
spec:
containers:
-name:myserver-myapp-frontend
image:registry.cn-qingdao.aliyuncs.com/zhangshijie/nginx:1.16.1-alpine-perl #此处为要拉取的镜像地址;
ports:
-containerPort:80
imagePullSecrets: #用来声明引用secret来作为镜像拉取验证方式;
-name:aliyun-registry-image-pull-key #引用的secret名称,之前创建的;
---
apiVersion:v1
kind:Service
metadata:
name:myserver-myapp-frontend
namespace:myserver
spec:
ports:
-name:http
port:80
targetPort:80
nodePort:30022
protocol:TCP
type:NodePort
selector:
app:myserver-myapp-frontend