首页 > 其他分享 >k8s——secret配置资源管理

k8s——secret配置资源管理

时间:2024-06-07 09:04:58浏览次数:22  
标签:name yaml secret nginx Secret 3.3 k8s config 资源管理

一、Secret

  1.1 Secret定义

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

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

  1.3 使用secret方式

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

  1.4 Secret应用场景

Secrets | KubernetesA Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in a container image. Using a Secret means that you don't need to include confidential data in your application code.Because Secrets can be created independently of the Pods that use them, there is less risk of the Secret (and its data) being exposed during the workflow of creating, viewing, and editing Pods.icon-default.png?t=N7T8https://kubernetes.io/docs/concepts/configuration/secret/

二、Secret应用实例

  2.1 创建Secret

  2.1.1 用kubectl create secret命令创建Secret,在Kubernetes集群中创建一个名为mysecret的通用(generic)类型的Secret对象,并从本地文件中加载用户名和密码信息作为Secret的数据

这个命令执行的操作包括:

  • 创建一个名为mysecret的通用类型的Secret对象。
  • 使用--from-file选项从本地文件中加载数据,其中username.txt文件的内容将作为Secret对象中的用户名数据,而password.txt文件的内容将作为Secret对象中的密码数据。

这样,Kubernetes将会创建一个包含用户名和密码信息的Secret对象,可以在容器中挂载并使用这些敏感数据,而无需明文暴露在Pod的配置文件中。

get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑

  2.1.2 内容用base64编码,创建Secret

  2.1.2.1 base64编码
echo -n zhangsan | base64

echo -n bac1234 | base64

   2.1.2.2 编辑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
#指定了一个名为secrets的卷(volume),并将一个名为mysecret的Secret对象挂载到这个卷上。这样,Pod 中的容器就可以访问这个Secret对象中存储的敏感数据。

  2.1.2.3 运行yaml文件

  2.1.2.4 加密显示secret 

  2.2 使用Secret方式

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

  2.2.1.1 编辑yaml文件
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

  2.2.1.2 运行yaml文件
kubectl create -f secret-test.yaml

kubectl get pod 

  2.2.1.3 运行mypod,查看账户密码
kubectl exec -it mypod sh 

  2.2.2 将secret挂载到环境变量调用

  2.2.2.1 编辑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

  2.2.2.2 运行yaml文件

  2.2.2.3 运行mypod,查看账户密码

三、ConfigMap

  3.1 configmap定义

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

  3.2 configmap应用场景

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

  3.3 应用示例

  3.3.1 创建Configmap

  3.3.1.1 导入nginx.conf配置文件

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


kubectl create configmap nginx-config --from-file=nginx.conf


列出当前集群中的所有ConfigMap对象,并显示它们的名称、命名空间、数据等信息——kubectl get cm 

含义: 

kubectl create configmap nginx-config --from-file=nginx.conf:在当前创建一个名为nginx-config的configmap对象并将nginx.conf中的内容转移到该对象中。如果当前目录下没有nginx.conf文件,则会出现错误

kubectl get cm——列出当前集群中的所有ConfigMap对象,并显示它们的名称、命名空间、数据等信息

  3.3.1.2 查看nginx-config详细信息

  3.3.1.3 使用目录创建

  3.3.1.3.1 编辑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

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

  3.3.1.3.3 指定在目录下的所有文件都会被用在ConfigMap里面创建一个键值对

  3.3.1.3.4 以yaml格式查看game-config详细信息

  3.3.1.4 使用文件创建

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

  3.3.1.4.1 --from-file用来分别指定配置文件

  3.3.1.4.2 以yaml查看game-config-2

  3.3.1.4.3 详细查看game-config-2

  3.3.1.5 使用字面值创建
  3.3.1.5.1 使用文字值创建,利用--from-literal参数传递配置信息,该参数可以使用多次

  3.3.1.5.2 清除所有cm和pod

  3.3.1.5.3 举例说明
  3.3.1.5.3.1 编辑内容,使用文字值创建,利用--from-literal参数传递配置信息

  3.3.1.5.3.2 查看详细信息

  3.3.1.5.4 调用方式
  3.3.1.5.4.1 编辑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-nj
  containers:
  - name: myapp-cm-web
    image: soscscs/myapp:v1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: web-cm
      mountPath: /usr/share/nginx/html

  3.3.1.5.4.2 运行yaml文件

  3.3.2 Pod中使用ConfigMap

  3.3.2.1 使用ConfigMap来替代环境变量
  3.3.2.1.1 编辑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 #记录信息level(正常级别)日志

  3.3.2.1.2 运行env.yaml文件

  3.3.2.1.3 编辑test-pod文件

  3.3.2.1.4 运行yaml文件

  3.3.2.1.5 查看test-pod日志信息

  3.3.2.2 用ConfigMap设置命令行参数
  3.3.2.2.1 编辑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

  3.3.2.2.2 运行yaml文件

  3.3.2.2.3  查看test-pod日志信息

  3.3.2.3 通过数据卷插件使用ConfigMap

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

  3.3.2.3.1 编辑test-pod.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

   3.3.2.3.2 运行yaml文件

  3.3.2.3.3 进入test-pod3查看内容

  3.3.2.4 ConfigMap的热更新

    相关标签查看可用命令——kubectl api-resources

  3.3.2.4.1 编辑test-pod4文件
#ConfigMap 的热更新(如果少加参数可以在外面直接热更新)
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

  3.3.2.4.2 运行yaml文件

  3.3.2.4.3 进入my-nginx-xxxx查看内容

  3.3.2.4.4 查看log-config

  3.3.2.4.5 数据同步更新

  3.3.2.4.6 ConfigMap更新后滚动更新Pod

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

更新ConfigMap后:

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

标签:name,yaml,secret,nginx,Secret,3.3,k8s,config,资源管理
From: https://blog.csdn.net/sea_bunch/article/details/139471800

相关文章

  • k8s——安全机制
    一、安全机制说明  Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。APIServer是集群内部各个组件通信的中介,也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护APIServer来设计的。 比如kubectl如果想向APIServer请求资......
  • Android基础-资源管理
    在深入探讨Android系统的资源管理机制时,我们首先需要理解Android作为一个开放源代码的移动操作系统,其资源管理机制的核心目的是确保应用程序能够高效、安全地访问和使用系统资源,从而为用户提供流畅、稳定的用户体验。以下是对Android系统资源管理机制的详细解析。一、资源分类......
  • k8s 集群升级
    1.升级概要k8s版本:以x.y.z表示,其中x是主要版本,y是次要版本,z是补丁版本,不能跳过次要版本升级,比如1.28.0->1.30.0,补丁版本可以跳跃更新,比如1.28.0->1.28.10推荐使用与版本匹配的kubelet和kubeadm,最好各组件版本保持一致升级后,因为容器spec的哈希值已更改,所有容器都......
  • k8s - namespace
    简介命名空间,可以根据ns区分业务线、应用、权限一般默认命名空间指向default,可以在kubeconfig中修改默认配置清单文件apiVersion:v1kind:Namespacemetadata:#命名空间名称name:yky常用操作#创建名为yky的nskubectlcreatensyky#删除名为yky......
  • 修改k8s pod的hosts文件
    当我们服务需要使用自定义的域名解析时,就需要修改pod内hosts文件。而如果我们在pod内部修改后,下次重启依然会丢,所有下面用两种方式实现持久化修改: 1.当集群内所有或者大部分服务都需要修改hosts文件时,我们可以修改CoreDNS的configmap文件 kubectleditcm-nkube-systemco......
  • k8s-pod参数详解
    目录概述创建Pod编写一个简单的Pod添加常用参数为Pod的容器分配资源网络相关Pod健康检查启动探针存活探针就绪探针作用整个Pod参数配置创建docker-registry卷挂载结束概述  k8s中的pod参数详解。官方文档  版本k8s1.27.x、busybox:stable-musl、nginx:sta......
  • k8s 证书过期处理
    问题kubeadm安装的集群默认签发的证书有效期为1年,到期后集群组件之间无法正常通信。证书修复流程1.检查当前证书状态$kubeadmcertscheck-expiration[check-expiration]Readingconfigurationfromthecluster...[check-expiration]FYI:Youcanlookatthisconfig......
  • k8s配置节点亲和性yaml示例:根据节点名称来配置节点亲和性(node affinity)
    在Kubernetes中,根据节点名称来配置节点亲和性(nodeaffinity)通常不是直接通过节点名称实现的,而是通过为节点添加特定的标签,然后在Pod的亲和性规则中匹配这些标签。不过,有一种特殊情况是使用NodeAffinity的nodeSelectorTerms中的matchExpressions,通过设置operator为In并使用......
  • k8s - 二进制部署[阿里云]
    概述部署前先了解一下k8s需要的组件和所处的位置,并且为了保证安全,k8s各组件之间通信都需要信任,这就引出了k8s从入门到放弃的证书部署步骤我这次是在阿里云上部署,所以包括了一些云产品云产品介绍eip动态公网ip,和nat网关绑定后,内网服务器才可以访问公网nat网关,所有k8s......
  • 搭建高可用k8s
    搭建k8s高可用高可用只针对于api-server,需要用到nginx+keepalived,nginx提供4层负载,keepalived提供vip(虚拟IP)系统采用openEuler22.03LTS1.前期准备因为机器内存只有16G,所有我采用3master+1node主机名IPVIPmaster01192.168.200.163192.168.200.200mast......