配置容器化应用的方式:
1.自定义命令行参数;
args: []
2.把配置文件直接配进镜像
3.环境变量
1.cloud Native的应用程序一般可直接通过环境变量加载配置
2.通过entrypoint脚本来预处理变量为配置文件中的配置信息
kubectl explain pods.spec.containers.env
4.存储卷
ConfMap
应用程序部署的最佳实践就是配置信息和程序进行分离。这样可以使应用程序被复用,通过不同的配置也可以实现更灵活的功能。
confMap 将配置文件和镜像解耦,ConfigMap跟Secrets类似,但是ConfigMap可以更方便的处理不包含敏感信息的字符串。
ConfigMap的用处:
1. 生成为容器内的环境变量
2. 设置容器启动的命令参数
3. volume形式挂载成容器内的文件或目录
kubectl explain cm
kubectl explain cm.data
kubectl create configmap --help
[root@k8s-master volumes]# kubectl create configmap nginx-config --from-literal=nginx_port=8080 --from-literal=server_name=myapp.doudou.com
configmap/nginx-config created
[root@k8s-master configmap]# cat www.conf
server {
server_name myapp.doudou.com;
listen 80;
root /data/web/html/;
}
通过文件增加cm
[root@k8s-master volumes]#kubectl create configmap nginx-www --from-file=./www.conf
[root@k8s-master volumes]# kubectl get cm
NAME DATA AGE
nginx-config 2 12s
nginx-www 1 3s
[root@k8s-master volumes]# kubectl describe cm nginx-config
[root@k8s-master configmap]# kubectl describe cm nginx-www
[root@k8s-master configmap]# kubectl get cm nginx-www -o yaml
用环境变量加载:
vim pod-cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
env:
- name: NGINX_SERVER_PORT
valueFrom:
configMapKeyRef:
name: nginx-config
key: nginx_port
- name: NGINX_SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: server_name
kubectl apply -f pod-cm.yaml
[root@k8s-master configmap]# kubectl exec -it pod-cm -- printenv|egrep NGINX_SERVER
NGINX_SERVER_PORT=8080
NGINX_SERVER_NAME=myapp.doudou.com
vim pod-cm2.yaml 通过卷挂载的方式
apiVersion: v1
kind: Pod
metadata:
name: pod-cm2
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/config.d
readOnly: true
volumes:
- name: nginxconf
configMap:
name: nginx-config
[root@k8s-master configmap]# kubectl exec -it pod-cm2 -- ls /etc/nginx/config.d/
nginx_port server_name
[root@k8s-master configmap]# kubectl exec -it pod-cm2 -- cat /etc/nginx/config.d/nginx_port
8080
[root@k8s-master configmap]# kubectl exec -it pod-cm2 -- cat /etc/nginx/config.d/server_name
myapp.doudou.com
可以通过修改cm来改变加载的文件
kubectl edit cm nginx-config
configmap/nginx-config edited
等待一会就变更,不能立即生效,需要同步时间,这里我吧端口修改成8888
[root@k8s-maskubectl exec -it pod-cm2 -- cat /etc/nginx/config.d/nginx_port
8888
直接挂载文件类型的cm,比如上面定义的nginx-www 就是加载www.conf
apiVersion: v1
kind: Pod
metadata:
name: pod-cm3
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: nginxconf
configMap:
name: nginx-www
kubectl apply -f pod-cm3.yaml
kubectl exec -it pod-cm3 -- cat /etc/nginx/conf.d/www.conf
server {
server_name myapp.doudou.com;
listen 80;
root /data/web/html/;
}
[root@k8s-master configmap]# kubectl get pods pod-cm3 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-cm3 1/1 Running 0 125m 10.244.1.220 k8s-node2
kubectl exec -it pod-cm3 -- cat /data/web/html/index.html config-map
如果没有这个文件和目录就进Pod里面创建
[root@k8s-master configmap]# curl -H "host:myapp:doudou.com" http://10.244.1.220/ config-map
也可以修改端口号8080
kubectl edit cm nginx-www
进入容器
[root@k8s-master configmap]# kubectl exec -it pod-cm3 -- /bin/sh
/# nginx -s reload
[root@k8s-master configmap]# curl -H "host:myapp:doudou.com" http://10.244.1.220:8080/ config-map
kubectl explain pods.spec.volumes.configMap.items
当 ConfigMap 以数据卷的形式挂载进Pod的时,这时更 新ConfigMap(或删掉重建ConfigMap),Pod内挂载的配置信息会热更新。
这时可以增加一些监测配置文件变更的脚本,然后reload对应服务
Secret
Secret是用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
用户可以创建自己的secret,系统也会有自己的secret。
Pod需要先引用才能使用某个secret,Pod有2种方式来使用secret:作为volume的一个域被一个或多个容器挂载;在拉取镜像的时候被kubelet引用。
內建的Secrets
由ServiceAccount创建的API证书附加的秘钥
k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信
创建自己的Secret
使用kubectl create secret命令创建Secret
[root@k8s-master configmap]# kubectl create secret --help
docker-registry 创建一个给 Docker registry 使用的 secret
generic 从本地 file, directory 或者 literal value 创建一个 secret
tls 创建一个 TLS secret
[root@k8s-master configmap]# kubectl create secret generic mysql-root-password --from-literal=password=Myp@ss123
secret/mysql-root-password created
[root@k8s-master configmap]# kubectl get secret
NAME TYPE DATA AGE
default-token-zzm2j kubernetes.io/service-account-token 3 43d
mysql-root-password Opaque 1 16s
tomcat-ingress-secret kubernetes.io/tls 2 24h
[root@k8s-master configmap]# kubectl describe secret mysql-root-password
[root@k8s-master configmap]# kubectl get secret mysql-root-password -o yaml
data:
password: TXlwQHNzMTIz
kind: Secret
echo TXlwQHNzMTIz|base64 -d
Myp@ss123
vim pod-secret-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-1
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-root-password
key: password
[root@k8s-master configmap]# kubectl exec -it pod-secret-1 -- printenv |egrep MYSQL
MYSQL_ROOT_PASSWORD=Myp@ss123
挂载的模式,Pod
volumes:
- name: default-token-zzm2j
secret:
defaultMode: 420
secretName: default-token-zzm2j
就想我们之前做的tamcat tls
kubectl get ingress -o yaml
tls:
- hosts:
- tomcat.doudou.com
secretName: tomcat-ingress-secret
[root@k8s-master ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-zzm2j kubernetes.io/service-account-token 3 43d
mysql-root-password Opaque 1 169m
tomcat-ingress-secret kubernetes.io/tls 2 27h