🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
目录
一、前言
1、k8s简介
Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。
Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。
有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章
Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。
2、Secret简介
Kubernetes Secret是一种资源对象,用于在集群中安全地存储和管理敏感数据,如密码、密钥、证书等。与ConfigMap类似,Secret也可以存储配置信息,但它专门用于敏感数据,并提供了额外的安全特性来保护这些数据。
Secret的主要用途包括:
- 存储凭证:如数据库密码、API密钥、OAuth令牌等,避免了在应用程序代码中直接包含机密数据。
- TLS证书:可以存储HTTPS服务器的私钥和证书,用于加密通信。
- 配置加密数据:用于安全地管理任何敏感配置,如应用程序的配置信息。
Secret的创建和管理提供了多种灵活性和安全性。可以通过kubectl命令行工具创建Secret,也可以通过API进行编程创建。Secret可以以环境变量或文件的形式注入到Pod中,供容器使用。
3、Secret与ConfigMap的区别
Secret和ConfigMap都是Kubernetes中用于存储和传递应用程序配置信息的对象,但它们有一些重要的区别:
数据类型:
- Secret用于存储敏感数据,如密码、API令牌、TLS证书等。
- ConfigMap用于存储非敏感的配置数据,如应用程序配置文件、环境变量等。
安全性:
- Secret中的数据是以Base64编码形式存储的,并且在存储和传输过程中会进行加密,因此适合存储敏感数据。
- ConfigMap中的数据不加密,适合存储非敏感数据。
用途:
- Secret主要用于存储应用程序需要的凭据或敏感信息,如数据库密码、API密钥等。
- ConfigMap主要用于存储应用程序的配置信息,如配置文件、环境变量等。
管理方式:
- Secret可以通过kubectl命令行工具或Kubernetes API进行管理和部署。
- ConfigMap也可以通过kubectl命令行工具或Kubernetes API进行管理和部署。
适用场景:
- 当需要存储和传递敏感数据时,应使用Secret。
- 当需要存储和传递非敏感的配置信息时,应使用ConfigMap。
二、Secret的基本概念
1、Secret的组成
在Kubernetes中,Secret由以下几个组成部分构成:
- 元数据(Metadata):包含了Secret的名称、命名空间、标签等信息,用于唯一标识和管理/ Secret对象。
- 数据(Data):Secret中存储的实际数据,以键值对的形式存在。这些数据可以是任意类型的,但在存储和传输过程中会进行Base64编码,以增加安全性。
- 类型(Type):指示Secret中存储的数据类型。常见的类型包括Opaque、ServiceAccountToken等。其中,Opaque类型用于存储任意类型的数据,而ServiceAccountToken类型用于存储服务账户的访问令牌。
综上所述,Secret由元数据、数据和类型组成,其中数据部分存储了实际的配置信息,而元数据用于唯一标识和管理Secret对象,类型则指示了Secret中存储的数据类型。
2、Secret的生命周期
Secret的生命周期包括创建、更新和删除三个阶段:
- 创建(Creation):Secret可以通过命令行工具(如kubectl)或通过Kubernetes API创建。在创建Secret时,需要指定Secret的元数据和数据内容。
- 更新(Update):Secret的更新可以通过命令行工具或通过API进行。更新Secret时,可以修改Secret的元数据和数据内容。更新操作通常会触发相关的容器重新启动或配置重新加载等操作,以确保新的配置信息生效。
- 删除(Deletion):Secret可以通过命令行工具或通过API进行删除。删除Secret时,其中存储的敏感信息将被永久移除,不再可恢复。删除Secret后,相关的应用程序可能需要重新配置或重新部署,以适应新的环境。
3、Secret的类型
Kubernetes中的Secret有不同的类型,用于存储不同类型的敏感信息。常见的Secret类型包括:
- Opaque:这是最常用的Secret类型,用于存储任意类型的键值对数据,如用户名、密码、API密钥等。Opaque类型的Secret可以通过base64编码存储数据。
- Docker Registry:用于存储访问私有Docker仓库所需的认证信息,包括用户名、密码等。
- TLS:用于存储TLS证书和私钥,用于加密通信和身份验证。
- Service Account Token:用于自动将Service Account相关的凭据注入到Pod中,以便Pod能够访问Kubernetes API等资源。
- SSH:用于存储SSH密钥,用于远程访问和身份验证。
- Generic:类似于Opaque类型,用于存储任意类型的键值对数据,但是Generic类型的Secret不会进行base64编码。
三、Secret的创建与管理
1、从文件创建
要使用kubectl创建一个从文件创建的Secret,我们可以按照以下步骤操作:
准备包含敏感信息的文件。例如,如果要创建一个包含用户名和密码的Secret,可以创建一个包含这些信息的文本文件。
确保敏感信息已经使用base64编码。kubectl创建Secret时,它会期望数据是base64编码的。
使用以下命令创建Secret:
kubectl create secret generic my-secret --from-file=path/to/your/file.txt
在这个命令中,my-secret是要创建的Secret的名称,path/to/your/file.txt是包含敏感信息的文件的路径。
确认Secret已经创建成功:
kubectl get secret my-secret
这将显示名为my-secret的Secret的详细信息,包括它的类型和数据。
2、从字面量创建
使用以下命令创建Secret:
kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypassword
在这个命令中,my-secret是要创建的Secret的名称,--from-literal标志后面跟着键值对,表示要包含在Secret中的数据。在上面的示例中,我们创建了一个名为my-secret的Secret,并将用户名和密码作为字面量数据添加到其中。
请注意,使用该方法创建的Secret中的数据将以明文存储,而不会进行base64编码。因此,谨慎处理包含敏感信息的Secret,并确保只向受信任的实体授予访问权限。
3、Secret的更新与删除
要更新Secret,我们可以使用kubectl apply命令或编辑Secret的YAML文件,然后使用kubectl apply -f命令将更改应用到集群中。
使用kubectl apply命令更新Secret:
kubectl apply -f updated-secret.yaml
在这个命令中,updated-secret.yaml是包含更新内容的Secret的YAML文件。
编辑Secret的YAML文件,并使用kubectl apply -f命令应用更改:
首先编辑Secret的YAML文件,然后保存更改。接着,运行以下命令:
kubectl apply -f updated-secret.yaml
这将在集群中更新Secret。
要删除Secret,可以使用kubectl delete secret命令:
kubectl delete secret my-secret
这将删除名为my-secret的Secret。
4、Secret的版本控制
Kubernetes本身不提供Secret的版本控制功能,但可以通过一些外部工具或实践来实现Secret的版本控制。
一种常见的做法是使用版本控制系统(如Git)来管理Secret的YAML文件。可以将Secret的YAML文件保存在Git仓库中,并使用Git来跟踪和管理Secret的版本。每次更新Secret时,都可以将其保存为一个新的提交,并在需要时回滚到之前的版本。
另一种方法是使用配置管理工具(如Helm)来管理Secret。Helm可以帮助我们定义和版本控制Kubernetes资源,包括Secret。可以使用Helm的值文件来定义Secret,并使用Helm来安装、升级和回滚Secret。