前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 NGINX ingress controller 和 Flagger 来实现 canary deployments

使用 NGINX ingress controller 和 Flagger 来实现 canary deployments

原创
作者头像
philentso
修改于 2022-12-21 09:56:23
修改于 2022-12-21 09:56:23
72500
代码可运行
举报
文章被收录于专栏:philentsophilentso
运行总次数:0
代码可运行

使用 NGINX ingress controller 和 Flagger 来实现 canary deployments

Flagger 介绍

Flagger 是一个逐步交付的 Kubernetes operator.

Flagger 是一个渐进式的交付工具,可以为运行在 Kubernetes 上的应用程序自动发布流程。它通过逐步将流量转移到新版本,同时测量指标和运行一致性测试,降低了在生产中引入新软件版本的风险.

Flagger 使用 service mesh(App Mesh, Istio, Linkerd, Kuma, Open Service Mesh)或 ingress controller(Contour, Gloo, NGINX, Skipper, Traefik)来实现几种部署策略(金丝雀发布、A/B测试、蓝/绿镜像).

对于发布分析,Flagger 可以查询 Prometheus、InfluxDB、Datadog、New Relic、CloudWatch、Stackdriver 或 Graphite,对于警报,它使用 Slack、MS Teams、Discord 和 Rocket.

先决条件

Flagger 需要 Kubernetes 集群 v1.19 或更高版本,以及 NGINX ingress v1.0.2 或更高版本。

使用 Helm v3 安装 NGINX ingress controller:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

$ kubectl create ns ingress-nginx

$ helm upgrade -i ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.metrics.enabled=true \
--set controller.podAnnotations."prometheus\.io/scrape"=true \
--set controller.podAnnotations."prometheus\.io/port"=10254

//类似以下安装输出
Release "ingress-nginx" has been upgraded. Happy Helming!
NAME: ingress-nginx
LAST DEPLOYED: Tue Dec 20 07:49:42 2022
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller'

An example Ingress that makes use of the controller:
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: example
    namespace: foo
  spec:
    ingressClassName: nginx
    rules:
      - host: www.example.com
        http:
          paths:
            - pathType: Prefix
              backend:
                service:
                  name: exampleService
                  port:
                    number: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
      - hosts:
        - www.example.com
        secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

将 Flagger 和 Prometheus 附加组件安装在与 ingress controller 相同的命名空间中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ helm repo add flagger https://flagger.app
"flagger" has been added to your repositories

$ helm upgrade -i flagger flagger/flagger \
--namespace ingress-nginx \
--set prometheus.install=true \
--set meshProvider=nginx
Release "flagger" does not exist. Installing it now.
NAME: flagger
LAST DEPLOYED: Tue Dec 20 07:57:21 2022
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Flagger installed

$ kubectl get po -n ingress-nginx
NAME                                  READY   STATUS    RESTARTS        AGE
flagger-57df5fbcb9-2w6v2              1/1     Running   0               12m
flagger-prometheus-5d44fbdbb8-hzqmx   1/1     Running   1 (7m42s ago)   12m
ingress-nginx-controller-crjkc        1/1     Running   0               17m
$ kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
flagger-prometheus                   ClusterIP      10.100.239.197   <none>        9090/TCP                     17h
ingress-nginx-controller             LoadBalancer   10.101.203.205   <pending>     80:30216/TCP,443:31852/TCP   102d
ingress-nginx-controller-admission   ClusterIP      10.109.225.125   <none>        443/TCP                      102d
ingress-nginx-controller-metrics     ClusterIP      10.102.84.232    <none>        10254/TCP                    17h

启动

Flagger 采用 Kubernetes 部署和可选的水平 Pod horizontal pod autoscaler (HPA),然后创建一系列对象(Kubernetes deployments, ClusterIP services 和 canary ingress),

这些对象将应用程序暴露在群集外部,并推动 Canary 分析和提升;

Create a test namespace

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl create ns test

Create a deployment and a horizontal pod autoscaler

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/fluxcd/flagger/tree/main/kustomize/podinfo

$ kubectl apply -k https://github.com/fluxcd/flagger//kustomize/podinfo?ref=main
deployment.apps/podinfo created
Warning: autoscaling/v2beta2 HorizontalPodAutoscaler is deprecated in v1.23+, unavailable in v1.26+; use autoscaling/v2 HorizontalPodAutoscaler
horizontalpodautoscaler.autoscaling/podinfo created

// 查看部署 podinfo
$ kubectl get po -n test
NAME                                  READY   STATUS    RESTARTS      AGE
podinfo-5d876b68bd-8pvv2              1/1     Running   0             2m56s
podinfo-5d876b68bd-fmsvw              1/1     Running   0             2m57s

Install flagger-loadtester

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ helm upgrade -i flagger-loadtester flagger/loadtester --namespace=test
Release "flagger-loadtester" does not exist. Installing it now.
NAME: flagger-loadtester
LAST DEPLOYED: Tue Dec 20 08:17:43 2022
NAMESPACE: test
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Flagger's load testing service is available at http://flagger-loadtester.test/

Create an ingress podinfo-ingress.yaml definition (replace app.example.com with your own domain)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: podinfo
  namespace: test
  labels:
    app: podinfo
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: "app.example.com"
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: podinfo
                port:
                  number: 80

$ kubectl apply -f ./podinfo-ingress.yaml
ingress.networking.k8s.io/podinfo created

创建 Canary 自定义资源 podinfo-canary.yaml(将 app.example.com 替换为自己的域

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: podinfo
  namespace: test
spec:
  provider: nginx
  # deployment reference
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  # ingress reference
  ingressRef:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    name: podinfo
  # HPA reference (optional)
  autoscalerRef:
    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    name: podinfo
  # the maximum time in seconds for the canary deployment
  # to make progress before it is rollback (default 600s)
  progressDeadlineSeconds: 60
  service:
    # ClusterIP port number
    port: 80
    # container port number or name
    targetPort: 9898
  analysis:
    # schedule interval (default 60s)
    interval: 10s
    # max number of failed metric checks before rollback
    threshold: 10
    # max traffic percentage routed to canary
    # percentage (0-100)
    maxWeight: 50
    # canary increment step
    # percentage (0-100)
    stepWeight: 5
    # NGINX Prometheus checks
    metrics:
    - name: request-success-rate
      # minimum req success rate (non 5xx responses)
      # percentage (0-100)
      thresholdRange:
        min: 99
      interval: 1m
    # testing (optional)
    webhooks:
      - name: acceptance-test
        type: pre-rollout
        url: http://flagger-loadtester.test/
        timeout: 30s
        metadata:
          type: bash
          cmd: "curl -sd 'test' http://podinfo-canary/token | grep token"
      - name: load-test
        url: http://flagger-loadtester.test/
        timeout: 5s
        metadata:
          cmd: "hey -z 1m -q 10 -c 2 http://app.example.com/"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl apply -f ./podinfo-canary.yaml
canary.flagger.app/podinfo created

此时 Canary 说明初始化已完成!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get canary -n test
NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
podinfo   Initialized   0        2022-12-21T03:21:49Z

自动化的 canary 进阶

Flagger 实现了一个控制循环,在测量 HTTP 请求成功率、请求平均持续时间和 pod 健康度等关键性能指标的同时,逐渐将流量转移到金丝雀。基于对关键绩效指标的分析,金丝雀被提升或中止,分析结果被发布到 Slack 或 MS Teams.

通过更新容器镜像来触发一个 canary 部署

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl set image deployment/podinfo podinfod=ghcr.io/stefanprodan/podinfo:6.0.1 -n test
deployment.apps/podinfo image updated

$ kubectl get canary -n test
NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
podinfo   Progressing   5        2022-12-21T07:40:33Z


// Flagger 检测到部署的修订版发生了变化并开始新的展开:
$ kubectl describe canary/podinfo -n test

Status:
  Canary Weight:         0
  Failed Checks:         0
  Phase:                 Succeeded
Events:
  Type     Reason  Age   From     Message
  ----     ------  ----  ----     -------
  Normal   Synced  3m    flagger  New revision detected podinfo.test
  Normal   Synced  3m    flagger  Scaling up podinfo.test
  Warning  Synced  3m    flagger  Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available
  Normal   Synced  3m    flagger  Advance podinfo.test canary weight 5
  Normal   Synced  3m    flagger  Advance podinfo.test canary weight 10
  Normal   Synced  3m    flagger  Advance podinfo.test canary weight 15
  Normal   Synced  2m    flagger  Advance podinfo.test canary weight 20
  Normal   Synced  2m    flagger  Advance podinfo.test canary weight 25
  Normal   Synced  1m    flagger  Advance podinfo.test canary weight 30
  Normal   Synced  1m    flagger  Advance podinfo.test canary weight 35
  Normal   Synced  55s   flagger  Advance podinfo.test canary weight 40
  Normal   Synced  45s   flagger  Advance podinfo.test canary weight 45
  Normal   Synced  35s   flagger  Advance podinfo.test canary weight 50
  Normal   Synced  25s   flagger  Copying podinfo.test template spec to podinfo-primary.test
  Warning  Synced  15s   flagger  Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available
  Normal   Synced  5s    flagger  Promotion completed! Scaling down podinfo.test

注意,如果在 canary 分析期间对部署应用新的变化,Flagger 将重新启动分析

可以用以下方法监控所有的 canaries

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ watch kubectl get canaries --all-namespaces

以上已完成 Flagger 结合 Ingress nginx 的自动化部署!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
python SMTP邮件发送
本例使用的时python2.7环境,python3的操作应该也是差不多的。 需要用到smtplib和email两个包。
py3study
2020/01/16
1.9K0
使用Python内置的smtplib包和email包来实现邮件的构造和发送。
一些邮箱登录比如 QQ 邮箱需要 SSL 认证,所以 SMTP 已经不能满足要求,而需要SMTP_SSL,解决办法为:
GhostCN_Z
2020/04/03
1.3K0
简单三步,用 Python 发邮件
0. 前言 发送电子邮件是个很常见的开发需求。比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了,就可以发个邮件到邮箱来提醒自己。 使用 Python 脚本发送邮件并不复杂。不过在网页上搜了些教程,都亲测无效,发现或多或少有点问题,导致发送失败。所以今天我们就来讲讲如何使用 Python 发送邮件。 本文主要内容包括,了解发邮件的思路,发送邮件需要的一些设置,发送一封简单的邮件,发送一封包含附件的邮件,在写代码过程中我们需要注意哪些问题等等。(完整参考代码地址见文末) 1. 思
Crossin先生
2018/04/17
1.2K0
简单三步,用 Python 发邮件
用python发送邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
用户6021899
2021/03/11
3370
用python发送邮件
100天精通Python丨办公效率篇 —— 11、Python自动化操作 Email(发送邮件、收邮件、邮箱客户端)
首先,你要掌握以SMTP协议为基础的发送邮件方法。这个非常简单,只需要在Python中使用smtplib包,调用其中的SMTP()函数方法建立邮件连接,便可以轻松地发送邮件。
不吃西红柿
2023/04/21
1.7K0
Python发送邮件
Python发邮件需要有SMTP服务,可以在本地搭建SMTP服务,也可以使用第三方的SMTP服务(比如网易邮箱或QQ邮箱)。 这里我使用了网易126邮箱来发邮件。
海天一树
2018/07/25
1.5K0
Python发送邮件
Python3实现自动发送邮件
首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
用户9925864
2022/07/27
3530
Python3实现自动发送邮件
Python发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
青阳
2021/11/26
9290
python 使用stmp发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
py3study
2020/01/06
1.1K0
Python 发邮件
普通邮件 [root@localhost checksalt]# cat python_email.py  #!/usr/bin/python # -*- coding: utf-8 -*- import sys def smtp(title,file):     import smtplib     from email.mime.text import MIMEText     from email.header import Header           with open(file, 'r') 
py3study
2020/01/15
1.7K0
接口测试基础——第2篇smtplib发送文字邮件
王者荣耀真害人!这就是昨天没发的原因…… 我先给大家补充一个用QQ发送纯文本电子邮件的代码,用QQ的朋友可以参考一下: # coding=utf-8 import smtplib from email.mime.text import MIMEText mail_host = “smtp.qq.com” receivers = “123@qq.com” sender = “456@qq.com” passwd = ‘QQ邮箱的授权码’ contents = “python发送邮件” # 构造邮件正文 ms
孟船长
2018/05/18
7560
使用 python 发送邮件
使用 python 发送邮件,这个也没啥讲的,分享三种方式发送邮件,最后一种三行代码就可以发送邮件,是不是很爽啊,话不多说,直接上代码
andrew_a
2019/08/20
1.4K0
python发送邮件(二)——smtplib模块和email模块
一、模块介绍 1、smtplib 模块(用于邮件的发送) ①理论解释 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) 通过这个语句,可以向SMTP服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有的参数都是可选的。 host:smtp服务器主机名 port:smtp服务的端口,默认是25;端口号可以省略。 但是使用25号端口有一个问题,就是保密性不够好,数据都是明文传输,没有加密。 现在一般都推荐使用SSL,Secure So
Elsa_阿尼
2021/07/27
5.6K0
python发送邮件(二)——smtplib模块和email模块
【测试开发】python系列教程:smtplib库
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
雷子
2023/08/21
3110
【测试开发】python系列教程:smtplib库
【水水水文章】用 Python 发邮件
青柠大佬在寒假写了一个每日推兽图的项目, 我突发奇想,通过py爬虫,自动将图发送到邮箱,
土土
2022/09/26
2940
python发送邮件案例分析
1、运用for循环,实现群发功能 接收方的昵称是统一的一个,可再优化一下,实现更加个性化,更加自由的发送邮件 from email.header import Header #处理邮件主题 from email.mime.text import MIMEText # 处理邮件内容 from email.utils import parseaddr, formataddr #用于构造特定格式的收发邮件地址 import smtplib #用于发送邮件 # 函数小工具 def _format_addr(s):
Elsa_阿尼
2021/07/28
8030
python收发邮件客户端
基于pyqt5 和 smtplib pop3标准邮箱协议开发邮件客户端 发送 SMTP #!/usr/bin/env python #-*- coding:utf-8 -*- #@Time: 2018/5/2上午11:27 #@Author:zhangrongwu #@File:qt_email.py from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QMainWindow, QApplication imp
程序员不务正业
2018/06/14
2.1K0
Python实现自动发送邮件(详解)
这点很关键,别忘了去开启SMTP, 别忘了去开启SMTP,否则邮件是无法发送成功的 。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码。
全栈程序员站长
2022/11/17
1.2K0
Python实现自动发送邮件(详解)
Python实现邮件发送
    RCPT 标识单个的邮件接收人;常在MAIL命令后面,可有多个rcpt to:
py3study
2020/01/07
7110
Python定时发送邮件
首先我们先申请一个邮箱的授权码用于邮箱身份验证。然后编写Python程序,利用SMTP发送邮件。最后利用Windows任务计划程序实现每天定时执行程序。
一只大鸽子
2022/12/06
9750
Python定时发送邮件
相关推荐
python SMTP邮件发送
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验