使用 Ingress 实现金丝雀发布

简介: Service 是基于四层协议来实现的路由转发,常用于 NodePort 方式来对外提供服务,但是 当我们的业务模块较多时,使用 NodePort 的方式便不利于管理。 所以,我们可以使用 Ingress Controller 来通过匹配 URL 的方式实现 HTTP/HTTPS 代理。

使用 Ingress 实现金丝雀发布



一、基本介绍


二、Ingress 使用介绍


1.安装

2.基本使用

3.实现金丝雀发布


一、基本介绍



Service 是基于四层协议来实现的路由转发,常用于 NodePort 方式来对外提供服务,但是 当我们的业务模块较多时,使用 NodePort 的方式便不利于管理。 所以,我们可以使用 Ingress Controller 来通过匹配 URL 的方式实现 HTTP/HTTPS 代理。


Ingress 特点:


  • 通过配置 Ingress,可以实现对内部服务提供可访问的 URL、负载均衡、终止 SSL/TLS,并且可以提供基于域名的虚拟主机。


Ingress 支持的调度方式:


  1. URL 路径映射调度:通过配置 Ingress 中的 path 实现。
  2. 主机调度:通过配置 Ingress 中的 host 实现。


Ingress 常见配置方式: 用户通过访问域名,域名解析到 SLB 的 IP 地址上,接着 SLB 将请求代理到当前正在监听的端口上,我们这里绑定的是 Ingress 映射出来的端口号。Ingress 通过匹配 URL 的方式找到绑定的 Service,最后 Service 将请求转发到后端 Pod 应用中。


image.png


二、Ingress 使用介绍



1.安装


[root@k8s-master01 ~]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.48.1/deploy/static/provider/cloud/deploy.yaml
[root@k8s-master01 ~]# sed -i 's/LoadBalancer/NodePort/' deploy.yaml      # Ingress 对外提供服务的方式
[root@k8s-master01 ~]# sed -i 's/Deployment/DaemonSet/' deploy.yaml       # Ingress 部署方式
[root@k8s-master01 ~]# sed -i '/k8s.gcr.io/s/image:.*/image: registry.aliyuncs.com\/google_containers\/nginx-ingress-controller:v0.48.1/' deploy.yaml
[root@k8s-master01 ~]# kubectl apply -f deploy.yaml
[root@k8s-master01 ~]# kubectl get all -n ingress-nginx


image.png


2.基本使用


1)创建 Pod 和 Service


[root@k8s-master01 ~]# vim test-web-server.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-web-server
  labels:
    app: test-web-server
spec:
  containers:
  - name: test-web-server
    image: registry.cn-hangzhou.aliyuncs.com/zhuang_zz/test:web-v1
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: test-web-server
spec:
  ports:
  - name: test-web-server
    port: 8080
    targetPort: 8080
  selector:
    app: test-web-server
[root@k8s-master01 ~]# kubectl apply -f test-web-server.yaml


2)创建 Ingress


[root@k8s-master01 ~]# vim test-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: test-web-server
          servicePort: 8080
        path: /
[root@k8s-master01 ~]# kubectl apply -f test-ingress.yaml


因为我们这个域名是自定义配置的,所以需要配置 Hosts 解析(本地解析)


Linux:/etc/hosts
Windows:C:\Windows\System32\drivers\etc\hosts


3)验证


image.png


1)通过 Ingress 实现 HTTPS 代理


[root@k8s-master01 ~]# openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 -keyout server.key -out server.crt -subj "/CN=*.tianya.com/O=*.tianya.com"
[root@k8s-master01 ~]# kubectl create secret tls www.tianya.com --key server.key --cert server.crt
[root@k8s-master01 ~]# vim test-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: test-web-server
          servicePort: 8080
        path: /
  tls:
  - hosts:
    - www.tianya.com
      secretName: www.tianya.com


2)验证


image.png


  • 因为我们上面配置的证书是自签的,并没有 CA 认证,所以会出现证书错误(这是正常的)


1)实现 HTTP 不自动跳转到 HTTPS


当我们 Ingress 的配置含有 tls 时,HTTP 便会自动跳转到 HTTPS 上。所以我们可以通过 ssl-redirect: 'false' 来关闭自动跳转。


[root@k8s-master01 ~]# vim test-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: test-web-server
          servicePort: 8080
        path: /
  tls:
  - hosts:
    - www.tianya.com
      secretName: www.tianya.com
[root@k8s-master01 ~]# kubectl apply -f test-ingress.yaml


2)验证


image.png


1)通过 Service + Endpoints 实现代理到外部应用


我们下面是使用容器方式启动的 Nginx 应用,原因是因为简单,方便验证。要是物理安装的 Nginx 直接配置 Endpoints 即可。


[root@k8s-master01 ~]# vim external-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeName: k8s-master01
      containers:
      - name: nginx
        image: nginx:1.21.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          hostPort: 8080
        volumeMounts:
        - mountPath: /usr/share/nginx/html/zhangsan
          name: nginx-html
      volumes:
      - hostPath:
          path: /root/zhangsan
        name: nginx-html
---
apiVersion: v1
kind: Endpoints
metadata:
  name: nginx
subsets:
- addresses:
  - ip: 192.168.1.1
  ports:
  - port: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    targetPort: 8080
[root@k8s-master01 ~]# kubectl apply -f external-nginx.yaml
[root@k8s-master01 ~]# echo "This is zhangsan" > /root/zhangsan/index.html


2)修改 Ingress 配置


[root@k8s-master01 ~]# vim test-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: test-web-server
          servicePort: 8080
        path: /
      - backend:
          serviceName: nginx
          servicePort: 80
        path: /zhangsan/
  tls:
  - hosts:
    - www.tianya.com
      secretName: www.tianya.com
[root@k8s-master01 ~]# kubectl apply -f test-ingress.yaml


3)验证


image.png


3.实现金丝雀发布


金丝雀发布,也叫做灰度发布,简单来说就是在两个版本之间进行切换,我们可以先分配一小部分流量给到新的应用,来进行功能验证。当验证通过时,我们便可以将流量完全的分配到新的应用上。即使在验证时出现问题,也可以很快的将流量切回到旧的应用。


Ingress 主要就是通过配置 annotations 来实现金丝雀发布:官方介绍


1)基于 Weight 实现金丝雀发布


[root@k8s-master01 ~]# vim uat-web-server.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: uat
---
apiVersion: v1
kind: Pod
metadata:
  name: uat-web-server
  namespace: uat
  labels:
    app: uat-web-server
spec:
  containers:
  - name: uat-web-server
    image: registry.cn-hangzhou.aliyuncs.com/zhuang_zz/test:web-v2
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: uat-web-server
  namespace: uat
spec:
  ports:
  - name: uat-web-server
    port: 8080
    targetPort: 8080
  selector:
    app: uat-web-server
[root@k8s-master01 ~]# kubectl apply -f uat-web-server.yaml


2)修改 Ingress 配置


[root@k8s-master01 ~]# vim canary-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: test-web-server
          servicePort: 8080
        path: /
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: uat-ingress
  namespace: uat
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: uat-web-server
          servicePort: 8080
        path: /
[root@k8s-master01 ~]# kubectl apply -f canary-ingress.yaml


3)验证


image.png


1)基于 Cookie 实现金丝雀发布


[root@k8s-master01 ~]# vim canary-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: uat-ingress
  namespace: uat
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "uat-web-canary"
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: uat-web-server
          servicePort: 8080
        path: /
[root@k8s-master01 ~]# kubectl apply -f canary-ingress.yaml


2)验证


image.png


1)基于 Header 实现金丝雀发布


[root@k8s-master01 ~]# vim canary-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: uat-ingress
  namespace: uat
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "uat-web-canary"
spec:
  rules:
  - host: www.tianya.com
    http:
      paths:
      - backend:
          serviceName: uat-web-server
          servicePort: 8080
        path: /
[root@k8s-master01 ~]# kubectl apply -f canary-ingress.yaml


2)验证


image.png

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
监控 安全 Perl
Istio 升级新方式:金丝雀升级
Istio 1.6 推出了渐进式的升级方式:金丝雀升级,为相对头疼的 Istio 升级问题提供了一种解决方案。
855 0
|
9月前
|
Kubernetes 容器
K8s 金丝雀发布
K8s 金丝雀发布
78 0
|
7月前
|
弹性计算 Kubernetes 测试技术
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
245 0
|
9月前
|
Prometheus Kubernetes 监控
基于 Flagger Operator 的 Traefik 金丝雀部署
在日常的项目开发过程中时,我们时常会面临服务变更的挑战,为不影响用户体验,我们往往尽可能需要规避服务不可用风险。因此,持续交付便应运而生,其被接受为一种企业软件实践,并且是完善的持续集成原则的自然演变。然而,持续部署仍然非常罕见,这可能是由于管理的复杂性以及担心部署失败会影响系统可用性。在整个持续交付体系中,金丝雀发布,或许是最为经典的一个场景,基于此,我们能够很快发现不健康和“有问题”的服务,并且可以毫不费力地回滚到上一个的版本。
78 0
|
Prometheus Kubernetes 负载均衡
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
|
Kubernetes Cloud Native Java
灰度发布、蓝绿部署、金丝雀都是啥?
在滚动部署中,应用的新版本逐步替换旧版本。实际的部署发生在一段时间内。在此期间,新旧版本会共存,而不会影响功能和用户体验。这个过程可以更轻易的回滚和旧组件不兼容的任何新组件。
灰度发布、蓝绿部署、金丝雀都是啥?
|
设计模式 Kubernetes Cloud Native
干货分享|使用 Istio 实现灰度发布
Kubernetes 作为基础平台,提供了强大的容器编排能力。但是在其上部署业务和服务治理上,仍然会面对一些复杂性和局限性。在服务治理上,已经有许多成熟的 ServiceMesh 框架用于扩充其能力,如 Istio、Linkerd、Dapr 等。本文将主要介绍如何使用 Istio 扩充 Kubernetes 灰度发布的能力。
|
Kubernetes 负载均衡 监控
Kubernetes 实现灰度和蓝绿发布
Kubernetes 实现灰度和蓝绿发布
1084 1
|
运维 Kubernetes 负载均衡
kubernetes 灰度发布
kubernetes 灰度发布
441 1
|
Prometheus Kubernetes 监控
Linkerd 金丝雀部署与 A/B 测试
Linkerd 金丝雀部署与 A/B 测试
164 0
Linkerd 金丝雀部署与 A/B 测试