在云计算和DevOps的时代,管理和维护多个Kubernetes(K8S)集群成为了常见的挑战。不同的集群(如开发、测试、生产环境)拥有各自的特性和需求。为了有效管理这些复杂的集群环境,需要采用精心的规划和合适的自动化工具。
本文档旨在展示如何高效地管理多个K8S集群,尤其是在开发、测试、生产等不同环境中。关键在于运用自动化工具和最佳实践,以实现高效、可靠的运维流程。
集成应用运行状态监控和告警机制,确保发布过程的可靠性和稳定性。通过这种方法,团队可以有效地管理和维护多个K8S集群,同时确保每个环境的稳定性和一致性。自动化工具和流程的应用不仅减少了人为错误的风险,还提高了运维效率和系统的可靠性。
选择 Flagger 而非 ArgoCD 或 Kruise Rollout 作为渐进式交付工具的原因可以从几个方面来考虑:
选择 Flagger 的主要原因是其对现有部署模式的低侵入性,灰度发布的专业能力,以及其成熟度和社区支持。虽然 ArgoCD 和 Kruise Rollout 各有其优势,但对于需要平滑过渡和专注于灰度发布策略的组织来说,Flagger 可能是一个更合适的选择。
选择 FluxCD、Flagger 和 ApiSIX Ingress 的组合,从生态系统和扩展能力的角度来看,有几个关键优势:
FluxCD、Flagger 和 ApiSIX Ingress 的组合构建了一个强大、灵活且面向未来的云原生应用部署和管理生态系统,适合在 Kubernetes 上运行复杂微服务架构的组织。
项目 | 服务提供商 | 用途/环境 | 备注 |
---|---|---|---|
云服务账号 | Google Cloud Platform (GCP) | 通用 | 访问和管理云资源 |
域名 | xx云 | 开发环境 | svc-sit.ink |
域名 | xx云 | 测试验证环境 | svc-uat.ink |
域名 | xx云 | 线上生产环境 | svc.ink |
云DNS服务 | 阿里云 | 域名解析 | 使用xx云的SaaS服务 |
CI/CD | GitHub Action | 自动化构建、测试、部署 | 促进持续集成和持续交付流程 |
CD | Flagger | 自动化Canary, Blue-Green, A/B Testing | 应用渐进发布 |
GitOps | FluxCD | 配置同步,自动化部署与管理 | 应用渐进发布 |
基础环境初始化可以参考:
https://cloud.tencent.com/developer/article/2373761
这重点介绍如何配置 FluxCD、Flagger 和 ApiSIX Ingress 的参考解决方案。以下是具体操作步骤:
为了在Kubernetes集群中部署必要的插件,我们使用自动化脚本。以下脚本用于安装和配置 FluxCD、Flagger 和 ApiSIX Ingress。
playbook/roles/k3s-addon/files/setup-ingress-apisix.sh
playbook/roles/k3s-addon/files/setup-flagger.sh
playbook/roles/k3s-addon/files/setup-fluxcd.sh
特别注意,Flagger需要配置 meshProvider=apisix 来确保与 ApiSIX 正确集成。这可以通过以下 Helm 命令实现:
helm upgrade -i flagger flagger/flagger \
--namespace ingress \
--set prometheus.install=false \
--set meshProvider=apisix
这确保了 Flagger 在金丝雀、蓝绿和A/B测试等策略中能够利用 ApiSIX 提供的路由能力。
为了支持渐进式发布,我们需要在应用的 Helm chart 中添加 Canary 对象的定义。以下是 canary.yaml 的示例模板,它定义了如何进行金丝雀发布:
charts/app/templates/canary.yaml
{{- if .Values.canary.enabled }}
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: {{ template "app.fullname" . }}
labels:
app: {{ template "app.name" . }}
chart: {{ template "app.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
provider: {{ .Values.canary.provider }}
targetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ template "app.name" . }}
# ingress reference
ingressRef:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: {{ template "app.fullname" . }}
progressDeadlineSeconds: 60
service:
port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
analysis:
interval: {{ .Values.canary.analysis.interval }}
threshold: {{ .Values.canary.analysis.threshold }}
maxWeight: {{ .Values.canary.analysis.maxWeight }}
stepWeight: {{ .Values.canary.analysis.stepWeight }}
metrics:
- name: request-success-rate
threshold: {{ .Values.canary.thresholds.successRate }}
interval: 1m
- name: request-duration
threshold: {{ .Values.canary.thresholds.latency }}
interval: 1m
{{- if .Values.canary.metric_template.enabled }}
- name: "404s percentage"
templateRef:
name: not-found-percentage
thresholdRange:
max: 5
interval: 1m
{{- endif }}
webhooks:
{{- if .Values.canary.acceptance-test.enabled }}
- name: acceptance-test
type: pre-rollout
url: {{ .Values.canary.load_test_url }}
timeout: 10s
metadata:
type: bash
cmd: "{{ .Values.canary.acceptance-test.cmd }}"
{{- end }}
{{- if .Values.canary.loadtest.enabled }}
- name: load-test
timeout: 5s
metadata:
cmd: "{{ .Values.canary.loadtest.cmd }}"
{{- end }}
---
{{- if .Values.canary.metric_template.enabled }}
apiVersion: flagger.app/v1beta1
kind: MetricTemplate
metadata:
name: not-found-percentage
namespace: canary
spec:
provider:
type: prometheus
address: http://flagger-prometheus.apisix:9090
query: |
sum(
rate(
apisix_http_status{
route=~"{{ namespace }}_{{ route }}-{{ target }}-canary_.+",
code!~"4.."
}[{{ interval }}]
)
)
/
sum(
rate(
apisix_http_status{
route=~"{{ namespace }}_{{ route }}-{{ target }}-canary_.+"
}[{{ interval }}]
)
) * 100
{{- end }}
{{- end }}
这个配置允许在部署应用时通过启用 canary 参数来触发渐进式发布。
最后一步是更新 GitOps 仓库,开启应用的 canary.enabled 参数。这样,FluxCD 在同步仓库状态到集群时,可以自动触发渐进式发布流程。示例配置如下:
gitops/apps/python-demo/release.yaml
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: stable
namespace: demo-python
spec:
chart:
spec:
chart: app
version: "0.1.1"
sourceRef:
kind: HelmRepository
name: stable
namespace: demo-python
interval: 1m
values:
image:
repository: artifact.onwalk.net/base/scaffolding-design/python
tag: "d72ba38f7a3a76b71eb50f00fe46a94497e6ecaa"
ingress:
className: "apisix"
canary:
enabled: true
通过上述步骤,我们能够实现在多集群环境中的应用渐进式发布,确保新版本的平滑和安全部署。此方法结合了自动化、监控和灵活的发布策略,使得管理多个Kubernetes集群变得更加高效和可靠。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。