一,configmap简介:

ConfigMap是一种API对象,用来将非加密数据保存到键值对中,如etcd中。

可以用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap可以将 环境变量 配置信息和容器镜像解耦,便于应用配置的修改。

如果需要存储加密信息时可以使用Secret对象。

1,configmap的创建:

[root@k8s-master configmap]# kubectl create configmap --help
查看帮助如何创建 configmap常用两种创建方式:

(1.1)第一种:基于文件的方式进行创建,–from-file:指明文件名称,名称为键,文件内容为值。也可以指明多个文件。

语法: kubectl create configmap my-config --from-file=path/to/bar

示例:基于向nginx注入配置文件。

[root@k8s-master configmap]# cat www.conf    创建一个nginx配置文件。
server {
       server_name myapp.shuo.com;
       listen 80;
       root /data/web/html/;
}
[root@k8s-master configmap]# kubectl create configmap nginx-www --from-file=www.conf 创建一个configmap名称为nginx-www,键为www.conf,值为文件内容。
configmap/nginx-www created

[root@k8s-master configmap]# kubectl get cm    查看configmap
NAME               DATA   AGE
kube-root-ca.crt   1      43d
nginx-www          1      10s
[root@k8s-master configmap]# 
[root@k8s-master configmap]# kubectl describe cm nginx-www       查看创建的configmap详细信息。
Name:         nginx-www
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
www.conf:----
server {
       server_name myapp.shuo.com;
       listen 80;                       
       root /data/web/html/;
}


Events:  <none>

创建一个pod,使用configmap类型挂载卷
[root@k8s-master configmap]# vim pod-configmap-3.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-3
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    mingyuanyun/create: "yanss"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: nginxconf
      mountPath: /etc/nginx/conf.d/ 挂载到这个nginx资源路径下,为nginx提供资源。
      readOnly: true      不允许pod容器对配置文件修改
  volumes: 
  - name: nginxconf
    configMap:
      name: nginx-www

[root@k8s-master configmap]# kubectl apply -f pod-configmap-3.yaml
pod/pod-cm-3 created
[root@k8s-master configmap]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pod-cm-3      1/1     Running   0          9m47s   10.244.1.11   k8s-node1   <none>           <none>

[root@k8s-master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls           可以看到我们创建的confimap,nginx-www中的键。
www.conf
/etc/nginx/conf.d # cat www.conf 
server {
       server_name myapp.shuo.com;
       listen 80;
       root /data/web/html/;
}

/etc/nginx/conf.d # 
/etc/nginx/conf.d # nginx -T              查看nginx加载的配置文件。
# configuration file /etc/nginx/conf.d/www.conf:
server {
       server_name myapp.shuo.com;
       listen 80;
       root /data/web/html/;
}


/etc/nginx/conf.d # mkdir -p /data/web/html                   构建nginx资源访问路径。
/etc/nginx/conf.d # vi /data/web/html/index.html
/etc/nginx/conf.d # 
/etc/nginx/conf.d # cat /data/web/html/index.html 
weclome nginx

验证测试: node1上访问,如果想要通过域名访问,那么需要修改node1上hosts文件
[root@k8s-node1 ~]# curl 10.244.1.11
weclome nginx

修改configmap  nginx-www中监听的端口号,看看nginx配置文件会不会生效
因为我们通过存储卷挂载的方式进行同步,时间有点慢。
[root@k8s-master configmap]# kubectl edit cm nginx-www      修改configmap文件中监听端口为8080
configmap/nginx-www edited
[root@k8s-master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/data/web/html # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls
www.conf
/etc/nginx/conf.d # cat www.conf 
server {
       server_name myapp.shuo.com;
       listen 8080;
       root /data/web/html/;
}

(1.2)基于键值对进行创建configmap

语法:kubectl create configmap my-config --from-literal=key1=config1
–from-literal=key2=config2

示例:向pod中注入环境变量

[root@k8s-master ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=Yan.com.cn
configmap/nginx-config created
[root@k8s-master ~]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      43d
nginx-config       2      6s

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

Data
====
nginx_port:              定义的键
----
80                             键的值
server_name:
----
Yan.com.cn
Events:  <none>

[root@k8s-master configmap]# cat pod-configmap.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations: 
    mingyuanyun/create: "yanss"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    - name: https
      containerPort: 443
    env:
    - name: NGINX_SERVER_PORT              定义变量名称
      valueFrom:                值的来源
        configMapKeyRef:             
          name: nginx-config      configmap的名称
          key: nginx_port             configmap中的键
    - name: NGINX_SERVER_NAME
      valueFrom:
        configMapKeyRef:
          name: nginx-config
          key: server_name

[root@k8s-master configmap]# kubectl apply -f pod-configmap.yaml 
pod/pod-cm-1 created
[root@k8s-master configmap]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
pod-cm-1      1/1     Running   0          9s
[root@k8s-master configmap]# kubectl exec -it pod-cm-1 -- /bin/sh     进入pod查看变量。
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=Yan.com.cn

2,通过存储卷的方式加载,这是键为文件名,内容为值。
[root@k8s-master configmap]# kubectl exec -it pod-cm-1 -- /bin/sh     进入pod查看变量。
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=Yan.com.cn

[root@k8s-master configmap]# vim pod-configmap-2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    mingyuanyun/create: "yanss"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: nginxconf
      mountPath: /etc/nginx/config.d/
      readOnly: true              不允许pod容器对配置文件修改
  volumes:
  - name: nginxconf
    configMap:
      name: nginx-config
  
[root@k8s-master configmap]# kubectl apply -f pod-configmap-2.yaml 
pod/pod-cm-2 created
[root@k8s-master configmap]# kubectl get pods 
NAME          READY   STATUS    RESTARTS   AGE
pod-cm-2      1/1     Running   0          7s
[root@k8s-master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh
/ # ls
bin    etc    lib    mnt    root   sbin   sys    usr
dev    home   media  proc   run    srv    tmp    var
/ # cd /etc/nginx/conf
conf.d/    config.d/
/ # cd /etc/nginx/config.d/
/etc/nginx/config.d # ls
nginx_port   server_name
/etc/nginx/config.d # cat nginx_port 
/etc/nginx/config.d # cat nginx_port 
/etc/nginx/config.d # cat server_name 
Yan.com.cn/etc/nginx/config.d # 

secrets:不同于confimap在于加密存储数据,不是明文存储。

三中类型:
docker-registry 创建一个给 Docker registry 使用的 secret       这个类型是存储登录私有仓库需要认证的账号密码
generic         从本地 file, directory 或者 literal value 创建一个 secret,例如存储Mysql账号和密码。
tls             创建一个 TLS secret          这个类型是存储相关认证秘钥的secret。保存的是私钥和证书

[root@k8s-master configmap]# kubectl create secret generic mysql-root-password --from-literal=password=Myp@ss123   创建一个通用类型的secret,键为password,值为密码。
secret/mysql-root-password created
[root@k8s-master configmap]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-2rtnx   kubernetes.io/service-account-token   3      48d
mysql-root-password   Opaque                                1      14s

[root@k8s-master configmap]# kubectl describe secret mysql-root-password    查看值是加密的。
Name:         mysql-root-password
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  9 bytes
[root@k8s-master configmap]# 

[root@k8s-master configmap]# kubectl get secret mysql-root-password -o yaml
apiVersion: v1
data:
  password: TXlwQHNzMTIz
kind: Secret
metadata:
  creationTimestamp: "2022-07-26T08:57:25Z"
  name: mysql-root-password
  namespace: default
  resourceVersion: "5523531"
  uid: 24b481cc-55e5-423e-9026-7fd30fefd8fc
type: Opaque
[root@k8s-master configmap]# echo TXlwQHNzMTIz | base64 -d               通过base64解码可以查看密码
Myp@ss123[root@k8s-master configmap]# 

总结:configmap和secret基本操作完成,区别在于一个明文存储一个加密存储数据。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐