ITPub博客

首页 > Linux操作系统 > Linux操作系统 > kubernetes集群常用资源(二)!

kubernetes集群常用资源(二)!

原创 Linux操作系统 作者:老男孩Linux 时间:2025-11-25 13:47:03 0 删除 编辑

   configmap介绍

   | configmap和secret

  在K8S中,有两种方式管理资源的配置,分别是configmap和secret,他们的最大区别是:

  configmap用来管理明文配置

  secret用来管理密文配置

  | 怎么使用configmap

  创建configmap资源

  在deploy中定义congfigmap类型的volumes

  在deoloy的containers中挂载此volumes

  | 更新configmap配置的方法

  单配置更新法:

  修改configmap资源清单并应用

  重启使用该configmap资源的pod

  多配置更换法:

  准备多个configmap资源

  修改dp中使用的configmap

  重新apply该dp,pod会自动重启

   configmap资源创建

  | 参考案例1

apiVersion: v1
kind: ConfigMap
metadata:name: oldboyedu-database-config
data:
  # 单行数据
  name: "oldboy"
  age: "20"
  # 多行数据
  my.cnf: |
    host: 10.0.0.102
    port: 13306
    socket: /tmp/mysql.sock
    username: root
    password: oldboyedu
  redis.conf: |
    host: 10.0.0.103
    port: 6379
    requirepass: oldboyedu

  | 参考案例2

apiVersion: v1
kind: ConfigMap
metadata:name: oldboyedu-nginx
data:
  nginx.conf: |
      worker_processes 1;
      events {
          worker_connections 1024;
      }
      http {
          include       mime.types;
          default_type application/octet-stream;
          sendfile       on;
          keepalive_timeout 65;
          # include /usr/local/nginx/conf/conf.d/*.conf;
          server {
              listen       81;
              root       /usr/local/nginx/html/bird/;
              server_name   game01.oldboyedu.com;
          }
     
          server {
              listen       82;
              root       /usr/local/nginx/html/pinshu/;
              server_name   game02.oldboyedu.com;
          }
     
          server {
              listen       83;
              root       /usr/local/nginx/html/tanke/;
              server_name   game03.oldboyedu.com;
          }
     
          server {
              listen       84;
              root       /usr/local/nginx/html/pingtai/;
              server_name   game04.oldboyedu.com;
          }
     
          server {
              listen       85;
              root       /usr/local/nginx/html/chengbao/;
              server_name   game05.oldboyedu.com;
          }
      }

   使用configmap资源

  | 基于存储卷的方式挂载

kind: Pod
apiVersion: v1
metadata:name: oldboyedu-linux-configmap
labels:
    apps: myweb
spec:nodeName: 10.0.0.102volumes:- name: myweb   # 定义数据卷类型是configMap.
  configMap:
     # 引用configMap的名称.
    name: oldboyedu-nginx     # 引用configMap的具体的Key相关信息.
    items:
       # 指定configmap的key名称,该名称必须在cm资源中存在.
    - key: nginx.conf       # 可以暂时理解为挂载到容器的名称.
      path: oldboyedu-linux-nginx.conf- name: oldboyedu-db
  configMap:
    name: oldboyedu-database-config
    items:
    - key: my.cnf
      path: oldboyedu-linux-my.cnf    - key: name
      path: oldboyedu-linux-name    - key: redis.conf
      path: oldboyedu-linux-redis.conf
containers:- name: linux-web
  image: 10.0.0.101:5000/nginx:1.20.1
  volumeMounts:
  - name: myweb
    mountPath: /oldboyedu-linux/
  - name:  oldboyedu-db
    mountPath: /oldboyedu-linux-databases-all

  运行容器

kubectl apply -f oldboyedu-linux-configmap.yml
kubectl apply -f oldboyedu-database-config.yml
kubectl apply -f oldboyedu-nginx-config.yml

  进入容器查看配置是否已经挂载上了

kubectl exec -it oldboyedu-linux-configmap /bin/bash

  | 基于环境变量的方式挂载

kind: Pod
apiVersion: v1
metadata:name: oldboyedu-linux-variate-configmap
labels:
    apps: myweb
spec:nodeName: 10.0.0.103containers:
 - name: web
  image: 10.0.0.101:5000/nginx:1.20.1
  env:
   - name: oldboyedu_mysql     # 指定从哪里取值
    valueFrom:
       # 指定从configMap去引用数据
      configMapKeyRef:
         # 指定configMap的名称
        name: oldboyedu-database-config         # 指定configmap的key,即引用哪条数据!
        key: my.cnf   - name: oldboyedu_redis
    valueFrom:
        configMapKeyRef:
          name: oldboyedu-database-config
          key: redis.conf   - name: oldboyedu_nginx
    valueFrom:
        configMapKeyRef:
          name: oldboyedu-nginx
          key: nginx.conf

  进入容器查看环境变量

kubectl exec -it oldboyedu-linux-variate-configmap /bin/bash
env | egrep "mysql|redis|nginx"

   Secret介绍

  k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息

  它把 Pod 想要访问的加密数据存放到 Etcd 中,然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了

  与ConfigMap类似,区别在于secret存储敏感数据,所有的数据都需要经过base64进行编码

  使用secret主要存储的是凭据信息

  | Secret的三种类型

  Opaque:

  base64 编码格式的 Secret,用来存储密码、密钥等

  但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱

  Service Account:

  用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount 目录中

  kubernetes.io/dockerconfigjson:

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

  | Opaque类型

  Opaque 类型的数据是一个 map 类型,要求value是base64编码

  手动创建base64加密

echo -n 'admin' | base64
echo -n '1' | base64

  解密

echo 'MWYyZDFlMmU2N2Rm' | base64 --decode

  这里需要注意的是,像这样创建的 Secret 对象,它里面的内容仅仅是经过了转码,而并没有被加密

  在真正的生产环境中,你需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性

  | Service Account类型

  Service Account 对象的作用,就是 Kubernetes 系统内置的一种“服务账户”,它是 Kubernetes 进行权限分配的对象

  比如,Service Account A,可以只被允许对 Kubernetes API 进行 GET 操作,而 Service Account B,则可以有 Kubernetes API 的所有操作权限

  | kubernetes.io/dockerconfigjson类型

  用来创建用户docker registry认证的Secret,直接使用kubectl create命令创建即可,如下:

kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

  如果我们需要拉取私有仓库中的docker镜像的话就需要使用到上面的myregistry这个Secret:

apiVersion: v1
kind: Pod
metadata:name: test
spec:containers:- name: test
  image: 10.0.0.101:5000/nginx:1.20.1imagePullSecrets:- name: myregistry

   secret资源创建

  | 方式一:kubectl create secret 命令

  username.txt 账户名和 password.tx 密码 文件内容如下:

# cat username.txtadmin# cat password.txt1

  创建 secret

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

  | 方式二:通过yml文件创建

apiVersion: v1
kind: Secret
metadata: 
  name: db-user-passwd# Opaque类型是用户自定义类型.type: Opaque
data:  
  # 定义两条数据,其值必须是base64编码后的数据,否则创建会报错
  user: YWRtaW4=  
  pass: MWYyZDFlMmU2N2Rm

   注:通过yaml创建Opaque类型的Secret值需要base64编码

  创建secret

kubectl create -f oldboyedu-secret.yml

   使用secret资源

  | 基于存储卷的方式挂载

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-linux-volume-secret
  labels:
     apps: myweb
spec:
  nodeName: 10.0.0.102
  volumes:
  - name: myweb    # 定义数据卷类型是secret
    secret:
      # 引用secret的名称.
      secretName: db-user-passwd      # 引用secret具体的Key相关信息.
      items:
        # 指定secret的key名称,该名称必须在secret资源中存在.
      - key: user        # 可以暂时理解为挂载到容器的名称.
        path: username.txt      - key: pass
        path: password.txt
  containers:
  - name: linux-web
    image: 10.0.0.101:5000/nginx:1.20.1
    volumeMounts:
    - name: myweb
      mountPath: /oldboyedu-linux/

  运行容器

kubectl apply -f oldboyedu-linux-volume-secret.yml

  进入容器查看配置是否已经挂载上了

kubectl exec -it oldboyedu-linux-volume-secret /bin/bash

  | 基于环境变量的方式挂载

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-linux-env-secret-demo
  labels:
     apps: myweb
spec:
  nodeName: 10.0.0.102
  containers:
  - name: linux-web
    image: 10.0.0.101:5000/nginx:1.20.1
    env:
    - name: oldboyedu_linux_username      # 指定从哪里取值
      valueFrom:
        # 指定从secret去引用数据
        secretKeyRef:
          # 指定secret的名称
          name: db-user-passwd          # 指定secret的key,即引用哪条数据!
          key: user    - name: oldboyedu_linux_password
      valueFrom:
         secretKeyRef:
           name: db-user-passwd
           key: pass

  运行容器

kubectl apply -f oldboyedu-linux-env-secret.yml

  进入容器查看

kubectl exec -it oldboyedu-linux-env-secret-demo /bin/bash
env | grep oldboyedu_linux

  subPath介绍

  | 什么是 subPath

  为了支持单一个pod多次使用同一个volume而设计,subpath翻译过来是子路径的意思,如果是数据卷挂载在容器,指的是存储卷目录的子路径,如果是配置项configMap/Secret,则指的是挂载在容器的子路径

  | subPath的使用方法

  subPath的使用方法一共有两种:

  同一个pod中多容器挂载同一个卷时提供隔离;

  将configMap和secret作为文件挂载到容器中而不覆盖挂载目录下的文件;

   | 同一个pod中多容器挂载同一个卷时提供隔离

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-linux-subpath
  labels:
     apps: myweb
spec:
  nodeName: 10.0.0.102
  volumes:
  - name: data01
    emptyDir: {}
  containers:
  - name: linux-web
    image: 10.0.0.101:5000/nginx:1.20.1
    volumeMounts:
    - name: data01
      mountPath: /oldboyedu-linux-data      # 当挂载相同当存储卷时,如果subPath的值相同则共享数据,若不同,则隔离两者容器的数据共享。
      subPath: "oldboyedu-linux-c1"
  - name: linux80-alpine
    image: 10.0.0.101:5000/alpine
    command: ["sleep","600"]
    volumeMounts:
    - name: data01
      mountPath: /oldboyedu-linux-data-001
      subPath: "oldboyedu-linux-c2"

  


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69952968/viewspace-3103353/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
老男孩it教育——致力于帮助有志向的年轻人通过努力学习获得体面的工作和生活。专注于Linux云计算运维、Python全栈开发、网络安全、新媒体运营、容器云架构师、MySQL数据库、go语言的培训。学习可call:18710030740

注册时间:2019-11-06

  • 博文量
    389
  • 访问量
    1010269