40、Kubernetes 中的零停机部署与秘密管理

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
  1. 测试蓝色版本服务
$ PORT=$(kubectl get svc/web -o jsonpath='{.spec.ports[0].nodePort}')
$ curl localhost:${PORT}/
  1. 部署绿色版本 :定义文件为 web-deployment-green.yaml ,注意将部署名称定义为 web-green ,并在相关行添加 color: green 标签,同时使用新版本的 Web 镜像。
$ kubectl apply -f web-deployment-green.yaml
  1. 切换流量
$ 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
  1. 创建秘密
$ kubectl create -f pets-secret.yaml
  1. 描述秘密
$ kubectl describe secrets/pets-secret
  1. 解码秘密
$ 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
  1. 使用 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
  1. 部署使用秘密的 Deployment
$ kubectl apply -f web-deployment-secret.yaml
  1. 验证秘密是否可用
$ 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 技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值