7、Kubernetes核心技术 - Secret

这篇具有很好参考价值的文章主要介绍了7、Kubernetes核心技术 - Secret。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、Secret概述

二、Secret 三种类型

2.1、Opaque

2..2、kubernetes.io/dockerconfigjson

2.3、kubernetes.io/service-account-token

三、Secret创建

3.1、命令行方式创建 Secret

3.2、yaml方式创建 Secret

四、Secret解码

五、Secret使用

5.1、将 Secret 挂载到 Volume 中

5.2、将 Secret 设置为环境变量

5.3、通过volume挂载和设置为环境变量的区别

六、Secret删除


一、Secret概述

Secret 解决了密码、令牌、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec 中,它把 Pod 想要访问的加密数据存放到 Etcd 中,然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息。

二、Secret 三种类型

2.1、Opaque

使用 base64 编码存储信息,手动加密,用来存储密码、密钥等,可以通过 base64 --decode 解码获得原始数据,因此安全性弱。

# base64编码
$ echo "root" | base64
cm9vdAo=

# base64解码
$ echo "cm9vdAo=" | base64 --decode
root

2..2、kubernetes.io/dockerconfigjson

用于存储私有docker registry认证的Secret。

下面是一个示例:

# 使用kubectl create secret命令创建Secret,指定docker私有仓库地址,用户名、密码等
kubectl create secret docker-registry habor-registry-secret --docker-server=xxx --docker-username=xxx --docker-password=xxx 

如果我们需要拉取私有仓库中的docker镜像的话,在Pod的资源清单中就需要引用前面定义好的habor-registry-secret这个Secret,例如:

apiVersion: v1
kind: Pod
metadata:
  name: order-service
spec:
  containers:
  - name: order-service
    image: 192.168.1.33:5000/order-service:v1.2
  imagePullSecrets:
  - name: habor-registry-secret

2.3、kubernetes.io/service-account-token

用于被 serviceaccount 引用,serviceaccout 创建时 Kubernetes 会默认创建对应的 Secret。Pod 如果使用了 serviceaccount,对应的 Secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

下面是一个示例:

$ kubectl run nginx --image nginx
pod/nginx created

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          12s

# 进入nginx容器
$ kubectl exec -it  nginx bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

root@nginx:/# ls -l /run/secrets/kubernetes.io/serviceaccount
ca.crt  namespace  token

三、Secret创建

Secret的创建一般有两种方式,一种是通过命令行方式【 kubectl create secret命令】,另外一种是使用yaml资源清单方式创建。

3.1、命令行方式创建 Secret

首先需要准备Secret数据的来源,然后使用 kubectl create secret 命令将这些文件打包成一个 Secret 并在 API 服务器上创建Secret对象,生成Secret后会自动加密,而非明文存储。

7、Kubernetes核心技术 - Secret,# Kubernetes,kubernetes,容器,云原生,k8s,secret

假如某个Pod要访问数据库,需要用户名密码,分别存放在2个文件中:username.txt,password.txt。

# -n参数确保生成的txt文件在文本末尾不包含额外的换行符,因为当 kubectl 读取文件并将内容编码为 base64 字符串时,多余的换行符也会被编码。
$ echo -n "admin" > ./username.txt
$ echo -n "123456" > ./password.txt

# 使用 kubectl create secret 命令将这些文件打包成一个 Secret 并在 API 服务器上创建Secret对象
$ kubectl create secret generic db-account-secret --from-file=./username.txt --from-file=./password.txt
secret/db-account-secret created

# 查看secret,为了防止Secret被意外暴露,默认不显示Secret的内容
$ kubectl get secret
NAME                TYPE     DATA   AGE
db-account-secret   Opaque   2      8s

# 通过yaml查看secret详细信息
$ kubectl get secret db-account-secret -o yaml
apiVersion: v1
data:  # secret中的key默认就是txt文件名称,可以看到这里是password.txt、password.txt
  password.txt: MTIzNDU2		#secret保存的是base64加密后的数据: 123456
  password.txt: YWRtaW4=		#secret保存的是base64加密后的数据: admin
kind: Secret
metadata:
  creationTimestamp: "2023-01-05T02:21:18Z"
  name: db-account-secret
  namespace: default
  resourceVersion: "3212"
  uid: a11caa2c-e7d7-4234-a20a-453cc05d565b
type: Opaque

# base64加密之后的数据
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123456' | base64
MTIzNDU2

注意,Secret中的key默认就是文件名称,可以看到这里是password.txt、password.txt。可以使用 --from-file=[key=]source 来设置密钥名称,例如:kubectl create secret generic db-account-secret --from-file=username=./username.txt --from-file=password=./password.txt。

我们还可以使用 --from-literal=<key>=<value> 标签提供 Secret 数据。 可以多次使用 --from-literal标签,提供多个键值对。 请注意,特殊字符(例如:$,\,*,= 和 !)由shell 解释执行,而且需要转义,最简便的方法是用单引号括起来。 比如,如果你的密码是$#123456=,可以像下面一样执行命令:

$ kubectl create secret generic db-secret-test --from-literal=username=admin --from-literal=password='$#123456='
secret/db-secret-test created

3.2、yaml方式创建 Secret

因为Secret保存的是base64加密后的数据,所以使用yaml方式创建Secret的时候,我们需要准备好base64加密之后的数据,然后放到Secret的资源清单中。

# base64加密之后的数据
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123456' | base64
MTIzNDU2

创建Secret资源清单文件: vim custom-db-account-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: custom-db-account-secret
type: Opaque
data:
  username: YWRtaW4=
  password: MTIzNDU2

创建Secret:

$ kubectl apply -f custom-db-account-secret.yaml 
secret/custom-db-account-secret created

$ kubectl get secret/custom-db-account-secret
NAME                       TYPE     DATA   AGE
custom-db-account-secret   Opaque   2      22s

# 查看Secret描述信息,为了防止Secret被意外暴露,默认不显示Secret的内容
$ kubectl describe secret/custom-db-account-secret
Name:         custom-db-account-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
username:  5 bytes

四、Secret解码

为了防止Secret被意外暴露,默认不显示Secret的内容,要查看我们创建的 Secret 的内容,可以通过下面的方式。

$ kubectl get secret custom-db-account-secret -o jsonpath=‘{.data}’
‘{"password":"MTIzNDU2","username":"YWRtaW4="}’

$ echo "YWRtaW4=" | base64 -d
admin

$ echo "MTIzNDU2" | base64 -d
123456

五、Secret使用

Secret使用有两种方式,一种是将Secret挂载到存储卷volume中,另外一种是将Secret中的值,设置为Pod中的环境变量。

5.1、将 Secret 挂载到 Volume 中

创建Pod资源清单文件: vim secret-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/foo"  # 将secret的数据挂载到pod容器中/etc/foo目录下
      readOnly: true
  volumes:
  - name: secret-volume
    secret:  # volume存储卷的类型为secret
      secretName: custom-db-account-secret  # 引用前面定义好的secret的名称:custom-db-account-secret

创建Pod,然后进入Pod中查看custom-db-account-secret中的数据是否挂载进去。

$ kubectl apply -f secret-pod.yaml 
pod/nginx created

$ kubectl get pod/nginx -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          27s   192.168.1.3   node01   <none>           <none>

$ kubectl exec -it nginx sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cd /etc/foo/
# ls
password  username
# cat username
admin
# cat password
123456

可以看到,custom-db-account-secret中我们定义的username、password已经成功挂载到pod容器中/etc/foo目录下,并且数据也是解密之后的数据。

5.2、将 Secret 设置为环境变量

创建Pod资源清单文件: vim secret-env-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    env:	
      - name: DB_USERNAME			# 声明环境变量DB_USERNAME
        valueFrom:
          secretKeyRef:		# 指定数据来源是custom-db-account-secret这个secret的username字段
            name: custom-db-account-secret
            key: username	
      - name: DB_PASSWORD			# 声明环境变量DB_PASSWORD
        valueFrom:
          secretKeyRef:  	# 指定数据来源是custom-db-account-secret这个secret的password字段
            name: custom-db-account-secret
            key: password
  restartPolicy: Never

创建Pod,并进入Pod查看环境变量的值。

$ kubectl apply -f secret-env-pod.yaml 
pod/nginx created

$ kubectl get pod/nginx -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          14s   192.168.1.4   node01   <none>           <none>

$ kubectl exec nginx -it sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# env | grep -E "USERNAME|PASSWORD"
DB_USERNAME=admin
DB_PASSWORD=123456
# echo $DB_USERNAME
admin
# echo $DB_PASSWORD
123456

如上可以看到,进入Pod之后,已经成功将custom-db-account-secret这个secret的username、password,对应生成了$DB_USERNAME、$DB_PASSWORD两个环境了,这样在Pod中就可以使用这两个环境变量了。

5.3、通过volume挂载和设置为环境变量的区别

通过Volume挂载到容器内部时,当该Secret的值发生变化时,容器内部具备自动更新的能力,但是通过环境变量设置到容器内部该值不具备自动更新的能力。所以一般推荐使用Volume挂载的方式使用Secret

六、Secret删除

使用【kubectl delete secret xxx】命令即可,xxx指定Secret的名称。文章来源地址https://www.toymoban.com/news/detail-626560.html

$ kubectl get secret
NAME                       TYPE     DATA   AGE
custom-db-account-secret   Opaque   2      44m
db-account-secret          Opaque   2      54m
db-secret-test             Opaque   2      12m

$ kubectl delete secret db-secret-test
secret "db-secret-test" deleted

$ kubectl get secret
NAME                       TYPE     DATA   AGE
custom-db-account-secret   Opaque   2      44m
db-account-secret          Opaque   2      55m

到了这里,关于7、Kubernetes核心技术 - Secret的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生】Kubernetes之Secret

    你必须拥有一个 Kubernetes 的集群,同时你必须配置 kubectl 命令行工具与你的集群通信 Secret 对象用来存储敏感数据,如 Pod 用于访问服务的凭据。例如,为访问数据库,你可能需要一个 Secret 来存储所需的用户名及密码 你可以通过在命令中传递原始数据,或将凭据存储文件中,

    2024年02月15日
    浏览(39)
  • 【云原生 | Kubernetes 系列】K8s 实战 管理 Secret 详解

    Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。 一个 Secret 可以包含 Pod 访问数据库所需的用户凭证。 例如,由用户名和密码组成的数据库连接字符串。 你可

    2024年02月02日
    浏览(66)
  • 【AI云原生】Kubernetes容器环境下大模型训练和推理的关键技术分析

    摘要: 本文将探讨在Kubernetes容器环境下进行大模型训练和推理的关键技术。我们将以英伟达显卡为例,详细介绍如何利用Kubernetes容器平台来高效地进行大规模深度学习任务。我们将讨论容器化的优势,包括可扩展性、资源管理和隔离性,并介绍与Kubernetes相关的关键技术,如

    2024年04月15日
    浏览(53)
  • 探索云原生容器编排技术:如Kubernetes如何为大数据处理和AI模型的自动化部署带来便利

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:云原生 ✨文章内容: 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 Kubernetes是一个强大的容器编排和自动化部署工具,它为大数据处理和

    2024年02月10日
    浏览(59)
  • 【云原生、Kubernetes】Kubernetes核心概念理解

    首先我们要掌握 Kubernete 的一些核心概念。 这些核心可以帮助我们更好的理解 Kubernetes 的特性和工作机制。 首先,Kubernetes 集群中包含2类节点,分别是:master控制节点和node工作节点。 master 控制节点 负责管理整个集群系统,可以说它是集群的网关和中枢,是Kubernetes 的大脑和

    2024年02月13日
    浏览(42)
  • Kubernetes:云原生时代的核心引擎

    在云计算飞速发展的今天,Kubernetes(简称K8s)凭借其强大的容器编排能力,迅速成为云原生时代的核心引擎。K8s不仅简化了容器化应用的部署与管理,还为企业提供了高效、可扩展的云原生应用架构。 K8s的核心特性在于其自动化和智能化的容器编排能力。它可以自动部署、

    2024年04月27日
    浏览(35)
  • 【云原生】Kubernetes临时容器

    特性状态: Kubernetes v1.25 [stable] 本页面概述了临时容器:一种特殊的容器,该容器在现有 Pod 中临时运行,以便完成用户发起的操作,例如故障排查。 你会使用临时容器来检查服务,而不是用它来构建应用程序 Pod 是 Kubernetes 应用程序的基本构建块。 由于 Pod 是一次性且可替

    2024年02月15日
    浏览(41)
  • 【云原生】Kubernetes容器编排工具

    目录 1. K8S介绍 1.1 k8s的由来 下载地址 1.2 docker编排与k8s编排相比 1.3 传统后端部署与k8s 的对比 传统部署 k8s部署  ​2. k8s的集群架构与组件 (1) Kube-apiserver (2)Kube-controller-manager  (3)Kube-scheduler   2.2 k8s的配置存储中心 2.3  k8s的Node 组件   (1)Kubelet   (2)Kube-Proxy 

    2024年02月10日
    浏览(42)
  • 【云原生】容器编排工具Kubernetes

    目录 一、 K8S介绍 官网地址: 1.1docker编排与k8s编排相比 1.2特性 1.3功能 二、K8S重要组件 2.1核心组件 (1)Kube-apiserver (2)Kube-controller-manager (3)Kube-scheduler (4)Node ①kubelet ②kube-proxy ③docker (5)etcd 2.2Kubernetes工作原理 三、Pod 3.1 Pod控制器 (1)Deployment (2)ReplicaSet (3)

    2024年02月09日
    浏览(46)
  • 云原生、容器化、Kubernetes、微服务

    作者:禅与计算机程序设计艺术 云原生(Cloud Native)是一个开放且社区驱动的项目,它定义了一组架构原则、最佳实践和工具集,这些原则、实践和工具围绕业务需求和工程实践而设计,可用于开发人员在构建和运行分布式系统时更加顺畅地交付可靠的软件。云原生可以帮助

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包