Kubernetes(十五)ConfigMap&Secret

  • A+
所属分类:Kubernetes

参考:

https://blog.csdn.net/weixin_36171533/article/details/82662408

给Pod传配置信息两种方式

1、把configmap关联到一个pod上,传递给pod内部的一个变量,注入的方式给容器传配置信息

2、配置卷,将配置文件映射到外面的路径

特点:

configmap在k8s上扮演了K8s的配置中心的功能

Pod启动时候将configmap打包为存储卷,挂载到配置文件的路径下

configmap是明文的信息

secret是密文传递的,功能和configmap一样的

配置容器化应用的方式

1、自定义命令行参数 

    command

    args

2、把配置文件直接add进镜像(不推荐)

3、环境变量(类似docker)

    1、Cloud native的应用创徐一般可以直接通过环境变量加载配置

    2、通过entrypoint脚本来预处理变量为配置文件中的配置信息

4、存储卷

pod资源环境变量的传递方式

一个configmap是一群pod的配置集合

保存的方式key,vallue

查看帮助:

kubectl create configmap --help

开始创建配置文件

[root@master volumes]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.node1.com
configmap/nginx-config created

查看创建配置文件信息

kubectl get cm
[root@master volumes]# kubectl get cm
NAME           DATA      AGE

查看配置的具体信息

[root@master volumes]# kubectl describe cm nginx-config
Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>
 
Data
====
nginx_port:   #key
----
80            #value
server_name:   #key
----
myapp.node1.com  #value  
Events:  <none>

这个configmap就可以被Pod启动的时候调用了

创建nginx配置文件

mkdir /root/tools/yaml/configmap
cd  /root/tools/yaml/configmap
[root@k8s-master01 configmap]# vim www.conf

server {
      server_name myapp.node01.com;
      listen 80;
      root /data/web/html;
}

可以指定key&value,用这种方法创建,key就是www,value是文件名

kubectl create configmap nginx-www --from-file=www=/root/tools/yaml/configmap/www.conf

或者不指定key,默认用文件名

kubectl create configmap nginx-www --from-file=/root/tools/yaml/configmap/www.conf
[root@master configmap]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         18h
nginx-www      1         8s

用yaml方式查看

[root@k8s-master01 configmap]# kubectl get cm nginx-www -o yaml
apiVersion: v1
data:
  www.conf: |
    server {
          server_name myapp.node01.com;
          listen 80;
          root /data/web/html;
    }
kind: ConfigMap
metadata:
  creationTimestamp: 2019-02-21T03:12:56Z
  name: nginx-www
  namespace: default
  resourceVersion: "243898"
  selfLink: /api/v1/namespaces/default/configmaps/nginx-www
  uid: 95c2054e-3586-11e9-83ef-000c293e2fef

describe查看

[root@k8s-master01 configmap]# kubectl describe cm nginx-www
Name:         nginx-www
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
www.conf:
----
server {
      server_name myapp.node01.com;
      listen 80;
      root /data/web/html;
}

Events:  <none>

创建pod demo yaml文件

#把nginx-config 这个configmap两个Key,定义成NGINX_SERVER_PORT和 NGINX_SERVER_NAME环境变量

[root@k8s-master01 configmap]# vim pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-1
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    node1/create-by: "cluster admin"  #备注
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    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

创建查看pod

[root@k8s-master01 configmap]# kubectl create -f pod-configmap.yaml 
[root@k8s-master01 configmap]# kubectl get pod

进入容器中查看是否在环境变量中生成成功:

kubectl exec -it pod-cm-1 /bin/sh
/ # printenv|grep NGINX_SERVER_PORT
NGINX_SERVER_PORT=80
/ # printenv|grep NGINX_SERVER_NAME
NGINX_SERVER_NAME=myapp.node1.com
/ # printenv|grep HOSTNAME
HOSTNAME=pod-cm-1

通过上面已经说明,环境信息已经注入

如果我更改掉配置,看看是否会生效

[root@k8s-master01 configmap]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         4h
nginx-www      1         4h

#修改端口为8080

[root@k8s-master01 configmap]# kubectl edit cm nginx-config
[root@k8s-master01 configmap]# kubectl describe cm nginx-config
Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx_port:
----
8080
server_name:
----
myapp.node1.com
Events:  <none>

再次查看系统变量发现没有改变,端口还是80

[root@k8s-master01 configmap]# kubectl exec -it pod-cm-1 /bin/sh
/ # printenv|grep NGINX_SERVER_PORT
NGINX_SERVER_PORT=80

也就是说,当我们使用系统变量时,只在系统的启动时才会有效

存储卷挂载部分内容

kubectl explain pods.spec.volumes.configMap.items

secret的使用方式

[root@k8s-master01 ~]# kubectl create secret generic mysql-root-password --from-literal=password=MyP@ss123
[root@k8s-master01 ~]# kubectl get secret
NAME                  TYPE                                  DATA      AGE
default-token-h5s4g   kubernetes.io/service-account-token   3         30d
mysql-root-password   Opaque
[root@k8s-master01 ~]# kubectl describe secret mysql-root-password
Name:         mysql-root-password
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  9 bytes
[root@k8s-master01 ~]# kubectl get secret mysql-root-password
NAME                  TYPE      DATA      AGE
mysql-root-password   Opaque    1         1m
[root@k8s-master01 ~]# kubectl get secret mysql-root-password -o yaml
apiVersion: v1
data:
  password: TXlQQHNzMTIz
kind: Secret
metadata:
  creationTimestamp: 2019-02-21T10:20:22Z
  name: mysql-root-password
  namespace: default
  resourceVersion: "276342"
  selfLink: /api/v1/namespaces/default/secrets/mysql-root-password
  uid: 4bb7598a-35c2-11e9-83ef-000c293e2fef
type: Opaque

解码

[root@k8s-master01 ~]# echo TXlQQHNzMTIz |base64 -d
MyP@ss123

通过环境量获取

[root@k8s-master01 configmap]# vim pod-secret-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-secret-1
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    zpx.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-root-password
          key: password

创建并查看

[root@k8s-master01 configmap]# kubectl apply -f pod-secret-1.yaml
pod "pod-secret-1" created
[root@k8s-master01 configmap]# kubectl get pods

进入容器,可以获取变量

[root@k8s-master01 configmap]# kubectl exec pod-secret-1 -- printenv|grep MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=MyP@ss123

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: