从零开始的云计算生活——第四十六天,铁杵成针,kubernetes模块之Configmap资源与Secret资源对象

目录

一.故事背景

二.Configmap资源

[1.Configmap 概述](#1.Configmap 概述)

[什么是 Configmap?](#什么是 Configmap?)

[Configmap 能解决哪些问题?](#Configmap 能解决哪些问题?)

[Configmap 应用场景](#Configmap 应用场景)

[使用 ConfigMap 的限制条件](#使用 ConfigMap 的限制条件)

[2.Configmap 创建方法](#2.Configmap 创建方法)

命令行直接创建

通过文件创建(常用)

[指定目录创建 configmap(常用)](#指定目录创建 configmap(常用))

[3.使用 Configmap](#3.使用 Configmap)

通过环境变量引入

通过环境变量引入

[把 configmap 做成 volume,挂载到 pod(常用)](#把 configmap 做成 volume,挂载到 pod(常用))

[4.Configmap 热更新](#4.Configmap 热更新)

三.K8S-Secret资源对象

1.Secret概述

[2.Secret 类型](#2.Secret 类型)

[kubectl 创建类型](#kubectl 创建类型)

[3. Secret 使用](#3. Secret 使用)

[Opaque 类型 Secret 的使用](#Opaque 类型 Secret 的使用)

[kubectl create创建](#kubectl create创建)

yaml创建

挂载

作为环境变量

[作为文件挂载及设置 POSIX 权限](#作为文件挂载及设置 POSIX 权限)

[查看 secret](#查看 secret)

[ssh 类型 secret](#ssh 类型 secret)

通过文件创建

[pod 挂载 ssh secret](#pod 挂载 ssh secret)

四.总结


一.故事背景

今日继续讲解k8s的两个模块

二.Configmap资源

1.Configmap 概述

什么是 Configmap?

Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。

Configmap 能解决哪些问题?

ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、nginx、apache 等,那么这些配置都存在这个节点上,假如一台服务 器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署 多个服务:nginx、nginx、apache,新增加的服务器上还是要管理这些服务的配置, 如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改, 这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s 中引入了 Configmap 资源对象,可以当成 volume 挂载到 pod 中,实现统一的配置管理。

1、Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;

2、Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;

3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。

4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

Configmap 应用场景

1、使用 k8s 部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,configmap 可以将配置信息和 docker 镜像解耦 ,以便实现镜像的可移植性和可复用性,因为一个 configMap 其实就是一系列配置信息的集合,可直接注入到 Pod 中给容器使用。configmap 注入方式有两种,一种将 configMap 做为存储卷,一种是将configMap 通过 env 中 configMapKeyRef 注入到容器中。

2、使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用 configmap 可以友好的进行配置共享。

使用 ConfigMap 的限制条件

  • ConfigMap 需要在 Pod 启动前创建出来;

  • 并且只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;

  • 当 Pod 挂载 ConfigMap 绑定的目录时,目录下的目录并不会挂载到 Pod 内,只有目录下的文件会被挂载。

  • ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数据库或者文件服务。

2.Configmap 创建方法

命令行直接创建

直接在命令行中指定 configmap 参数创建,通过--from-literal 指定参数

创建选项解析:

--allow-missing-template-keys

含义:如果设置为true,当模板中的字段或映射键在数据来源中缺失时,忽略模板中的任何错误。

--append-hash

含义:将configmap的哈希值附加到它的名称后面。

--as-group

含义:指定操作时要模拟的组。这个标志可以重复使用,以指定多个组,用于在操作中进行权限模拟。

--as-uid

含义:指定操作时要模拟的用户ID(UID)。

--as

含义:指定操作时要模拟的用户名。这个用户可以是普通用户或者服务账户,用于在操作中进行权限模拟。

--cache-dir

含义:默认的缓存目录路径。

--certificate-authority

含义:指向证书颁发机构(CA)证书文件的路径,用于验证服务器证书的合法性。

--client-certificate

含义:指向用于TLS(传输层安全协议)的客户端证书文件的路径。

--client-key

含义:指向用于TLS的客户端密钥文件的路径。

--cluster

含义:指定要使用的kubeconfig中的集群名称。kubeconfig是Kubernetes用于配置客户端访问集群的文件。

--context

含义:指定要使用的kubeconfig中的上下文名称。上下文包含了集群、用户和命名空间等信息,用于确定如何与集群进行交互。

--disable-compression

含义:如果设置为true,对发送到服务器的所有请求都不使用响应压缩。

--dry-run

含义:必须是"none"、"server"或"client"之一。如果是"client"策略,仅打印出将要发送到服务器的对象,而不实际执行创建操作;"server"可能在服务器端进行一些验证但不持久化;"none"则是正常执行操作。

--field-manager

含义:用于跟踪字段所有权的管理器名称。

--from-env-file

含义:指定一个文件路径,用于读取以键值对(key=val)形式的行来创建configmap。

--from-file

含义:可以使用文件路径来指定键文件,在这种情况下,文件的基本名称(不含路径)将被用作configmap中的键,文件内容作为值。

--from-literal

含义:指定一个键和一个字面量值,用于插入到configmap中(例如mykey=somevalue)。

--help

含义:显示configmap相关的帮助信息。

--insecure-skip-tls-verify

含义:如果设置为true,将不会检查服务器证书的有效性。这会使你的连接变得不安全,但在某些测试或特殊环境下可能会用到。

--kubeconfig

含义:指向用于命令行接口(CLI)请求的kubeconfig文件的路径。

--log-flush-frequency

含义:日志刷新的最大间隔秒数,即多久将日志缓冲区中的内容刷新输出一次。

--match-server-version

含义:要求服务器版本与客户端版本匹配。

--namespace

含义:如果存在此选项,它指定了这个命令行请求的命名空间范围。命名空间用于在Kubernetes集群中对资源进行隔离和分组。

--output

含义:输出格式。可以是以下之一:(json、yaml、name、go-template、go-template-file、template等),用于指定命令执行结果的输出格式。

--password

含义:用于对API服务器进行基本身份验证的密码。

--profile

含义:要捕获的性能分析(profile)名称。可以是(none、cpu、heap、goroutine、threadcreate、block、mutex)之一,用于对Kubernetes组件的性能进行分析。

--profile-output

含义:指定要将性能分析结果写入的文件名。

--request-timeout

含义:在放弃单个服务器请求之前等待的时间长度。非零值会设置请求超时时间,避免长时间等待无响应的服务器。

--save-config

含义:如果设置为true,当前对象的配置将保存在其注释中。否则,不会保存配置。

--server

含义:Kubernetes API服务器的地址和端口,用于指定客户端连接的服务器位置。

--show-managed-fields

含义:如果设置为true,在以JSON或YAML格式打印对象时,保留managedFields字段。这些字段通常用于记录资源的管理信息。

--template

含义:当-o=go-template、-o=go-template-file等输出格式选项被使用时,指定要使用的模板字符串或模板文件路径。

--tls-server-name

含义:用于服务器证书验证的服务器名称。如果未提供,将使用主机名进行验证。

--token

含义:用于对API服务器进行身份验证的承载令牌(Bearer Token)。

--username

含义:用于对API服务器进行基本身份验证的用户名。

--user

含义:指定要使用的kubeconfig用户的名称。

--validate

含义:必须是以下之一:strict(或true)、warn、ignore(或false),用于指定对资源配置的验证级别。

--vmodule

含义:逗号分隔的pattern=N设置列表,用于基于文件过滤的日志记录(仅适用于特定的日志系统)。

--v

含义:日志级别详细程度的数字表示,用于控制日志输出的信息量。

--warnings-as-errors

含义:将从服务器接收到的警告视为错误,并以非零退出码退出命令执行。

通过文件创建(常用)

通过指定文件创建一个 configmap,--from-file=<文件>,若没有定义key,则使用文件名作为key,文件内容作为value。

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  labels:
    app: nginx129
spec:
  containers:
  - name: nginx129
    ports:
    - containerPort: 80
    image: nginx:latest
    imagePullPolicy: IfNotPresent

将default.conf拷出来并修改

在nginx.yaml中新加内容

复制代码
volumeMounts:
    - name: nginx-config
      mountPath: /etc/nginx/conf.d/
  volumes:
  - name: nginx-config
    configMap:
      name: nginx-conf  

创建一个svc.yaml

复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc-test
spec:
  type: NodePort
  ports:
  - targetPort: 81
    port: 808
  selector:
    app: nginx129

成功挂载过去

访问30530端口

指定目录创建 configmap(常用)

#查看 configmap 详细信息

3.使用 Configmap

通过环境变量引入

使用 configMapKeyRef变量

复制代码
#创建一个存储 mysql 配置的 configmap

[root@k8s-master01 ~]# cat mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  log: "1"
  lower: "1"
[root@k8s-master01 ~]# kubectl apply -f mysql-configmap.yaml

configmap/mysql created

[root@k8s-master01 ~]# kubectl get cm

NAME               DATA   AGE

kube-root-ca.crt   1      13d

mysql              2      82s

#创建 pod,引用 Configmap 中的内容

[root@k8s-master01 ~]# cat mysql-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:
    - name: log_bin #定义环境变量 log_bin
      valueFrom:
        configMapKeyRef:
          name: mysql #指定 configmap 的名字
          key: log #指定 configmap 中的 key
    - name: lower #定义环境变量 lower
      valueFrom:
        configMapKeyRef:
          name: mysql
          key: lower
  restartPolicy: Never


#更新资源清单文件

[root@k8s-master01 ~]# kubectl apply -f mysql-pod.yaml

[root@k8s-master01 ~]#  kubectl exec -it mysql-pod -- /bin/sh

/ # env
log_bin=1
KUBERNETES_PORT=tcp://10.10.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mysql-pod
NGINX_SVC_NODEPORT_PORT_8000_TCP_ADDR=10.10.166.16
SHLVL=1
HOME=/root
NGINX_SVC_NODEPORT_PORT_8000_TCP_PORT=8000
NGINX_SVC_NODEPORT_PORT_8000_TCP_PROTO=tcp
SERVICE_BLUE_SERVICE_HOST=10.10.157.201
NGINX_SVC_NODEPORT_SERVICE_HOST=10.10.166.16
SERVICE_BLUE_SERVICE_PORT=80
SERVICE_BLUE_PORT=tcp://10.10.157.201:80
NGINX_SVC_NODEPORT_PORT_8000_TCP=tcp://10.10.166.16:8000
TERM=xterm
lower=1
KUBERNETES_PORT_443_TCP_ADDR=10.10.0.1
NGINX_SVC_NODEPORT_PORT=tcp://10.10.166.16:8000
NGINX_SVC_NODEPORT_SERVICE_PORT=8000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SERVICE_BLUE_PORT_80_TCP_ADDR=10.10.157.201
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
SERVICE_BLUE_PORT_80_TCP_PORT=80
SERVICE_BLUE_PORT_80_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.10.0.1:443
KUBERNETES_SERVICE_HOST=10.10.0.1
PWD=/
SERVICE_BLUE_PORT_80_TCP=tcp://10.10.157.201:80

通过环境变量引入

复制代码
#使用 envfrom变量

[root@k8s-master01 ~]# cat  mysql-pod-envfrom.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-envfrom
spec:
  containers:
  - name: mysql
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom:
    - configMapRef:
       name: mysql  #指定configmap的名字
  restartPolicy: Never

#更新资源清单文件

[root@k8s-master01 ~]# kubectl apply -f mysql-pod-envfrom.yaml

pod/mysql-pod-envfrom created

[root@k8s-master01 ~]# kubectl get pods

NAME                               READY   STATUS    RESTARTS   AGE

mysql-pod                          1/1     Running   0          13m

mysql-pod-envfrom                  1/1     Running   0          107s

[root@k8s-master01 ~]#  kubectl exec -it mysql-pod-envfrom -c mysql -- /bin/sh

/ # env
KUBERNETES_PORT=tcp://10.10.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mysql-pod-envfrom
NGINX_SVC_NODEPORT_PORT_8000_TCP_ADDR=10.10.166.16
SHLVL=1
HOME=/root
NGINX_SVC_NODEPORT_PORT_8000_TCP_PORT=8000
NGINX_SVC_NODEPORT_PORT_8000_TCP_PROTO=tcp
SERVICE_BLUE_SERVICE_HOST=10.10.157.201
NGINX_SVC_NODEPORT_SERVICE_HOST=10.10.166.16
SERVICE_BLUE_SERVICE_PORT=80
SERVICE_BLUE_PORT=tcp://10.10.157.201:80
NGINX_SVC_NODEPORT_PORT_8000_TCP=tcp://10.10.166.16:8000
TERM=xterm
lower=1
KUBERNETES_PORT_443_TCP_ADDR=10.10.0.1
NGINX_SVC_NODEPORT_PORT=tcp://10.10.166.16:8000
NGINX_SVC_NODEPORT_SERVICE_PORT=8000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
log=1
KUBERNETES_PORT_443_TCP_PORT=443
SERVICE_BLUE_PORT_80_TCP_ADDR=10.10.157.201
KUBERNETES_PORT_443_TCP_PROTO=tcp
SERVICE_BLUE_PORT_80_TCP_PORT=80
SERVICE_BLUE_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.10.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.10.0.1
PWD=/
SERVICE_BLUE_PORT_80_TCP=tcp://10.10.157.201:80

把 configmap 做成 volume,挂载到 pod(常用)

复制代码
[root@k8s-master01 ~]# cat mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  log: "1"
  lower: "1"
  my.cnf: |
    [mysqld]
    welcome=duoduo

[root@k8s-master01 ~]# kubectl apply -f mysql-configmap.yaml

configmap/mysql configured

#查看详细配置信息

[root@k8s-master01 ~]# kubectl describe configmap mysql

Name:         mysql
Namespace:    default
Labels:       app=mysql
Annotations:  <none>

Data
====
log:
----
1
lower:
----
1
my.cnf:
----
[mysqld]
welcome=duoduo


BinaryData
====

Events:  <none>

#创建pod资源清单文件,挂载configmap卷

[root@k8s-master01 ~]# cat mysql-pod-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-volume
spec:
  containers:
  - name: mysql
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh","-c","sleep 3600" ]
    volumeMounts:
    - name: mysql-config
      mountPath: /tmp/config
  volumes:
  - name: mysql-config
    configMap:
      name: mysql
  restartPolicy: Never

[root@k8s-master01 ~]# kubectl apply -f mysql-pod-volume.yaml

pod/mysql-pod-volume created

[root@k8s-master01 configmap]# kubectl exec -it mysql-pod-volume -- /bin/sh
/ # 
/ # 
/ # 
/ # cd /tmp/config/
/tmp/config # ls
log     lower   my.cnf
/tmp/config # ls -l
total 0
lrwxrwxrwx    1 root     root            10 Feb  1 08:12 log -> ..data/log
lrwxrwxrwx    1 root     root            12 Feb  1 08:12 lower -> ..data/lower
lrwxrwxrwx    1 root     root            13 Feb  1 08:12 my.cnf -> ..data/my.cnf

4.Configmap 热更新

仅限于卷的形式,如果是环境变量的形式则不更新!!!

限于应用程序能够对配置文件进行动态感知。nginx不行,需要在apply之后对pod执行命令:

nginx -s reload

复制代码
[root@k8s-master01 ~]# kubectl edit configmap mysql

#将log:1 变成 log:2
apiVersion:v1
data:
 log:"2"
 lower:"1"

重新执行一次资源清单文件

复制代码
[root@k8s-master01 test1]# kubectl apply -f mysql-pod-volume.yaml

pod/mysql-pod-volume configured

[root@k8s-master01 ~]# kubectl exec -it mysql-pod-volume -- /bin/sh

/ # cat /tmp/config/log

2/ #

#一次构建镜像,通过配置管理中心configmap 实现了 多场景运行

三.K8S-Secret资源对象

1.Secret概述

k8s secrets**用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。**它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。

Secret 类似于 ConfigMap,但专门用于保存机密数据。

2.Secret 类型

内置类型 用法
Opaque 用户定义的任意数据
kubernetes.io/service-account-tokensymotion 服务账号令牌
kubernetes.io/dockercfg ~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth 用于基本身份认证的凭据
kubernetes.io/ssh-auth 用于 SSH 身份认证的凭据
kubernetes.io/tls 用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token 启动引导令牌数据

kubectl 创建类型

复制代码
Create a secret using specified subcommand.

Available Commands:
  docker-registry   创建一个给 Docker registry 使用的 secret
  generic           Create a secret from a local file, directory, or literal value
  tls               创建一个 TLS secret

Usage:
  kubectl create secret [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
  • docker-registry: 连接私有镜像仓库的凭证(据)

  • generic: 常见 secret, 该类型 secret 与 configmap使用相同

  • tls: 提供 tls 证书, 在 service mesh 中自动挂载

3. Secret 使用

使用场景:

  • 设置容器的环境变量

  • 向 Pod 提供 SSH 密钥或密码等凭据

  • 允许 kubelet 从私有镜像仓库中拉取镜像

Opaque 类型 Secret 的使用

kubectl create创建

其中hello有5个字符所以k1是5 bytes

汉字你好一共6 bytes,所以一个汉字是3个bytes

yaml创建

以 yaml 方式创建需要你提前进行 base64

先加密

编写yaml文件

复制代码
apiVersion: v1
kind: Secret
metadata:
  name: secret-volume
  namespace: default
type: Opaque
data:
  password: MTIzNDU2
  username: YWRtaW4=
immutable: true
挂载
作为环境变量

创建 pod

复制代码
[root@k8s-master secret]# cat secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - image: busybox:1.28
    name: busybox
    command: ["/bin/sh","-c","echo $username && env"]
    env:
    - name: username
      valueFrom:
        secretKeyRef:
          key: username
          name: secret-volume    # secret 名称
####pod不会运行,测试时需要查看日志####          
          
######或者########
[root@k8s-master01 secret]# cat secret-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - image: busybox:1.28
    name: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    env:
    - name: username
      valueFrom:
        secretKeyRef:
          key: username
          name: secret-volume    # secret 名称
####pod会启动,需要进入容器中查看####

获取容器日志

复制代码
# 创建
[root@k8s-master01 secret]# kubectl create -f pod1.yaml

[root@k8s-master01 secret]# kubectl logs pod1
admin
KUBERNETES_PORT=tcp://10.10.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod1
NGINX_SVC_NODEPORT_PORT_8000_TCP_ADDR=10.10.166.16
SHLVL=1
username=admin
HOME=/root
NGINX_SVC_NODEPORT_PORT_8000_TCP_PORT=8000
SERVICE_BLUE_SERVICE_HOST=10.10.157.201
NGINX_SVC_NODEPORT_PORT_8000_TCP_PROTO=tcp
NGINX_SVC_NODEPORT_SERVICE_HOST=10.10.166.16
  RVICE_BLUE_SERVICE_PORT=80
SERVICE_BLUE_PORT=tcp://10.10.157.201:80
NGINX_SVC_NODEPORT_PORT_8000_TCP=tcp://10.10.166.16:8000
KUBERNETES_PORT_443_TCP_ADDR=10.10.0.1
NGINX_SVC_NODEPORT_PORT=tcp://10.10.166.16:8000
NGINX_SVC_NODEPORT_SERVICE_PORT=8000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SERVICE_BLUE_PORT_80_TCP_ADDR=10.10.157.201
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
SERVICE_BLUE_PORT_80_TCP_PORT=80
SERVICE_BLUE_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.10.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.10.0.1
PWD=/
SERVICE_BLUE_PORT_80_TCP=tcp://10.10.157.201:80
作为文件挂载及设置 POSIX 权限

创建 pod

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  volumes:
  - name: sec
    secret:
      secretName: secret-volume
      defaultMode: 0400  # 设置文件权限
  containers:
  - image: busybox:1.28
    name: busybox
    command: ["sleep", "24h"]
    volumeMounts:
    - mountPath: /etc/config
      name: sec

注意: secret 挂载到容器后自动 base64 解码

复制代码
$ kubectl exec pod2 -- ls -l /etc/config/
total 0
lrwxrwxrwx    1 root     root            15 Jan  9 08:00 password -> ..data/password
lrwxrwxrwx    1 root     root            15 Jan  9 08:00 username -> ..data/username

$ kubectl exec pod2 -- cat /etc/config/username
admin
查看 secret
复制代码
$ kubectl get secrets sa-secret -o yaml
apiVersion: v1
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJWVB2VXI2cG02NFF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeU16QXdPVE16TVRkYUZ3MHpNekV5TWpjd09UTTRNVGRhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM0M1JFazZPZ0VFMGVWN1JHbmc1YnRONEdHaE5uUFNjbUZuYy9LKzhlSEZESVlPRkRKblZlZ0tOUmQKblVOSEFUL2h3T3RaWFZUTHhieWRGTVNqd0xSeDVPNTg5bUlVM3M2SlVZZjFvajFCUjFsWlkreXA5eVRGdXFYYQphbzc3WTVPbkVpT3BOQXUxek1WWUFRK0V2bzJtbmY2b0p6WDd3SFc2TkxZd0V0TVA2cklhclNaaU11MTllRnBWCnpmNU5RMGFGUU4vbkJyQUpHQm15eHF1cGhNRFpYOXlyK1c3emY4Q296NkxuTHRCMCtIaEtHYm9kUGVyaWk0bjgKczJlc2tLdmZ6NmdJK0dhR3ROYWtNU3gwbVZXV0MycTBDbndrOVJEOTNhd1JWRHd2VnZRczljR1B0R0I3WVdIcApDOXBLeTdaOEgybjdDZndza2FqZTMzWnhuUzJaQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRU1oxaVlWKzlQNTRiNHB3UU9QVkI0TklXYndEQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkdNRzMvN3dSZwp0ZkxDMkNHTGtRcUdaQmNtTlBzR0lwbmRqSnpTSzVjMXJMSVUrNjNHN3ZnWEJENHVuZ3B5RDFRVE5VSWp1ZVRXCkMxM1lZb1ZjK09zZkIvWFlVRkFvZ1JiWWtvZjV2TTBUeFVzdXN1VVUvT0Q2NDc0cE5xajlzQStrejRiMUliMzAKOVFmUG5mM2ZieVZyVmh0dlYxQmxsNVMwMmVDa2xaazM1SjAzczFLdytOWHovSjQzTDF6UlJjNytCa3M1UVpvbAp2ZnhJYW1BaXdqWGFUMDBhVVB3WjZ4S215KzcvUkZuRjB4aExlanhKRTBrOUU0YWR3NGhWSkNWMUp2aWdzcEpDCmNQL3BJMC9hSlVKeHVKNWZVeENuRVRVOXRpNi9aTGloeDg4Uk1vdmRFS0R4RDZJYlpKSWkxYVJwajhVeGdnL0UKcm1ONU5YTnN3Sk9XCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  namespace: ZGVmYXVsdA==
  password: MTIzNDU2
  token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkluZHBiR05VZVVwd1pUbEpRbEJpV0ZReGFFeHFaamh5WlROWE4wOHdXRXBtU1Y4eGJtODRWblp0UlVFaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpXTnlaWFF1Ym1GdFpTSTZJbk5oTFhObFkzSmxkQ0lzSW10MVltVnlibVYwWlhNdWFXOHZjMlZ5ZG1salpXRmpZMjkxYm5RdmMyVnlkbWxqWlMxaFkyTnZkVzUwTG01aGJXVWlPaUowWkdRaUxDSnJkV0psY201bGRHVnpMbWx2TDNObGNuWnBZMlZoWTJOdmRXNTBMM05sY25acFkyVXRZV05qYjNWdWRDNTFhV1FpT2lKbVpEWTRZelkwTVMwMU1qSXpMVFJsTUdRdFlqRXlaQzFpWkdKbE5ETXlOMlpsT0dZaUxDSnpkV0lpT2lKemVYTjBaVzA2YzJWeWRtbGpaV0ZqWTI5MWJuUTZaR1ZtWVhWc2REcDBaR1FpZlEuY09UZXoyM2w3VFl2TjFFN1FYcW4xVkN4dUxhbEJCN0JOMTVyU05IWFZndk5waEY4ZTd3ZkY4R3VheXFaSmZtdXB3ZE5HVzV2SFVRbE8yQVQtX3pGZkEta0hSbEN6OVZzZUVnTV82S0lrZ3FiZlNKNGw2WDRQOWFwaEdvYUhBaEdJUGdibTVGU1UwTWR6NlhzNW9fSnVvVjZfWkxxN3BZRVlGU0Y3REF1U0VyZHljSjdBZFFidWl6cHhuOE5lb3JhZ3Y5OWNDWjFlQjVJS0lGQW05SjBld1dlZEJBOUJhM0haN2RXQWozNE9uLW9mTWVKOWtQcmhvZWlUb2dtSkk5SE9NYWd4Ynh4YmF5cVpYdW9TQWJBSkNqVkRoUVZxdUJZRnJ5T09lWFowSnlXaWkyeVdVQWVvdVNDSEtRWUFXd2pmU2dwaGtKdzFQUkE4M3pFQWFmc3hn
  username: YWRtaW4=
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: tdd
    kubernetes.io/service-account.uid: fd68c641-5223-4e0d-b12d-bdbe4327fe8f
  creationTimestamp: "2024-01-09T08:49:30Z"
  name: sa-secret
  namespace: default
  resourceVersion: "630499"
  uid: c41bc253-c2c4-4d2f-a5d9-0a4fe8b0d8da
type: kubernetes.io/service-account-token

ssh 类型 secret

通过文件创建
复制代码
$ kubectl create secret generic ssh-key-secret --from-file=ssh-privatekey=/path/to/.ssh/id_rsa --from-file=ssh-publickey=/path/to/.ssh/id_rsa.pub
pod 挂载 ssh secret
复制代码
apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
  labels:
    name: secret-test
spec:
  volumes:
  - name: secret-volume
    secret:
      secretName: ssh-key-secret
  containers:
  - name: ssh-test-container
    image: mySshImage
    volumeMounts:
    - name: secret-volume
      readOnly: true
      mountPath: "/etc/secret-volume"

容器命令执行时,秘钥的数据可以在下面的位置访问到:

/etc/secret-volume/ssh-publickey

/etc/secret-volume/ssh-privatekey

容器就可以随便使用 Secret 数据来建立 SSH 连接。

四.总结

本文介绍了Kubernetes中的Configmap和Secret两大核心资源。Configmap用于存储非机密配置数据,支持命令行、文件等多种创建方式,可通过环境变量或卷挂载到Pod中,实现配置与镜像解耦。Secret专门处理敏感数据,包括Opaque、TLS等类型,可通过环境变量或卷挂载。重点讲解了两种资源的使用场景、创建方法及实践案例,如Configmap热更新限制、Secret的base64编码特性等,帮助实现安全的配置管理和敏感信息处理。

相关推荐
Akamai中国3 小时前
AI需要防火墙,云计算需要重新构想
人工智能·云计算·云服务
Britz_Kevin3 小时前
从零开始的云计算生活——第四十七天,细水长流,kubernetes模块之ingress资源对象
kubernetes·云计算·生活
iceland96 小时前
kubeadm方式部署k8s集群
云原生·容器·kubernetes
MX_935915 小时前
阿里云参数配置化
阿里云·云计算
AKAMAI15 小时前
通过自动化本地计算磁盘与块存储卷加密保护数据安全
人工智能·云计算
tb_first21 小时前
k8sday11服务发现(2/2)
docker·云原生·容器·kubernetes·k8s
zxcxylong1 天前
almalinux9.6系统:k8s可选组件安装(1)
云原生·容器·kubernetes·metrics·almalinux·hpa·vpa
mdkk6781 天前
广州曼顿智能断路器:让用电更聪明,生活更安心!
生活
一个天蝎座 白勺 程序猿1 天前
Apache IoTDB(4):深度解析时序数据库 IoTDB 在Kubernetes 集群中的部署与实践指南
数据库·深度学习·kubernetes·apache·时序数据库·iotdb