Kubernetes 中的零停机部署与秘密管理
零停机部署与蓝绿部署
在某些情况下,我们不希望旧版本与新版本共存,这时蓝绿部署就派上用场了。下面以宠物应用的 Web 组件为例,介绍蓝绿部署的步骤:
1.
部署蓝色版本
:将 Web 组件的第一个版本部署为蓝色,为 Pod 添加
color: blue
标签。
2.
部署对应服务
:部署 Kubernetes 服务,在选择器部分添加
color: blue
标签。
3.
部署绿色版本
:部署 Web 组件的第二个版本,为 Pod 添加
color: green
标签。
4.
测试绿色版本
:测试绿色版本的服务,确保其按预期工作。
5.
切换流量
:更新 Kubernetes 服务,将选择器的标签改为
color: green
,实现流量从蓝色到绿色的切换。
下面是具体的操作步骤:
1.
定义蓝色版本的 Deployment 对象
:定义文件为
web-deploy-blue.yaml
,注意将部署名称定义为
web-blue
,并在相关行添加
color: blue
标签。
2.
定义服务对象
:定义文件为
web-service-blue-green.yaml
,与之前的服务定义相比,仅在选择器部分添加了
color: blue
标签。
3.
部署蓝色版本及其服务
:
$ kubectl apply -f web-deploy-blue.yaml
$ kubectl apply -f web-service-blue-green.yaml
- 测试蓝色版本服务 :
$ PORT=$(kubectl get svc/web -o jsonpath='{.spec.ports[0].nodePort}')
$ curl localhost:${PORT}/
-
部署绿色版本
:定义文件为
web-deployment-green.yaml,注意将部署名称定义为web-green,并在相关行添加color: green标签,同时使用新版本的 Web 镜像。
$ kubectl apply -f web-deployment-green.yaml
- 切换流量 :
$ kubectl edit svc/web
将
color
标签的值从
blue
改为
green
,保存并退出编辑器,Kubernetes CLI 会自动更新服务。再次测试服务,应能看到新版本的输出。
7.
回滚操作
:如果绿色版本出现问题,可再次编辑 Web 服务,将
color
标签的值改回
blue
,实现快速回滚。
8.
停用蓝色版本
:当绿色版本运行正常且表现良好时,可停用蓝色版本。
$ kubectl delete deploy/web-blue
Kubernetes 秘密管理
在 Kubernetes 集群中运行的服务有时需要使用机密数据,如密码、API 密钥或证书等。为确保这些敏感信息仅被授权服务访问,Kubernetes 引入了秘密(Secrets)的概念。
手动定义秘密
可以使用 YAML 文件以声明方式创建秘密,示例如下:
apiVersion: v1
kind: Secret
metadata:
name: pets-secret
type: Opaque
data:
username: am9obi5kb2UK
password: c0VjcmV0LXBhc1N3MHJECg==
需要注意的是,这些值是经过 Base64 编码的,并非真正的加密值,因此这种方法仅适用于开发环境。创建和使用该秘密的步骤如下:
1.
编码敏感数据
:
$ echo "john.doe" | base64
$ echo "sEcret-pasSw0rD" | base64
- 创建秘密 :
$ kubectl create -f pets-secret.yaml
- 描述秘密 :
$ kubectl describe secrets/pets-secret
- 解码秘密 :
$ kubectl get secrets/pets-secret -o yaml
$ echo "c0VjcmV0LXBhc1N3MHJECg==" | base64 –decode
使用 kubectl 创建秘密
使用
kubectl
创建秘密是更安全的方法。步骤如下:
1.
创建临时文件存储编码后的值
:
$ echo "sue-hunter" | base64 > username.txt
$ echo "123abc456def" | base64 > password.txt
- 使用 kubectl 创建秘密 :
$ kubectl create secret generic pets-secret-prod \
--from-file=./username.txt \
--from-file=./password.txt
在 Pod 中使用秘密
可以通过两种方式在 Pod 中使用秘密:使用文件和使用环境变量。
使用文件
在 Deployment 对象中添加相关配置,将秘密挂载为容器文件系统中的文件。示例配置文件为
web-deployment-secret.yaml
,具体操作如下:
1.
创建秘密
:
$ kubectl apply -f pets-secret.yaml
- 部署使用秘密的 Deployment :
$ kubectl apply -f web-deployment-secret.yaml
- 验证秘密是否可用 :
$ kubectl get pods
$ kubectl exec -it <pod-name> -- ls /etc/secrets
$ kubectl exec -it <pod-name> -- cat /etc/secrets/username
$ kubectl exec -it <pod-name> -- cat /etc/secrets/password
使用环境变量
修改 Deployment YAML 文件,将秘密的值映射到环境变量。示例配置如下:
# 部分配置,主要展示环境变量映射部分
spec:
containers:
- name: web
env:
- name: PETS_USERNAME
valueFrom:
secretKeyRef:
name: pets-secret
key: username
- name: PETS_PASSWORD
valueFrom:
secretKeyRef:
name: pets-secret
key: password
部署更新后的 Deployment 对象:
$ kubectl apply -f web-deployment-secret.yaml
总结
本文介绍了 Kubernetes 中的零停机部署(蓝绿部署)和秘密管理方法。蓝绿部署允许在不中断服务的情况下更新应用程序,而秘密管理则确保敏感信息的安全使用。通过在 Pod 中使用文件或环境变量的方式,可以方便地将秘密提供给应用程序服务。
下面是蓝绿部署的流程图:
graph LR
A[部署蓝色版本] --> B[部署蓝色服务]
B --> C[部署绿色版本]
C --> D[测试绿色版本]
D --> E{测试是否通过}
E -- 是 --> F[切换流量到绿色版本]
E -- 否 --> G[回滚到蓝色版本]
F --> H[停用蓝色版本]
同时,为了更好地理解秘密管理的不同方式,下面列出了两种创建秘密方式的对比表格:
| 创建方式 | 安全性 | 适用环境 | 操作步骤 |
| ---- | ---- | ---- | ---- |
| 手动定义(YAML 文件) | 低,Base64 编码易解码 | 开发环境 | 编码数据、创建 YAML 文件、应用 YAML 文件 |
| 使用 kubectl | 高,避免 YAML 文件存储在版本控制系统 | 生产环境 | 创建临时文件存储编码值、使用 kubectl 创建秘密 |
Kubernetes 中的零停机部署与秘密管理(续)
应用部署与服务配置问题解答
为了帮助大家更好地理解和应用上述知识,下面对一些常见问题进行解答。
应用部署问题
如果你有一个包含 Web API 和数据库(如 MongoDB)的应用程序,要将其部署到 Kubernetes 集群中,可以按以下步骤进行:
1.
定义 MongoDB 部署
:使用 StatefulSet 对象定义 MongoDB 的部署,命名为
db-deployment
,设置一个副本(复制 MongoDB 较为复杂,不在此讨论范围)。
2.
定义数据库服务
:为
db-deployment
定义一个 ClusterIP 类型的 Kubernetes 服务,命名为
db
。
3.
定义 Web API 部署
:定义 Web API 的部署,命名为
web-deployment
。
4.
扩展 Web API 服务
:将 Web API 服务扩展到三个实例。
5.
定义 Web API 服务
:为
web-deployment
定义一个 NodePort 类型的 Kubernetes 服务,命名为
api
。
6.
处理秘密
:如果使用秘密,直接在集群中使用
kubectl
定义这些秘密。
7.
部署应用
:使用
kubectl
部署整个应用。
探针相关问题
在 Kubernetes 应用服务中,存活(Liveness)和就绪(Readiness)探针是重要的健康检查机制:
-
存活探针
:用于检查容器是否仍在运行,如果容器未运行,Kubernetes 会自动重启它。
-
就绪探针
:用于检查容器是否准备好处理请求。如果容器未通过就绪检查,它不会被移除,但不会接收传入请求,直到通过就绪探针检查。
应用层路由问题
要为应用程序建立第 7 层(应用层)路由,需要以下组件:
1.
IngressController
:这是一个反向代理,如 Nginx,带有一个边车(Sidecar),监听 Kubernetes Server API 的相关更改,并在检测到更改时更新反向代理的配置并重启它。
2.
Ingress 资源
:在集群中定义 Ingress 资源,用于定义路由规则,例如从基于上下文的路由(如
https://example.com/pets
)到
<服务名称>/<端口>
或
api/32001
这样的对。当 Kubernetes 创建或更改 Ingress 对象时,IngressController 的边车会捕获并更新代理的路由配置。
蓝绿部署步骤问题
对于一个简单的应用服务,实现蓝绿部署的主要步骤如下:
1.
部署版本 1.0
:定义一个名为
inventory-deployment-blue
的部署,并为 Pod 添加
color:blue
标签。
2.
部署蓝色服务
:为上述部署部署一个 ClusterIP 类型的 Kubernetes 服务,命名为
inventory
,选择器包含
color:blue
。
3.
部署版本 2.0
:定义版本 2.0 的部署,命名为
inventory-deployment-green
,为 Pod 添加
color:green
标签。
4.
测试绿色服务
:对绿色服务进行冒烟测试,一切正常后,更新
inventory
服务,使选择器包含
color:green
。
秘密信息类型问题
可以通过 Kubernetes 秘密提供给应用服务的信息类型包括:
- 密码
- 证书
- API 密钥 ID
- API 密钥秘密
- 令牌
秘密创建源问题
Kubernetes 创建秘密时接受的源包括文件或 Base64 编码的值。
应用服务使用秘密配置问题
要配置应用程序使用 Kubernetes 秘密,需要:
1.
创建 Secret 对象
:使用敏感数据创建一个 Secret 对象。
2.
修改 Pod 规范
:在 Pod 规范中包含对 Secret 对象的引用。可以在容器规范中将其作为环境变量引用,也可以作为卷挂载,以便应用程序使用秘密数据。
总结与展望
通过上述内容,我们详细介绍了 Kubernetes 中的零停机部署(蓝绿部署)和秘密管理方法,以及相关问题的解答。蓝绿部署为应用程序的更新提供了零停机的解决方案,而秘密管理确保了敏感信息的安全使用。同时,我们还了解了如何在 Pod 中使用秘密,以及应用部署、探针、路由等方面的知识。
在未来的应用中,我们可以进一步探索如何优化这些部署和管理方法,例如如何更高效地进行蓝绿部署的切换,如何更好地保护秘密信息等。希望大家能够将这些知识应用到实际项目中,提升应用程序的部署和管理效率。
下面是应用部署到 Kubernetes 集群的流程图:
graph LR
A[定义 MongoDB 部署] --> B[定义数据库服务]
B --> C[定义 Web API 部署]
C --> D[扩展 Web API 服务]
D --> E[定义 Web API 服务]
E --> F{是否使用秘密}
F -- 是 --> G[使用 kubectl 定义秘密]
F -- 否 --> H[跳过秘密步骤]
G --> I[部署应用]
H --> I
为了更清晰地对比不同问题的解答要点,下面列出一个表格:
| 问题类型 | 解答要点 |
| ---- | ---- |
| 应用部署 | 定义 MongoDB 和 Web API 部署、服务,处理秘密,最后部署应用 |
| 探针相关 | 存活探针检查容器运行状态,就绪探针检查容器处理请求状态 |
| 应用层路由 | IngressController 和 Ingress 资源 |
| 蓝绿部署步骤 | 部署蓝色版本和服务,部署绿色版本,测试并切换流量 |
| 秘密信息类型 | 密码、证书、API 密钥等 |
| 秘密创建源 | 文件或 Base64 编码的值 |
| 应用服务使用秘密配置 | 创建 Secret 对象,修改 Pod 规范引用 Secret |
通过这些图表和表格,相信大家对 Kubernetes 中的部署和管理知识有了更直观和深入的理解。希望这些内容能够帮助你在实际工作中更好地运用 Kubernetes 技术。
超级会员免费看

被折叠的 条评论
为什么被折叠?



