拉取镜像可以去渡渡鸟:https://docker.aityp.com/

https://kubernetes.io/zh-cn/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

ConfigMapSecret 像“云端数据库”一样存在于 Etcd 中

注意:

ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。

echo "123"
echo "123"|base64 #(加密)
MTIzCg==
echo "MTIzCg=="|base64 -d #(解密)---(这个加密不是绝对的安全)
123

一、configmap

https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

键值对:

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

二、什么是解耦

把「程序代码 / 镜像」和「配置参数」分离开管理,代码镜像固定不变,配置单独存放、独立修改,互不影响。

三、常见键值对形式对应关系

本质:都是 key:value 键值对结构

  1. JSON 格式 → 标准数据格式 → 底层就是键值对 key:value
  2. Python 语言 → 字典 → 本质也是键值对存储
  3. Nginx → nginx.conf 配置文件 → 各类配置项都是键值对形式

拉取镜像(在node节点上)

ctr -n k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:latest
ctr -n k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:latest  docker.io/library/alpine:latest

四、alpine镜像

是极简轻量级Linux镜像,体积小,资源占用底,k8s尝做测试、基础容器,常配合ConfigMap做实验:用apline容器挂载ConfigMap配置文件,验证配置注入、配置挂载效果

在master节点上/root/configmap

cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: alpine
      command: ["sleep", "3600"]
      env:
        # 定义环境变量
        - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
          valueFrom:
            configMapKeyRef:
              name: game-demo           # 这个值来自 ConfigMap
              key: player_initial_lives # 需要取值的键
        - name: UI_PROPERTIES_FILE_NAME
          valueFrom:
            configMapKeyRef:
              name: game-demo
              key: ui_properties_file_name
      volumeMounts:
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
  # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
  - name: config
    configMap:
      # 提供你想要挂载的 ConfigMap 的名字
      name: game-demo
      # 来自 ConfigMap 的一组键,将被创建为文件
      items:
      - key: "game.properties"
        path: "game.properties"
      - key: "user-interface.properties"
        path: "user-interface.properties"

kubectl apply -f pod.yaml       # 创建/更新 Pod
kubectl get pod -o wide         # 查看 Pod 详细信息
kubectl exec -it pod名 -- sh    # 进入 Pod 内部
kubectl api-resources           # 查看 K8s 所有资源
kubectl get deploy              # 查看部署控制器
kubectl delete deploy 名字       # 删除部署(连带删除 Pod)
kubectl get node                # 查看集群节点状态

如果你想拷贝到当前目录并保持原名 :

kubectl cp nginx-6:/etc/nginx/nginx.conf nginx.conf
[root@k8s-master-1 nginx]# cat nginx.conf

user  nginx;
worker_processes  5;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  2048;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

ulimit -n 655350

kubectl create cm nginx-config-1 --from-file=nginx.conf
configmap/nginx-config-1 created
[root@k8s-master-1 nginx]# kubectl get cm
NAME               DATA   AGE
game-demo          4      3h20m
kube-root-ca.crt   1      30d
nginx-config-1     1      11s

看里面的内容

kubectl describe cm nginx-config-1
[root@k8smaster configmap]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-configmap-test
spec:
  containers:
    - name: test-container-configmap
      image: nginx
      imagePullPolicy: IfNotPresent
      volumeMounts:
      - name: config-volume
        mountPath: /etc/nginx/nginx.conf
        subPath: nginx.conf                     
        #声明nginx.conf是一个文件
  volumes:
    - name: config-volume
    #创建一个卷的名字为config-volume
      configMap:
        # 提供包含要添加到容器中的文件的 ConfigMap 的名称
        name: nginx-config-1
  restartPolicy: Always

mount的挂载点是目录

二、secret

https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/

尺寸限制,每个尺寸最多为1MB

[root@k8s-master-1 secret]# cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: secret-sa-sample
type: Opaque
data:
  password: c2MxMjM0NTYK
[root@k8s-master-1 secret]#
[root@k8s-master-1 secret]# kubectl apply -f secret.yaml 
secret/secret-sa-sample created
[root@k8s-master-1 secret]# kubectl get secret
NAME                    TYPE     DATA   AGE
mysql-pass-8g8494mfgm   Opaque   1      6m50s
secret-sa-sample        Opaque   1      4s
[root@k8s-master-1 secret]#

kubectl describe secret mysecret-<你的名称>

三、PV——持久卷

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: sanchuang  
   #存储类的名字一会pvc的名字和中国名字要一样  
    #---》pvc通过这个存储类型的名字和pv绑定
  capacity:    #能力
    storage: 10Gi   #提供多少存储空间
  accessModes:
    - ReadWriteOnce  #读写
    # ——一共有四种访问模式 
    1、ReadWriteOnce————RWO
    2、ReadOnlyMany————ROX
    3、ReadWriteMany————RWX
    4、ReadWriteOncePod————RWOP
  hostPath:
    path: "/web/data"

四、PVC——持久卷申领

PVC申领会占用PV空间

五、补充configmap和secret知识点

1、configmap 和secret

物理上 :configmap 和secret储存在k8s集群的数据库(Etcd)中,由API Server管理。他们在被挂载之前不属于任何一个节点或容器

逻辑上:当定义了一个Pod并引用了他们,k8s会在pod启动时,由kubelet将这些数据“投射”到容器的文件系统中。

2、containerd Pod docker k8s configmap secret hostpath 之间的关系

3、kubectl 和 kubelet

kubectl作用:负责把你写的yaml文件内容发送给集群“大脑”(API Server)

kubelet作用:当Master决定要在某个节点跑一个Pod时,该节点的kubelet就会收到指令。它负责去拉取镜像(Pull Image)、启动容器,并持续监控它们的状态。

3. ConfigMap & Secret 底层原理

  • 物理存储:全部保存在 K8s 集群 Etcd 数据库,由 API Server 统一管理;没被 Pod 引用时,不归属任何节点、容器。
  • 逻辑挂载:Pod 启动时,节点上的 kubelet 负责把 ConfigMap/Secret 数据投射挂载到容器文件系统或环境变量中。

4. 组件关系梳理

containerd / Docker → Pod → K8s → ConfigMap / Secret / PV / PVC / hostPath

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐