K8S - 配置资源管理

ZYC·2024-03-07 17:16·39 次阅读

K8S - 配置资源管理

配置资源管理

ConfigMap资源(简称给cm)#

用于保存配置文件,环境变量等不需要加密的信息。它可以实现将配置信息与应用程序解耦

 

 

 

 

kubectl run pod-demo --image=soscscs/myapp --port=80 --dry-run=client -o yaml > pod-demo.yaml

 

 

kubectl create cm cm-demo1 --from-file=./hanbao.txt --from-file=./index.html --from-literal=myname=hanbao

 

 

 

 

复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: pod-demo1
  name: pod-demo1
spec:
  volumes:
  - name: vol-cm
    configMap:
      name: cm-demo1
  containers:
  - image: soscscs/myapp:v1
    name: pod-demo
    ports:
    - containerPort: 80
    volumeMounts:
    - name: vol-cm
      mountPath: /var/www/html
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
复制代码

 

 

 

 #实现动态更新(热更新)

 

 

 

 

Pod 中使用 ConfigMap#

 

 

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

 

 

 

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

 

 

通过数据卷插件使用ConfigMap #

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

 

 

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

 

 

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 的认证信息。
●kubernetes.io/tls :用来存储 TLS 证书和私钥信息。

Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:
●作为挂载到一个或多个容器上的卷 中的文件。
●作为容器的环境变量。
●由 kubelet 在为 Pod 拉取镜像时使用。

应用场景:凭据
https://kubernetes.io/docs/concepts/configuration/secret/
复制代码

 

 

 

 

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

 

 

 

kubectl describe secret mysecret

 

内容用 base64 编码,创建Secret#

echo -n zhangsan | base64

echo -n abc1234 | base64

 

 

 

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

 

 

 

 

使用方式 #

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

 

 

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

 

 

 #

将 Secret 导出到环境变量中#

 

 

复制代码
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
    envFrom:
    - secretRef:
        name: mysecret1
复制代码

 

 

 

 

总结#

复制代码
ConfigMap资源(简称给cm): #用于保存配置文件,环境变量等不需要加密的信息。它可以实现将配置信息与应用程序解耦
#创建cm资源
kubectl create cm <资源名称> --from-file=文件|目录 --from-literal=<键名>=<键值>
#查看cm资源数据
kubectl get -n <命名空间> cm <cm资源名称> -o yaml
kubectl describe -n <命名空间> cm <cm资源名称>

#使用cm资源
作为存储卷挂载的方式:
在Pod资源配置中spec.volumes字段设置configMap类型的卷
在容器配置中用volumeMounts将卷挂载到容器的指定的目录,cm资源数据的键名会作为文件名,cm资源数据的键值会作为文件内容(支持热更新)
在容器中用volumeMounts.subFath字段指定文件名,实现将卷挂载到容器中指定的文件上(不支持热更新)    --以文件形式挂载

作为容器环境变量方式(不支持热更新)
在容器配置中用env.name字段自定义容器的环境变量名,用env.valueFrom.configMapKeyRef.key/name字段指定环境变量的值从哪个cm资源的键获取
在容器配置中用envFrom.configMapRef.name字段指定cm资源的名称,使得cm资源数据的键名和键值直接作为容器的环境变量名和值


--------------------------------------
Secret资源  #用于保存密码文件、ssl证书/私钥文件、token令牌字符串、镜像私有仓库认证信息等需要加密的敏感信息
Secret的主要目的是将民昂数据与应用程序代码分离,提供一种安全的方式来存储和传递这些敏感数据给容器化的应用程序。它们已加密的形式保存,并且只能在需要时才能被解密和使用

#Secret的4种类型:
kubernetes.io/service-account-token: 当创建serviceaccount账户资源后K8S会自动创建同名的secert资源,用于Pod访问apiserver时会使用此Secret卷中的token做认证

Opaque: 默认的Secret资源类型,可以通过选项引用文件、目录、键值队的方式创建Secret资源,并且资源数据的键值会被自动转换为base64编码格式加密


kubernetes.io/dockerconfigjson: 用户存储K8S从Harbor等镜像私有仓库拉取镜像时做认证的信息


#创建Secret资源
kubectl create secret generic <资源名称> --from-file=文件|目录 --from-literal=<键名>=<键值>
kubectl create secret docker-registry secret-harbor -dockear-server=<私有仓库URL路径> --docker-username=<仓库用户名> --docker-pasword-<用户密码> --docker-email=<邮箱地址>
kubectl create secret tls<资源名称> --cert=证书文件 --key=私钥文件


#查看Secret资源(键值会以base64编码格式加密显示)
kubectl get -n <命名空间> secret <secret资源名称> -o yaml
kubectl describe -n <命名空间> secret <secret资源名称>



#使用Secret资源
作为存储卷挂载的方式:
在Pod资源配置中用spec.volumes字段设置secret类型的卷
在容器配置中用volumeMounts将卷挂载到容器的指定的目录,secret资源数据的键名会作为文件名,secret资源数据的键值会作为文件内容

#作为容器环境变量的方式:
在容器配置中用env.name字段自定义容器的环境变量名,用env.volueFrom.secretKeyRef.key/name字段指定环境变量的值从哪个Secret资源的键获取
在容器配置中用envFrom.secretRef.name字段指定secret资源的名称,使得secret资源数据的键名和键值直接作为容器的环境变量名和值

#Pod配置从私有仓库拉取镜像:
在Pod资源配置中用spec,imagePullsecrets.name字段指定kubernetes.io/dockerconfigjson类型的secret资源名称
复制代码

 

posted @   citywalk  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
目录