KUBERNETES-1-11-Configmap与Secret

本文深入探讨了Kubernetes中ConfigMap与Secret资源的创建、应用及动态更新方法,包括通过命令行创建ConfigMap,从文件或字面量定义配置,以及如何将ConfigMap作为环境变量或挂载卷使用。同时,介绍了Secret资源的创建和在Pod中引用的流程。

1.kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.example.com这里之间使用命令创建带有两个KEY的configmap资源。kubectl get cm获取configmap资源信息。kubectl describe cm nginx-config查看configmap资源的详细信息。

[root@master ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.example.com
configmap/nginx-config created
[root@master ~]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         13s

[root@master ~]# kubectl describe cm nginx-config
Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx_port:
----
80
server_name:
----
myapp.example.com
Events:  <none>
 

2.vim www.conf创建文件。kubectl create configmap nginx-www --from-file=./www.conf 创建configmap资源,这里www.conf作为KEY,www.conf的内容作为VALUE。kubectl get cm nginx-www -o yaml可以将configmap资源信息以yaml格式输出。

[root@master ~]# cd manifests/
[root@master manifests]# mkdir configmap
[root@master manifests]# cd configmap/
[root@master configmap]# vim www.conf
[root@master configmap]# cat www.conf
server {
        server_name myapp.example.com;
        listen 80;
        root /data/web/html/;
}
[root@master configmap]# kubectl create configmap nginx-www --from-file=./www.conf 
configmap/nginx-www created
[root@master configmap]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         8m
nginx-www      1         47s
[root@master configmap]# kubectl get cm nginx-www -o yaml
apiVersion: v1
data:
  www.conf: |
    server {
            server_name myapp.example.com;
            listen 80;
            root /data/web/html/;
    }
kind: ConfigMap
metadata:
  creationTimestamp: 2018-12-14T10:27:03Z
  name: nginx-www
  namespace: default
  resourceVersion: "48346"
  selfLink: /api/v1/namespaces/default/configmaps/nginx-www
  uid: cc7d9735-ff8a-11e8-b535-000c290c9b7a
 

3.vim pod-configmap.yaml创建configmap资源文件,valueFrom:指明引用的文件name: 和键key:来获取传递的值。kubectl apply -f pod-configmap.yaml 声明资源。kubectl exec -it pod-cm-1 -- /bin/sh进入pod查看环境变量。kubectl edit cm nginx-config在外部修改资源参数。kubectl describe cm nginx-config查看资源详细信息,资源参数已经修改(不等于pod生效)。printenv | grep NGINX_SERVER在pod中查看环境变量信息,发现并没有被修改。这是因为使用环境变量的方式,只在启动的时候有效,不是实时更新的。

[root@master configmap]# cp ../pod-demo.yaml ./
[root@master configmap]# mv pod-demo.yaml pod-configmap.yaml 
[root@master configmap]# vim pod-configmap.yaml
[root@master configmap]# cat pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-1
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    example.com/created-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
[root@master configmap]# kubectl apply -f pod-configmap.yaml 
pod/pod-cm-1 created
[root@master configmap]# kubectl get pods
NAME       READY     STATUS    RESTARTS   AGE
pod-cm-1   1/1       Running   0          15s
[root@master configmap]# kubectl exec -it pod-cm-1 -- /bin/sh
/ # printenv | grep NGINX_SERVER
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=myapp.example.com

[root@master ~]# kubectl edit cm nginx-config
configmap/nginx-config edited

nginx_port: "80" ---》 nginx_port: "8080"

[root@master ~]# kubectl describe cm nginx-config
Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx_port:
----
8080
server_name:
----
myapp.example.com
Events:  <none>
/ # printenv | grep NGINX_SERVER
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=myapp.example.com
/ # exit
[root@master configmap]# kubectl delete pod pod-cm-1
pod "pod-cm-1" deleted

 

3. vim pod-configmap-2.yaml创建configmap资源文件,volumeMounts:指明采用挂载的形式,mountPath: /etc/nginx/config.d/指明路径。kubectl apply -f pod-configmap-2.yaml声明资源。kubectl get pods -o wide查看pod信息。 kubectl exec -it pod-cm-2 -- /bin/sh交互模式进入pod。cd /etc/nginx/config.d到挂载目录,cat server_name   cat nginx_port 查看变量参数信息。kubectl edit cm nginx-config在外部修改参数。cat nginx_port 在pod内部查看确认,参数已经修改。这时因为采用挂载的方式,参数会实时传递到pod内部,pod内部的地址下文件是采用映射的形式指向参数,参数变化会跟着变化。ls -l查看链接的指向。

[root@master configmap]# cp pod-configmap.yaml pod-configmap-2.yaml 
[root@master configmap]# vim pod-configmap-2.yaml
[root@master configmap]# cat pod-configmap-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    example.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: nginxconf
      mountPath: /etc/nginx/config.d/
      readOnly: true
  volumes:
  - name: nginxconf
    configMap:
      name: nginx-config
[root@master configmap]# kubectl apply -f pod-configmap-2.yaml
pod/pod-cm-2 created
[root@master configmap]# kubectl get pods -o wide
NAME       READY     STATUS    RESTARTS   AGE       IP           NODE
pod-cm-2   1/1       Running   0          16s       10.244.1.2   node1.example.com
[root@master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh
/ # cd /etc/nginx/config.d
[root@master ~]# kubectl edit cm nginx-config
configmap/nginx-config edited

nginx_port: "8080" ---》 nginx_port: "8088"

/etc/nginx/config.d # cat nginx_port 
8088

/etc/nginx/config.d # ls -h
nginx_port   server_name

/etc/nginx/config.d # ls -l
total 0
lrwxrwxrwx    1 root     root            17 Dec 14 10:53 nginx_port -> ..data/nginx_port
lrwxrwxrwx    1 root     root            18 Dec 14 10:53 server_name -> ..data/server_name
/etc/nginx/config.d # exit
[root@master configmap]# kubectl delete -f pod-configmap-2.yaml 
pod "pod-cm-2" deleted
 

4.vim pod-configmap-3.yaml编辑资源文件。 kubectl apply -f pod-configmap-3.yaml声明资源。kubectl get pods -o wide获取Pod信息。 kubectl exec -it pod-cm-3 -- /bin/sh交互方式进入。cat www.conf 查看文件。curl myapp.example.com尝试访问网页,可以访问(这里需要自己在本地做地址解析)。 kubectl edit cm nginx-www在外部修改configmap资源信息。nginx -T | tail在内部查看会发现信息同步修改。netstat -tnl但端口监听没有变化。nginx -s reload重新载入。netstat -tnl监听端口同步调整。curl myapp.example.com:8080访问的端口变为8080。

[root@master configmap]# cp pod-configmap-2.yaml pod-configmap-3.yaml
[root@master configmap]# vim pod-configmap-3.yaml
[root@master configmap]# cat pod-configmap-3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-3
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    example.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: nginxconf
      mountPath: /etc/nginx/conf.d/
      readOnly: true
  volumes:
  - name: nginxconf
    configMap:
      name: nginx-www
[root@master configmap]# kubectl apply -f pod-configmap-3.yaml
pod/pod-cm-3 created
[root@master configmap]# kubectl get pods -o wide
NAME       READY     STATUS    RESTARTS   AGE       IP            NODE
pod-cm-3   1/1       Running   0          12s       10.244.2.93   node2.example.com
[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/ # cd /etc/nginx/conf.d/

/etc/nginx/conf.d # ls
www.conf
/etc/nginx/conf.d # cat www.conf 
server {
        server_name myapp.example.com;
        listen 80;
        root /data/web/html/;
}
[root@node1 ~]# curl myapp.example.com
Nginx Server Configmap Test

[root@master ~]# kubectl edit cm nginx-www
configmap/nginx-www edited
listen 80 ---》listen 8080

/etc/nginx/conf.d # nginx -T | tail
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
    video/x-msvideo                       avi;
}

# configuration file /etc/nginx/conf.d/www.conf:
server {
        server_name myapp.example.com;
        listen 8080;
        root /data/web/html/;
}
/etc/nginx/conf.d # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
/etc/nginx/conf.d # nginx -s reload
2018/12/14 11:19:39 [notice] 22#22: signal process started
/etc/nginx/conf.d # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN 

[root@node1 ~]# curl myapp.example.com
curl: (7) Failed connect to myapp.example.com:80; Connection refused
[root@node1 ~]# curl myapp.example.com:8080
Nginx Server Configmap Test
 

5.kubectl create secret generic mysql-root-password --from-literal=password=MyPass123创建secret资源。kubectl get secret查看secret资源。kubectl describe secret mysql-root-password查看资源详细信息。kubectl get secret mysql-root-password -o yaml将资源信息以yaml格式输出。 echo TXlQYXNzMTIz | base64 -d反编译进行确认。vim pod-secret-1.yaml编辑文件,secretKeyRef:传入参数信息。kubectl exec -it pod-secret-1 -- printenv | grep MYSQL将pod环境变量输出。

[root@master ~]# kubectl create secret generic mysql-root-password --from-literal=password=MyPass123
secret/mysql-root-password created
[root@master ~]# kubectl get secret
NAME                  TYPE                                  DATA      AGE
default-token-v6ssb   kubernetes.io/service-account-token   3         21h
mysql-root-password   Opaque                                1         5s
[root@master ~]# kubectl describe secret mysql-root-password
Name:         mysql-root-password
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  9 bytes
[root@master ~]# kubectl get secret mysql-root-password -o yaml
apiVersion: v1
data:
  password: TXlQYXNzMTIz
kind: Secret
metadata:
  creationTimestamp: 2018-12-14T12:00:22Z
  name: mysql-root-password
  namespace: default
  resourceVersion: "56221"
  selfLink: /api/v1/namespaces/default/secrets/mysql-root-password
  uid: d58447c7-ff97-11e8-b535-000c290c9b7a
type: Opaque
[root@master ~]# echo TXlQYXNzMTIz | base64 -d
MyPass123

[root@master configmap]# cp pod-configmap.yaml pod-secret-1.yaml

[root@master configmap]# vim pod-secret-1.yaml

[root@master configmap]# cat pod-secret-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-secret-1
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    example.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@master configmap]# kubectl create -f pod-secret-1.yaml 
pod/pod-secret-1 created
[root@master configmap]# kubectl get pods -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE
pod-cm-3       1/1       Running   0          1h        10.244.2.93   node2.example.com
pod-secret-1   1/1       Running   0          32s       10.244.1.4    node1.example.com
[root@master configmap]# kubectl exec -it pod-secret-1 -- printenv | grep MYSQL
MYSQL_ROOT_PASSWORD=MyPass123
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值