K8s----资源管理

目录

一、Secret

[1、创建 Secret](#1、创建 Secret)

[1.1 用kubectl create secret命令创建Secret](#1.1 用kubectl create secret命令创建Secret)

[1.2 内容用 base64 编码,创建Secret](#1.2 内容用 base64 编码,创建Secret)

2、使用方式

[2.1 将 Secret 挂载到 Volume 中,以 Volume 的形式挂载到 Pod 的某个目录下](#2.1 将 Secret 挂载到 Volume 中,以 Volume 的形式挂载到 Pod 的某个目录下)

[2.2 将 Secret 导出到环境变量中](#2.2 将 Secret 导出到环境变量中)

二、ConfigMap

[1、创建 ConfigMap](#1、创建 ConfigMap)

[1.1 使用目录创建](#1.1 使用目录创建)

[1.2 使用文件创建](#1.2 使用文件创建)

[1.3 使用字面值创建](#1.3 使用字面值创建)

[2、Pod 中使用 ConfigMap](#2、Pod 中使用 ConfigMap)

[2.1 使用 ConfigMap 来替代环境变量](#2.1 使用 ConfigMap 来替代环境变量)

[2.2 用 ConfigMap 设置命令行参数](#2.2 用 ConfigMap 设置命令行参数)

[2.3 通过数据卷插件使用ConfigMap](#2.3 通过数据卷插件使用ConfigMap)


一、Secret

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

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 的认证信息。

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

  • 作为挂载到一个或多个容器上的卷中的文件。
  • 作为容器的环境变量。
  • 由 kubelet 在为 Pod 拉取镜像时使用。

应用场景:凭据

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

1、创建 Secret

1.1 用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

#查看创建的secrets
kubectl get secrets

#查看详细信息
kubectl describe secret mysecret

1.2 内容用 base64 编码,创建Secret

cs 复制代码
echo -n zhangsan | base64
emhhbmdzYW4K=

echo -n abc1234 | base64
YWJjMTIzNAo==

vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret1
type: Opaque
data:
  username: emhhbmdzYW4K=
  password: YWJjMTIzNAo==

kubectl create -f secret.yaml 

kubectl get secrets

#查看secret详细信息
kubectl get secret mysecret1 -o yaml

2、使用方式

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

cs 复制代码
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
cs 复制代码
#创建
kubectl create -f secret-test.yaml

#查看
kubectl get pods

2.2 将 Secret 导出到环境变量中

cs 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mypod1
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: TEST_USER
        valueFrom:
          secretKeyRef:
            name: mysecret1
            key: username
      - name: TEST_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret1
            key: password

二、ConfigMap

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

许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。

应用场景:应用配置

1、创建 ConfigMap

1.1 使用目录创建

cs 复制代码
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
cs 复制代码
kubectl create configmap game-config --from-file=/opt/configmap/
#--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
cs 复制代码
kubectl get cm
NAME          DATA   AGE
game-config   2      10s

#查看详细信息
kubectl get cm game-config -o yaml

1.2 使用文件创建

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

cs 复制代码
##--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

1.3 使用字面值创建

cs 复制代码
##使用文字值创建,利用 --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

2、Pod 中使用 ConfigMap

2.1 使用 ConfigMap 来替代环境变量

cs 复制代码
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的创建

cs 复制代码
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
NAME         READY   STATUS      RESTARTS   AGE
pod-test     0/1     Completed   0          33s
cs 复制代码
kubectl logs pod-test
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=/

2.2 用 ConfigMap 设置命令行参数

cs 复制代码
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

2.3 通过数据卷插件使用ConfigMap

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

cs 复制代码
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
 # vi special.how 
 # vi special.type 

//ConfigMap 的热更新

cs 复制代码
vim test-pod4.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: 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-pod5.yaml

kubectl get pods 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-76b6489f44-6dwxh   1/1     Running   0          46s

kubectl exec -it my-nginx-76b6489f44-6dwxh -- 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: 2021-05-25T07:59:18Z
  name: log-config
  namespace: default
  resourceVersion: "93616"
  selfLink: /api/v1/namespaces/default/configmaps/log-config
  uid: 1b8115de-bd2f-11eb-acba-000c29d88bba

//等大概10秒左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新

cs 复制代码
kubectl exec -it my-nginx-76b6489f44-6dwxh -- cat /etc/config/log_level
DEBUG

//ConfigMap 更新后滚动更新 Pod

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

cs 复制代码
kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210525" }}}}}'

kubectl get pods 
NAME                        READY   STATUS              RESTARTS   AGE
my-nginx-665dd4dc8c-j4k9t   0/1     ContainerCreating   0          4s
my-nginx-76b6489f44-6dwxh   0/1     Terminating         0          10m

kubectl get pods 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-665dd4dc8c-j4k9t   1/1     Running   0          74s

PS:更新 ConfigMap 后:

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

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

相关推荐
元气满满的热码式8 小时前
K8S中Service详解(一)
云原生·容器·kubernetes
元气满满的热码式11 小时前
K8S中ingress详解
云原生·容器·kubernetes
jcrose258012 小时前
Ubuntu二进制部署K8S 1.29.2
linux·ubuntu·kubernetes
lozhyf12 小时前
基于 JFinal 的国产微服务框架
微服务·云原生·架构
matrixlzp12 小时前
K8S 启动探测、就绪探测、存活探测
云原生·容器·kubernetes
Dusk_橙子12 小时前
在K8S中,如何使用EFK实现日志的统一管理?
云原生·容器·kubernetes
Tony115412 小时前
Kubernetes v1.28.0安装dashboard v2.6.1(k8s图形化操作界面)
云原生·容器·kubernetes
龙胖不下锅12 小时前
k8s资源预留
云原生·容器·kubernetes
超级阿飞12 小时前
利用Kubespray安装生产环境的k8s集群-排错篇
docker·容器·kubernetes
喝醉酒的小白12 小时前
在 Kubernetes 上快速安装 KubeSphere v4.1.2
云原生·容器·kubernetes