使用 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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
人工智能 自然语言处理 安全
2026 最新版 OpenClaw 终于来了!安装一步到位(包含新安装包)
等了很久的 2026 最新版 OpenClaw 正式更新,这次带来更稳定的运行体验和完整汉化。无需复杂命令、不用配置环境,跟着流程轻松安装,新手也能一次成功,用过的都说省心。
|
6月前
|
存储 人工智能 安全
2026 最新版 OpenClaw 安装与汉化完整操作流程(包含新安装包)
本文详细梳理 2026 最新版 OpenClaw 从安装到汉化的全部操作流程,步骤清晰、条理分明,同时对安装过程中容易出现的问题进行提示,帮助用户一次性顺利完成部署。
|
12月前
|
存储 弹性计算 容灾
阿里云渠道商:阿里云NAS如何实现数据的高可用性?
阿里云NAS通过分布式架构、多副本与跨可用区容灾,实现99.95%可用性及11个9数据持久性,支持多挂载点、VPC安全隔离,助力企业构建高可用存储体系,保障业务永续。
|
Kubernetes 监控 数据可视化
k8s学习--使用argo-rollouts实现金丝雀发布
k8s学习--使用argo-rollouts实现金丝雀发布
1315 1
|
存储 SQL BI
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
2499 1
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
|
缓存 Kubernetes 负载均衡
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
2182 0
|
存储 Kubernetes 调度
|
消息中间件 RocketMQ 索引
RocketMQ消费者如何实现重平衡
RocketMQ消费者如何实现重平衡
979 0
|
Prometheus 监控 Cloud Native
使用 Prometheus 配置 SLO 监控和告警
使用 Prometheus 配置 SLO 监控和告警

热门文章

最新文章