K8S:配置资源管理 Secret和configMap

文章目录

一.Secret

1.Secret概念

(1)Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 secret 中是为了更方便的控制如何使用数据,并减少暴露的风险

(2)类似挂载的方式,使用的时候调用即可

2.Secret的类型

①kubernetes.io/service-account-token

由Kubernetes自动创建,用来访问APIServer 的 Secret, Pod会默认使用这个 Secret 与 APIServer 通信,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中

②opaque

base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的Secret 类型

③kubernetes.io/dockerconfigjson

用来存储私有 docker registry 的认证信息

④kubernetes.io/tls

用于为ssl通信模式存储证书和私钥文件,是命令式创建的类型标识符为tls

3.secret的三种参数

①tls

仅用于存储私钥和证书

②docker-registry

若要保存docker仓库的认证信息的话,就必须使用此种类型来创建

③generic

通常用于存储密码数据------通用类型

4.Pod 的3种方式来使用secret

(1)作为挂载到一个或多个容器上的卷 中的文件

(2)作为容器的环境变量

(3)由 kubelet 在为 Pod 拉取镜像时使用

应用场景:凭据

https://kubernetes.io/docs/concepts/configuration/secret/

5.Secret创建及案例

(1)创建Secret

①用kubectl create secret命令创建Secret
echo -n 'zhangsan' > username.txt
echo -n 'abc1234' > password.txt

kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt

kubectl get secrets
NAME                                 TYPE                                  DATA   AGE
default-token-59n24                  kubernetes.io/service-account-token   3      19d
mysecret                             Opaque                                2      5s
kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password.txt:  7 bytes
username.txt:  8 bytes
#get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑
②内容用 base64 编码,创建Secret
echo -n zhangsan | base64

emhhbmdzYW4=

echo -n abc1234 | base64

YWJjMTIzNA==

vim secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret1
type: Opaque
data:
  username: emhhbmdzYW4=
  password: YWJjMTIzNA==

kubectl create -f secret.yaml 

kubectl get secrets
NAME                                 TYPE                                  DATA   AGE
default-token-59n24                  kubernetes.io/service-account-token   3      19d
mysecret                             Opaque                                2      11m
mysecret1                            Opaque                                2      2m39s

kubectl get secret mysecret1 -o yaml

(2)使用Secret方式

①将Secret 挂载到 Volume 中,以 Volume 的形式挂载到 Pod 的某个目录下

不止一个pod可以挂

vim secret-test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret

kubectl create -f secret-test.yaml

kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
mypod                                     1/1     Running             0          32s

kubectl exec -it mypod bash
 # cd /etc/secrets/
 # ls
password.txt  username.txt
 # cat username.txt 
 # cat password.txt  
②将 Secret 导出到环境变量中调用
vim secret-test1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod1        
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: TEST_USER
        valueFrom:
          secretKeyRef:      #调用,此处调用的是kubectl get secret创建出来的mysecret1
            name: mysecret1
            key: username
      - name: TEST_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret1
            key: password

kubectl apply -f secret-test1.yaml 

kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
mypod1       1/1     Running   0          77s

kubectl exec -it mypod1 bash
 # echo $TEST_USER
zhangsan
 # echo $TEST_PASSWORD
abc1234

二.ConfigMap

1.ConfigMap概念

与Secret类似,区别在于configMap保存的是不需要加密配置的信息。

2.ConfigMap功能及应用场景

(1)ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。

ConfigMap API给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。

(2)应用场景: 应用配置

配置文件可用这种形式(例如nginx.conf\apache等配置文件)

2.ConfigMap创建及案例

(1)创建ConfigMap

导入配置文件方式
#导入nginx.conf配置文件
kubectl create configmap nginx-config -h(不会后面的参数可以使用h)查看
kubectl create configmap nginx-config --from-file=nginx.conf

kubectl get cm
#可查看详细数据
kubectl describe cm nginx-config
①使用目录创建
mkdir /opt/configmap/

vim /opt/configmap/game.properties

enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

vim /opt/configmap/ui.properties

color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

ls /opt/configmap/

game.properties
ui.properties

#--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
kubectl create configmap game-config --from-file=/opt/configmap/

kubectl get cm
NAME          DATA   AGE
game-config   2      10s
kubectl get cm game-config -o yaml

apiVersion: v1
data:
  game.properties: |
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
  ui.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
  creationTimestamp: 2021-05-25T06:49:18Z
  name: game-config
  namespace: default
  resourceVersion: "87803"
  selfLink: /api/v1/namespaces/default/configmaps/game-config
  uid: 541b5302-bd25-11eb-acba-000c29d88bba
②使用文件创建

只要指定为一个文件就可以从单个文件中创建 ConfigMap

--from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的

kubectl create configmap game-config-2 --from-file=/opt/configmap/game.properties --from-file=/opt/configmap/ui.properties

kubectl get configmaps game-config-2 -o yaml

kubectl describe cm game-config-2
③使用字面值创建

使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下

kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=good

kubectl get configmaps special-config -o yaml

apiVersion: v1
data:
  special.how: very					#key-value 结构
  special.type: good
kind: ConfigMap
metadata:
  creationTimestamp: 2021-05-25T06:59:37Z
  name: special-config
  namespace: default
  resourceVersion: "88610"
  selfLink: /api/v1/namespaces/default/configmaps/special-config
  uid: c4f45936-bd26-11eb-acba-000c29d88bba

kubectl delete cm --all
kubectl delete pod --all
  • 例子:

    vim index.html

    this is blue

    kubectl create cm web-blue --from-file=index.html
    kubectl get cm

kubectl describe cm web-blue

调用方式

vim web-blue.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: mypod-cm-web
  labels:
    run: myapp-cm-web
spec:
  volumes:
  - name: web-cm
    configMap:
      name: web-blue
  containers:
  - name: myapp-cm-web
    image: soscscs/myapp:v1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: web-cm
      mountPath: /usr/share/nginx/html

kubectl apply -f web-blue.yaml
kubectl get pod

kubectl get pod -owide
NAME                                      READY   STATUS              RESTARTS   AGE   IP             NODE     NOMINATED NODE   READI
mypod-cm-web                              1/1     Running             0          99s   10.244.2.179   node01   <none>           <none>

curl 10.244.2.179
<h1>this is blue</h1>
  • 配置nginx文件持久化,(解决了重启容器之后或者删除再新建),配置文件持久化(可以做redis等服务都可做)

(2)Pod 中使用 ConfigMap

①使用 ConfigMap 来替代环境变量
vim env.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: good
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO

kubectl create -f env.yaml 

kubectl get cm
NAME             DATA   AGE
env-config       1      6s
special-config   2      6s
#Pod的创建
vim test-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command: [ "/bin/sh", "-c", "env" ]
    env:
      - name: SPECIAL_HOW_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.how
      - name: SPECIAL_TYPE_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.type
    envFrom:
      - configMapRef:
          name: env-config
  restartPolicy: Never

kubectl create -f test-pod.yaml

kubectl get pods
kubectl logs test-pod

KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.0.0.1:443
HOSTNAME=pod-test
SHLVL=1
SPECIAL_HOW_KEY=very			#赋值变量 SPECIAL_HOW_KEY 的值为 special-config 的 special.how: very
HOME=/root
SPECIAL_TYPE_KEY=good			#赋值变量 SPECIAL_TYPE_KEY 的值为 special-config 的 special.type: good
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
log_level=INFO					#引入 env-config 的变量 log_level: INFO
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.0.0.1
PWD=/
②用 ConfigMap 设置命令行参数
vim test-pod2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod2
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command: 
	- /bin/sh
	- -c
	- echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
    env:
      - name: SPECIAL_HOW_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.how
      - name: SPECIAL_TYPE_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.type
    envFrom:
      - configMapRef:
          name: env-config
  restartPolicy: Never

kubectl create -f test-pod2.yaml

kubectl get pods
NAME        READY   STATUS      RESTARTS   AGE
test-pod2   0/1     Completed   0          34s
kubectl logs test-pod2

very good
③通过数据卷插件使用ConfigMap

在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容

vim test-pod3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod3
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command: [ "/bin/sh", "-c", "sleep 36000" ]
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
  restartPolicy: Never

kubectl create -f test-pod3.yaml 

kubectl get pods
NAME        READY   STATUS      RESTARTS   AGE
test-pod3   1/1     Running     0          5s
kubectl exec -it test-pod3 sh
 # cd /etc/config/
 # ls
special.how   special.type
 # cat special.how 
 # cat special.type 
④ConfigMap 的热更新

相关标签查看可用命令

kubectl api-resources

#ConfigMap 的热更新(如果少加参数可以在外面直接热更新)
vim test-pod4.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: log-config

kubectl apply -f test-pod4.yaml

kubectl get pods 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-c6df7db54-2nxlq                  1/1     Running             0          19s

kubectl exec -it my-nginx-c6df7db54-2nxlq -- cat /etc/config/log_level
#输出结果为以下
INFO

kubectl edit configmap log-config
apiVersion: v1
data:
  log_level: DEBUG		#INFO 修改成 DEBUG
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}}  #INFO 修改成 DEBUG
  creationTimestamp: "2023-09-26T13:44:58Z"
  name: log-config
  namespace: default
  resourceVersion: "104437"
  selfLink: /api/v1/namespaces/default/configmaps/log-config
  uid: 56a3b170-eb69-428b-81cd-c54dd561cbee

#等大概10秒左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新 
kubectl exec -it my-nginx-c6df7db54-2nxlq -- cat /etc/config/log_level
#输出结果为以下
DEBUG
⑤ConfigMap 更新后滚动更新 Pod

更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新

#少加参数在外面直接热更新
kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210525" }}}}}'

kubectl get pods 
NAME                        READY   STATUS              RESTARTS   AGE
my-nginx-699bf56d57-9krp7                 1/1     Running             0          8s
my-nginx-c6df7db54-2nxlq                  0/1     Terminating         0          6m7s
kubectl get pods 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-699bf56d57-9krp7                 1/1     Running             0          55s

PS:更新 ConfigMap 后:

●使用该 ConfigMap 挂载的 Env 不会同步更新。

●使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

1.secret三种类型

(1)Opaque:通用类型(通过文件、目录、变量创建)------默认的类型

(2)kubernetes.io/service-account-token:k8s自动创建的,给serviceaccount服务账户(pod在K8S集群内部的专属服务用户)访问挨批server使用

(3)kubernetes.io/dockerconfigjson(docker-registry):给K8S从harbor私有镜像仓储拉取镜像认证使用

2.创建secret资源

(1)kubectl create secret generic --from-file=文件------指定文件,还可以多次使用指定多个文件目录,应用目录中的所有文件

------from-literal-键值对(key-value)引用一个键值对,也可以引用多次

(2)kubectl create secret tls --cert=证书文件

--key=私有文件

(3)kubectl create secret docker-registry

3.secret资源使用

(1)挂载的方式

volumes:定义类型为secret的存储卷

volumeMounts:把存储卷挂载到容器目录,secret资源数据中的,键将以文件名的形式显示,值为文件内容

(2)容器的环境量的方式

env:定义容器的环境变量

使用value From,secretKeyRef,name指定secret资源名称,valueFrom,secretKeyRef

,key指定secret资源数据的键名,从而确定引用哪个键的值

(3)K8s从harbor等私有仓库拉取镜像时使用

imagePull secret指定Kubernetes.io/dockerconfigjson类型的secret来作为连接私有仓库的认证信息

4.configMap cm

(1)创建 cm 资源

kubectl create cm --from-flie=文件/目录

                  --from-literal=KEY=VALUE

#查看资源中的数据都是以明文的格式显示key的值
kubectl describe cm 或者kubectl get cm -o yaml

(2)cm资源使用

容器环境变量的方式

env:需要另外自定义环境变量名,通过指定的cm资源名称和key,名称来给这个变量来赋值

envFrom:不需要另外自定义环境变量名,直接是要cm资源的key作为容器中的环境变量名,value作为这个环境变量的值。z

(3)挂载的方式

volume 定义类型,configMap的存储卷

volumeMounts:把存储卷挂载到容器目录,cm资源数据中的键将以文件名的形式显示,值为文件内容,如果把存储卷挂载成容器中的文件,subPath指定文件名

(4)cm资源热更新

更新,资源的数据,可以同步更新,通过volume挂载的使用cm配置的pod资源中的配置,如果使用env或envFrom方式引用cm资源,则不会同步更新pod资源中的配置

(5)secret概念

保存密码,密钥文件,token字符串之类的敏感数据

通过kubectl describe 或者kubectl get -oyaml查看是看不到实际的内容,内容是通过bases 64编码格式

(6)configMap概念

保存配置文件,环境变量,命令行参数之类的不需要加密的信息,查看时是以明文的显示内容,他们的数据都是以 键值对 的方式保存。

相关推荐
鲁正杰25 分钟前
在一个服务器上抓取 Docker 镜像并在另一个服务器上运行
运维·服务器·docker
aherhuo1 小时前
基于openEuler22.09部署OpenStack Yoga云平台(一)
linux·运维·服务器·openstack
WebDeveloper20011 小时前
如何使用美国域名中心US Domain Center和WordPress创建商业网站
运维·服务器·css·网络·html
老大白菜1 小时前
Windows 11 安装 Dify 完整指南 非docker环境
windows·docker·容器
檀越剑指大厂1 小时前
【Linux系列】Shell 脚本中的条件判断:`[ ]`与`[[ ]]`的比较
linux·运维·服务器
2301_819287123 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la3 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
武汉联从信息4 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
天天进步20154 小时前
STUN服务器实现NAT穿透
运维·服务器
PieroPc4 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化