Kubernetes的资源管理

目录

secret

        创建secret

        内容用base64编码,创建secret

使用方式

              将secret挂载到volume中,以volume 的形式挂载到 pod 的某个目录下

小结 

ConfigMap

        创建configMap

                使用字面值创建

        使用configMap设置命令行参数

小结

通过数据卷插件使用configMap

小结

        configMap的热更新


secret

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

        由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。

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

secret有三种类型:

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

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

kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息。

Pod需要先引用才能使用某个secret,Pod有3种方式来使用secret:

●作为挂载到一个或多个容器上的卷中的文件。

●作为容器的环境变量。

● 由kubelet在为Pod拉取镜像时使用。

应用场景:凭据

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

        创建secret

创建俩个文件

[root@master01 ~/secret]# echo -n "zhangsan" > username.txt
[root@master01 ~/secret]# echo "abc123" > passwd.txt
[root@master01 ~/secret]# kubectl create secret generic mysecret --from-file=username.txt --from-file=passwd.txt
secret/mysecret created
[root@master01 ~/secret]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
basic-auth            Opaque                                1      42h
default-token-c47tg   kubernetes.io/service-account-token   3      5d19h
mysecret              Opaque                                2      8s
tls-secret            kubernetes.io/tls                     2      42h

 

 

        内容用base64编码,创建secret

[root@master01 ~/secret]# cat username.txt |base64
emhhbmdzYW4=
[root@master01 ~/secret]# cat passwd.txt |base64
YWJjMTIzCg==

编写一个 Secret 配置文件

[root@master01 ~/secret]# vim mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret02
type: Opaque
data:
  username.txt: emhhbmdzYW4=
  passwd.txt: YWJjMTIzCg==
[root@master01 ~/secret]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
basic-auth            Opaque                                1      42h
default-token-c47tg   kubernetes.io/service-account-token   3      5d19h
mysecret              Opaque                                2      12m
mysecret02            Opaque                                2      11s
tls-secret            kubernetes.io/tls                     2      43h
[root@master01 ~/secret]# kubectl describe secrets mysecret02
Name:         mysecret02
Namespace:    default
Labels:       <none>
Annotations:  <none>
​
Type:  Opaque
​
Data
====
passwd.txt:    7 bytes
username.txt:  8 bytes
 

使用方式

              将secret挂载到volume中,以volume 的形式挂载到 pod 的某个目录下

生成yaml文件

[root@master01 ~/secret]# kubectl run secret-pod1 --image=nginx --port=80 --dry-run=client -o yaml > demo-pod.yaml
​
[root@master01 ~/secret]# vim demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: secret-pod1
  name: secret-pod1
spec:
  containers:
  - image: nginx
    name: secret-pod1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: mysecret
      mountPath: "/opt/mysecret01"
      readOnly: true
    - name: mysecret02
      mountPath: "/opt/mysecret02"
      readOnly: true
  volumes:
  - name: mysecret
    secret:
      secretName: mysecret
  - name: mysecret02
    secret:
      secretName: mysecret02
​
[root@master01 ~/secret]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
secret-pod1   1/1     Running   0          8s

进入容器

[root@master01 ~/secret]# kubectl exec -it secret-pod1 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@secret-pod1:/# cd /opt/
root@secret-pod1:/opt# ls
mysecret01  mysecret02
root@secret-pod1:/opt# cd mysecret01/
root@secret-pod1:/opt/mysecret01# ls
passwd.txt  username.txt
root@secret-pod1:/opt/mysecret01# cat passwd.txt
abc123
root@secret-pod1:/opt/mysecret01# cat username.txt
zhangsanroot@secret-pod1:/opt/mysecret01# cd ../mysecret02/
root@secret-pod1:/opt/mysecret02# ls
passwd.txt  username.txt
root@secret-pod1:/opt/mysecret02# cat passwd.txt
abc123
root@secret-pod1:/opt/mysecret02# cat username.txt
将secret导出到环境变量中I
首先,再创建一个用户和密码

[root@master01 ~]# echo lisi | base64
bGlzaQo=
[root@master01 ~]# echo 123123 | base64
MTIzMTIzCg==

生成mysecret.yaml

[root@master01 ~/secret]# vim mysecret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret03
type: Opaque
data:
  username: bGlzaQo=
  passwd: MTIzMTIzCg==

[root@master01 ~/secret]# kubectl apply -f mysecret.yaml
secret/mysecret03 created
[root@master01 ~/secret]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
basic-auth            Opaque                                1      2d21h
default-token-c47tg   kubernetes.io/service-account-token   3      6d22h
mysecret              Opaque                                2      26h
mysecret02            Opaque                                2      26h
mysecret03            Opaque                                2      7s
tls-secret            kubernetes.io/tls                     2      2d21h
[root@master01 ~/secret]# kubectl get secrets mysecret03 -o yaml
apiVersion: v1
data:
  passwd: MTIzMTIzCg==
  username: bGlzaQo=
.....
创建secret pods资源

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: secret-pod2
  name: secret-pod2
spec:
  containers:
  - image: nginx
    name: secret-pod2
    ports:
    - containerPort: 80
    env:
    - name: SECRET_USERNAEM
      valueFrom:
        secretKeyRef:
          name: mysecret03
          key: username
    - name: SECRET_PASSWD
      valueFrom:
        secretKeyRef:
          name: mysecret02
          key: passwd.txt
[root@master01 ~/secret]# kubectl apply -f secret-test.yaml
pod/secret-pod2 created
[root@master01 ~/secret]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
secret-pod1   1/1     Running   0          26h
secret-pod2   1/1     Running   0          21s

查看env

[root@master01 ~/secret]# kubectl exec -it secret-pod2 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future versi                                                                                     on. Use kubectl exec [POD] -- [COMMAND] instead.
root@secret-pod2:/# env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=secret-pod2
PWD=/
PKG_RELEASE=1~bullseye
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
SECRET_USERNAEM=lisi

NJS_VERSION=0.7.1
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
SECRET_PASSWD=abc123

KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.21.5
_=/usr/bin/env
root@secret-pod2:/# echo $SECRET_USERNAME

root@secret-pod2:/# echo $SECRET_USERNAME

root@secret-pod2:/# echo $SECRET_USERNAEM
lisi
root@secret-pod2:/# echo $SECRET_PASSWD
abc123

小结 

创建secret

kubectl create secret generic 资源名称--from-file=XXX ...

XXXyaml

......

type : Opaque

data :

KEY: VALUE

文件名 值

作为 卷 挂载到pod 的容器中

volumes:
- name:
  secret:
    secretName:
container:
- name :
  image:
  volumeMount:
  - name:
    mountPath:
    readonly : true
  
作为环境变量在容器中使用

container:
- name :
  image:
  env:
  - name :
    valueFrom :
      secretKeyRef:
        name: secret资源的名称
        key: secret资源中的健的名称

代表的是这个环境变量的值将会引用某个secret资源的某个键的值

ConfigMap

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

                                                                                                ------官方文档

        与secret类似,区别在于configMap保存的是不需要加密配置的信息。 ConfigMap 功能在Kubernetes1.2版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。configMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制对象。

应用场景:应用配置

首先再在configmap目录中,创建俩个用户和密码

[root@master01 ~]# mkdir configMap
[root@master01 ~]# cd configMap/
[root@master01 ~/configMap]# echo zhangsan > username.txt
[root@master01 ~/configMap]# echo lisi > username
[root@master01 ~/configMap]# echo 123123 > passwd.txt
[root@master01 ~/configMap]# echo adc123 > passwd
[root@master01 ~/configMap]# vim passwd.txt
[root@master01 ~/configMap]# ls
passwd  passwd.txt  username  username.txt
[root@master01 ~/configMap]# kubectl create cm mycm01 --from-file=/root/configMap/
configmap/mycm01 created

        创建configMap

[root@master01 ~/configMap]# kubectl create cm mycm01 --from-file=/root/configMap/
configmap/mycm01 created
[root@master01 ~/configMap]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      6d22h
mycm01             4      14s

查看yaml文件

 

还可以指定多个目录进行创建

[root@master01 ~/configMap]# kubectl create cm mycm02 --from-file=/root/configMap/username --from-file=passwd
configmap/mycm02 created
[root@master01 ~/configMap]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      6d22h
mycm01             4      11m
mycm02             2      4s

--from-file指定在目录下的所有文件都会被用在configNap里面创建一个键值对,键的名字就是文件名,值就是文件的内容

                使用字面值创建

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

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

比如:

[root@master01 ~/configMap]# kubectl create cm mycm03 --from-literal=animal=Dog --from-literal=class=yys
configmap/mycm03 created
[root@master01 ~/configMap]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      6d23h
mycm01             4      20m
mycm02             2      9m23s
mycm03             2      5s
[root@master01 ~/configMap]# kubectl get cm mycm03 -o yaml
apiVersion: v1
data:
  animal: Dog
  class: yys
kind: ConfigMap
metadata:
  creationTimestamp: "2022-05-30T12:31:19Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:animal: {}
        f:class: {}
    manager: kubectl-create
    operation: Update
    time: "2022-05-30T12:31:19Z"
  name: mycm03
  namespace: default
  resourceVersion: "49193"
  uid: 7a0ae404-d9e0-4cdc-923c-08e71dba914e

pod的创建

[root@master01 ~/configMap]# vim demo-cm1.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: cm-pod1
  name: cm-pod1
spec:
  containers:
  - image: nginx
    name: cm-pod1
    ports:
    - containerPort: 80
    env:
    - name: CM_USERNAME
      valueFrom:
        configMapKeyRef:
          name: mycm02
          key: username
    - name: CM_PASSWD
      valueFrom:
        configMapKeyRef:
          name: mycm02
          key: passwd
    envFrom:
    - configMapRef:
        name: mycm03
[root@master01 ~/configMap]# kubectl apply -f demo-cm1.yaml
pod/cm-pod1 created
[root@master01 ~/configMap]# kubectl get pods
NAME          READY   STATUS              RESTARTS   AGE
cm-pod1       0/1     ContainerCreating   0          5s
secret-pod1   1/1     Running             0          27h
secret-pod2   1/1     Running             0          47m

进入容器查看env

        使用configMap设置命令行参数

[root@master01 ~/configMap]# vim demo-cm2.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: cm-pod2
  name: cm-pod2
spec:
  containers:
  - image: nginx
    name: cm-pod2
    ports:
    - containerPort: 80
    env:
    - name: CM_USERNAME
      valueFrom:
        configMapKeyRef:
          name: mycm02
          key: username
    - name: CM_PASSWD
      valueFrom:
        configMapKeyRef:
          name: mycm02
          key: passwd
    envFrom:
    - configMapRef:
        name: mycm03
    command:
    - sh
    - -c
    - echo "my name is $(CM_USERNAME), my passwd is $(CM_PASSWD)"
  restartPolicy: Never
[root@master01 ~/configMap]# kubectl apply -f demo-cm2.yaml
pod/cm-pod2 created
[root@master01 ~/configMap]# kubectl get pods
NAME          READY   STATUS      RESTARTS   AGE
cm-pod1       1/1     Running     0          9m30s
cm-pod2       0/1     Completed   0          26s
secret-pod1   1/1     Running     0          27h
secret-pod2   1/1     Running     0          57m
[root@master01 ~/configMap]# kubectl logs cm-pod2
my name is lisi
, my passwd is adc123

它是不会重启的

小结

kubectl create cm资源名称--from-file=目录/文件
kubectl create cm资源名称--from-literal=KEY=VALUE ....

container:
- name:
  image:
  env:       代表的是自定义环境变量,变量值将会引用某个configMap资源的某个键的值
  - name:
    valueFrom :
      configMapKeyRef:
        name: configMap资源的名称
        key: configMap资源中的键的名称
envFrom:  代表的是将会用configMap资源的键作为容器中的环境变量名,键的值作为变量的值
- configMapRef: 
    name: configMap资源的名称

通过数据卷插件使用configMap

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

[root@master01 ~/configMap]# vim demo-cm3.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: cm-pod3
  name: cm-pod3
spec:
  containers:
  - image: nginx
    name: cm-pod3
    ports:
    - containerPort: 80
    volumeMounts:
    - name: mycm01
      mountPath: "/opt/mycm01"
      readOnly: true
    - name: mycm02
      mountPath: "/opt/mycm02"
      readOnly: true
  volumes:
  - name: mycm01
    configMap:
      name: mycm01
  - name: mycm02
    configMap:
      name: mycm03

挂载结果

[root@master01 ~/configMap]# kubectl apply -f demo-cm3.yaml
pod/cm-pod3 created
[root@master01 ~/configMap]# kubectl get pods
NAME          READY   STATUS      RESTARTS   AGE
cm-pod1       1/1     Running     0          24m
cm-pod2       0/1     Completed   0          15m
cm-pod3       1/1     Running     0          29s
secret-pod1   1/1     Running     0          27h
secret-pod2   1/1     Running     0          72m
[root@master01 ~/configMap]# kubectl describe cm mycm01
Name:         mycm01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
passwd:
----
adc123

passwd.txt:
----
123123

username:
----
lisi

username.txt:
----
zhangsan

Events:  <none>
[root@master01 ~/configMap]# kubectl exec -it cm-pod3 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@cm-pod3:/# cd opt/
root@cm-pod3:/opt# ls
mycm01  mycm02
root@cm-pod3:/opt# cd mycm01/
root@cm-pod3:/opt/mycm01# ls
passwd  passwd.txt  username  username.txt
root@cm-pod3:/opt/mycm01# cat passwd
adc123
root@cm-pod3:/opt/mycm01# cat passwd.txt
123123
root@cm-pod3:/opt/mycm01# cat username
lisi
root@cm-pod3:/opt/mycm01# cat username.txt
zhangsan

小结

spec:
  volumes:
  - name: 卷的名称
    configMap:
    name: CM资源的名称
containers:
- name:
  image:
  volumeMounts:
  - name: 卷的名称
    mountPath: 挂戟点
    readOnly: true|false

容器的挂载目录中文件名 即是CM资源数据的键 文件内容即是键的值

        configMap的热更新

比如,修改mycm03的键和值

[root@master01 ~/configMap]# kubectl edit cm mycm03
.....
apiVersion: v1
data:
  animal: Cat
  class: DevOps
....

进入容器,查看是否改变值

[root@master01 ~/configMap]# kubectl exec -it cm-pod3 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@cm-pod3:/# cd /opt/mycm02/
root@cm-pod3:/opt/mycm02# ls
animal  class
root@cm-pod3:/opt/mycm02# cat animal
Catroot@cm-pod3:/opt/mycm02# cat class
DevOpsroot@cm-pod3:/opt/mycm02#

热更新configMap资源后

使用env 引用configMap资源的变量的值是不会同步更新的

使用volumes挂载引用的方式,文件的内容是会同步更新的(大概10秒左右完成)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柏ぁ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值