当前位置:首页 > 技术 > 正文内容

基于Flux、Helm v3、Linkerd与Flagger实现Kubernetes渐进式交付

访客 技术 2026年6月22日 7
架构图

概述

本文将指导您在Kubernetes集群上设置GitOps风格的渐进式交付管道。

GitOps简介

GitOps是一种通过Git作为声明性基础设施和工作负载的单一可信来源进行持续交付的方法。对于Kubernetes而言,这意味着使用`git push`替代`kubectl create/apply`命令。

与传统CI/CD管道不同,GitOps要求所有生产环境变更必须先提交到源代码管理系统(通常通过拉取请求),然后才能应用于集群。这种方式确保了整个生产状态受版本控制保护,并可以在灾难发生时快速恢复。

渐进式交付

渐进式交付涵盖多种高级部署模式,如金丝雀发布、功能标记和A/B测试。它通过细粒度控制降低新版本引入的风险。

前置条件

为完成本指南,您需要一个支持负载均衡器和RBAC的Kubernetes集群(版本1.13或更高)。此外,请确保已安装以下工具:

  • kubectl 1.16
  • git 2.20

环境搭建

Helm v3安装

在macOS上,可以通过以下命令安装Helm v3 CLI:

brew install helm

对于Linux或Windows,可从官方发布页面下载二进制文件。

Git配置

Fork workshop仓库并克隆至本地:

export GHUSER=your_username
git clone https://github.com/${GHUSER}/gitops-helm-workshop

设置GitHub用户名和电子邮件:

cd gitops-helm-workshop
git config user.name "${GHUSER}"
git config user.email "your_email@example.com"

Flux安装

添加Flux Helm仓库:

helm repo add fluxcd https://charts.fluxcd.io

创建fluxcd命名空间:

kubectl create ns fluxcd

安装Flux:

helm upgrade -i flux fluxcd/flux --wait \
--namespace fluxcd \
--set registry.pollInterval=1m \
--set git.pollInterval=1m \
--set git.url=git@github.com:${GHUSER}/gitops-helm-workshop

安装fluxctl:

# macOS 和 Linux
curl -sL https://fluxcd.io/install | sh
export PATH=$PATH:$HOME/.fluxcd/bin

# Windows
访问 https://github.com/fluxcd/flux/releases 下载对应版本

获取Git SSH公钥:

export FLUX_FORWARD_NAMESPACE=fluxcd
fluxctl identity

将公钥添加到GitHub仓库的部署密钥中,确保选中"Allow write access"。

Helm Operator安装

在fluxcd命名空间中安装Flux Helm Operator:

helm upgrade -i helm-operator fluxcd/helm-operator --wait \
--namespace fluxcd \
--set git.ssh.secretName=flux-git-deploy \
--set git.pollInterval=1m \
--set chartsSyncInterval=1m \
--set helm.versions=v3

Linkerd安装

下载Linkerd v2 CLI:

# macOS 和 Linux
curl -sL https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin

# Windows
访问 https://github.com/linkerd/linkerd2/releases 下载对应版本

安装Linkerd控制平面:

linkerd install | kubectl apply -f -

验证安装:

linkerd check

Flagger安装

添加Flagger Helm仓库:

helm repo add flagger https://flagger.app

安装Flagger Canary CRD:

kubectl apply -f https://raw.githubusercontent.com/weaveworks/flagger/master/artifacts/flagger/crd.yaml

在linkerd命名空间中安装Flagger:

helm upgrade -i flagger flagger/flagger --wait \
--namespace linkerd \
--set crd.create=false \
--set metricsServer=http://linkerd-prometheus:9090 \
--set meshProvider=linkerd

应用部署

NGINX Ingress控制器安装

创建启用Linkerd注入的命名空间:

apiVersion: v1
kind: Namespace
metadata:
  annotations:
    fluxcd.io/ignore: "false"
    linkerd.io/inject: enabled
  name: ingress-nginx

创建Helm release以安装NGINX Ingress控制器:

apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
  name: nginx-ingress
  namespace: ingress-nginx
spec:
  releaseName: nginx-ingress
  chart:
    repository: https://kubernetes-charts.storage.googleapis.com/
    name: nginx-ingress
    version: 1.33.4
  values:
    controller:
      service:
        type: LoadBalancer

应用更改:

git add -A && git commit -m "install ingress" && git push origin master && fluxctl sync

Podinfo应用安装

创建启用Linkerd注入的prod命名空间:

apiVersion: v1
kind: Namespace
metadata:
  annotations:
    fluxcd.io/ignore: "false"
    linkerd.io/inject: enabled
  name: prod

创建Helm release以安装podinfo:

apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
  name: podinfo
  namespace: prod
spec:
  releaseName: podinfo
  chart:
    git: git@github.com:GHUSER/gitops-helm-workshop
    ref: master
    path: cluster/charts/podinfo
  values:
    image:
      repository: stefanprodan/podinfo
      tag: 3.1.0
    service:
      enabled: true
      type: ClusterIP
    ingress:
      enabled: true
      annotations:
        kubernetes.io/ingress.class: "nginx"
      path: /
      hosts:
        - LB-PUBLIC-IP.nip.io

应用更改:

git add -A && git commit -m "install podinfo" && git push origin master && fluxctl sync

自动化升级

通过注解Helm release对象,可以启用Flux自动更新镜像标签:

apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
  annotations:
    fluxcd.io/automated: "true"
    fluxcd.io/tag.chart-image: semver:~3.1

应用更改:

git add -A && git commit -m "automate podinfo" && git push origin master && fluxctl sync

金丝雀发布

编辑podinfo Helm release以禁用自动更新和服务:

apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
  name: podinfo
  namespace: prod
spec:
  releaseName: podinfo
  values:
    image:
      repository: stefanprodan/podinfo
      tag: 3.1.0
    service:
      enabled: false
      type: ClusterIP

创建Canary资源:

apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: podinfo
  namespace: prod
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  service:
    port: 9898
  analysis:
    interval: 10s
    maxWeight: 100
    stepWeight: 5
    threshold: 5
    metrics:
      - name: request-success-rate
        thresholdRange:
          min: 99
        interval: 1m
      - name: request-duration
        thresholdRange:
          max: 500
        interval: 1m

触发金丝雀发布:

git add -A && git commit -m "update podinfo" && git push origin master && fluxctl sync

监控与回滚

通过Linkerd仪表板实时监控服务健康状况:

linkerd dashboard --port=50750

观察流量变化:

watch kubectl -n prod get canaries

在失败情况下,Flagger会自动回滚:

kubectl -n linkerd logs deployment/flagger -f | jq .msg
标签: Flux

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。