k8s学习笔记-ConfigMap和Secret

配置容器化应用的方式:
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             <none>                              <none>
kubectl exec -it pod-cm3 --  cat /data/web/html/index.html
<h1> config-map<h1>
如果没有这个文件和目录就进Pod里面创建
[root@k8s-master configmap]# curl -H "host:myapp:doudou.com" http://10.244.1.220/
<h1> config-map<h1>
也可以修改端口号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/
<h1> config-map<h1>
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

 

 

 

 

 

 

 

 

 

 


 

posted @ 2019-04-29 10:38  屌丝的IT  阅读(571)  评论(0编辑  收藏  举报