【kubernetes】关于k8s集群的配置资源(configmap和secret)

目录

一、Secret

类型一:kubernetes.io/service-account-token

[类型二:普通类型secret, ●Opaque,base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;](#类型二:普通类型secret, ●Opaque,base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;)

类型三:kubernetes.io/dockerconfigjson

[类型四:针对kubernetes.io/tls :用来存储 TLS 证书和私钥信息。](#类型四:针对kubernetes.io/tls :用来存储 TLS 证书和私钥信息。)

案例:基于configmap和secret完成443端口开放

二、configMap

1、使用目录创建

2、使用文件创建

3、使用字面值创建

三、总结


一、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 拉取镜像时使用。++

类型一:kubernetes.io/service-account-token

创建secretaccount账户的时候,会自动创建service-account类型的secret

kubectl create serviceaccount lxy-test
//创建一个账户

类型二:普通类型secret, ●Opaque,base64 编码格式的 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

kubectl get secrets

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

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:  #测试通过挂载的方式使用secret
    - name: secrets
      mountPath: "/opt"
      readOnly: true
  volumes:  #创建基于secret的存储卷
  - name: secrets
    secret:
      secretName: mysecret

将 Secret 导出到环境变量中

apiVersion: v1
kind: Pod
metadata:
  name: mypod1
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: TEST_USER  #这个环境变量引用mysecret中的username.txt键名的值
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username.txt
      - name: TEST_PASSWORD #这个环境变量引用mysecret中的password.txt键名的值
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password.txt
    envFrom: #这是直接将mysecret的键名作为环境变量名,值为对应键--环境变量的值
    - secretRef:
        name: mysecret

类型三:kubernetes.io/dockerconfigjson

先完成私有仓库测试镜像

然后完成node节点的docker都部署私有镜像地址,并重启docker

创建secret账号,基于账号来实现镜像拉取

kubectl create secret docker-registry secret-harbor --docker-username=admin --docker-server=http://192.168.20.18 --docker-password=Harbor12345
//创建私有仓库的账号
apiVersion: v1
kind: Pod
metadata:
  name: pod03
spec:
  imagePullSecrets:  #镜像拉取密码
  - name: secret-harbor
  containers:
  - image: 192.168.20.18/test/lxy-nginx:test #私有仓库拉取镜像
    name: pod03
    ports:
    - containerPort: 80
  dnsPolicy: ClusterFirst
  restartPolicy: Always

类型四:针对kubernetes.io/tls :用来存储 TLS 证书和私钥信息。

案例:基于configmap和secret完成443端口开放

先准备好证书文件以及nginx的配置文件,创建configmap资源和secret资源

kubectl create secret tls secret-tls --cert=www.xueyin.com.pem --key=www.xueyin.com-key.pem
//创建基于tls类型的secret

准备nginx的配置文件

    server {
        listen       443 ssl;
        server_name  www.xueyin.com;
        root         /usr/share/nginx/html;
        ssl_certificate /mnt/tls.crt;
        ssl_certificate_key /mnt/tls.key;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
   }
kubectl create cm cm-nginx01 --from-file=/opt/nginx/nginx.conf
//创建configmap资源
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deploy-demo
  name: deploy-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: deploy-demo
  template:
    metadata:
      labels:
        app: deploy-demo
    spec:
      containers:
      - image: soscscs/myapp:v1
        name: myapp
        ports:
        - containerPort: 80 #开启80端口
          name: http
        - containerPort: 443 #开启443端口
          name: https
        volumeMounts:
        - name: cm-vol
          mountPath: /etc/nginx/nginx.conf #挂载到nginx.conf配置文件中
          subPath: nginx.conf #两个配置都需要写
        - name: secret-vol  #secret挂载的目录
          mountPath: /mnt
      volumes:
        - name: cm-vol #基于cm-nginx01创建configmap类型的存储卷,可以替换容器中的nginx配置文件
          configMap:
            name: cm-nginx01
        - name: secret-vol  #基于secret-tls创建secret类型存储卷
          secret:
            secretName: secret-tls

将其发布出去

kubectl expose deployment deploy-demo --name=svc-https02 --port=5566 --target-port=443 --type=NodePort
//将443端口发布

kubectl expose deployment deploy-demo --name=svc-http --port=2233 --target-port=80 --type=NodePort
//将80端口发布

二、configMap

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

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

应用场景:应用配置

1、使用目录创建

只有这一种支持热更新

mkdir /opt/configmap/
 
vim /opt/configmap/game.config
enemy.types=aliens,monsters
player.maximum-lives=5 
 
vim /opt/configmap/ui.config
color.good=purple
color.bad=yellow
allow.textmode=true

ls /opt/configmap/
game.config
ui.config

kubectl create configmap game-config --from-file=/opt/configmap/
//--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容

2、使用文件创建

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

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

kubectl create configmap game-config-2 --from-file=/opt/configmap/game.config --from-file=/opt/configmap/ui.config

kubectl get configmaps game-config-2 -o yaml

kubectl describe cm game-config-2

3、使用字面值创建

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

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

kubectl get configmaps special-config -o yaml

kubectl delete cm --all
kubectl delete pod --all

configMap也可以基于数据卷使用,还可以作为环境变量在容器中使用

与secret一样的

三、总结

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.subPath字段指定文件名,实现将卷挂载到容器中指定的文件上(不支持热更新)

作为容器环境变量的方式:(不支持热更新)

在容器配置中用env.name字段自定义容器的环境变量名,用env.valueFrom.configMapKeyRef.key/name字段指定环境变量的值从哪个cm资源的键获取

在容器配置中用envFrom.configMapRef.name字段指定cm资源的名称,使得cm资源数据的键名和键值直接作为容器的环境变量名和值

Secret资源 用于保存密码文件、ssl证书/私钥文件、token令牌字符串、镜像私有仓库认证信息等需要加密的敏感信息

Secrets的主要目的是将敏感数据与应用程序代码分离,并提供一种安全的方式来存储和传递这些敏感数据给容器化的应用程序。它们以加密的形式保存,并且只能在需要时才能被解密和使用。

Secret的4种类型:

创建Secret资源

kubectl create secret generic <资源名称> --from-file=文件|目录 --from-literal=<键名>=<键值>

kubectl create secret docker-registry <资源名称> --docker-server=<私有仓库URL路径> --docker-username=<仓库用户名> --docker-password=<用户密码> --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.valueFrom.secretKeyRef.key/name字段指定环境变量的值从哪个Secret资源的键获取

在容器配置中用envFrom.secretRef.name字段指定Secret资源的名称,使得Secret资源数据的键名和键值直接作为容器的环境变量名和值

Pod配置从私有仓库拉取镜像:

在Pod资源配置中用spec.imagePullSecrets.name字段指定kubernetes.io/dockerconfigjson类型的Secret资源名称

相关推荐
笃励15 分钟前
Java面试题二
java·开发语言·python
易雪寒34 分钟前
IDEA在git提交时添加忽略文件
java·git·intellij-idea
程序那点事儿1 小时前
k8s 之安装busybox
云原生·容器·kubernetes
打码人的日常分享1 小时前
企业人力资源管理,人事档案管理,绩效考核,五险一金,招聘培训,薪酬管理一体化管理系统(源码)
java·数据库·python·需求分析·规格说明书
27669582921 小时前
京东e卡滑块 分析
java·javascript·python·node.js·go·滑块·京东
爱写代码的刚子1 小时前
C++知识总结
java·开发语言·c++
冷琴19961 小时前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
daiyang123...2 小时前
IT 行业的就业情况
java
先生沉默先2 小时前
Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)
运维·nginx·webgl
weixin_453965002 小时前
master节点k8s部署]33.ceph分布式存储(四)
分布式·ceph·kubernetes