小阿轩yx-服务发布Ingress进阶

小阿轩yx-服务发布Ingress进阶

前言

Kubernetes 暴露服务的方式目前只有三种

  • LoadBlancer Service
  • NodePort Service
  • Ingress

ingress 通俗来讲

  • 和之前提到的 Service、Deployment,也是一个k8s 的资源类型。
  • 用于实现用域名的方式访问 k8s 内部应用。(只能用域名访问,不能用 IP 地址访问)

Ingress

  • 为 Kubernetes 集群中的服务提供了入口
  • 可以提供负载均衡、SSL 终止和基于名称的虚拟主机

生产环境中常用的Ingress 有

  • Treafik
  • Nginx
  • HAProxy
  • lstio

基本概念

  • service 的作用体现在两个方面

对集群内部

  • 它不断跟踪 pod 的变化
  • 更新 endpoint(端点)中对应 pod 的对象
  • 提供了 ip 不断变化的 pod 的服务发现机制

对集群外部

  • 它类似负载均衡器
  • 可以在集群内外部对 pod 进行访问

在 Kubernetes 中

  • Pod 的 IP 地址和 service 的 ClusterIP 仅可以在集群网络内部使用,对于集群外的应用是不可见的。

Kubernetes 目前提供了几种方案使外部的应用能够访问集群内的服务

  • NodePort:将 service 暴露在节点网络上,NodePort 背后就是 Kube-Proxy,Kube-Proxy 是沟通service 网络、Pod 网络和节点网络的桥梁。
  • 测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort 的端口管理就是个灾难。因为每个端口只能是一种服务,端口范围只能是30000-32767。
  • LoadBalancer:通过设置 LoadBalancer 映射到云服务商提供的 LoadBalancer 地址。
  • 这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。
  • 受限于云平台,且通常在云平台部署LoadBalancer 还需要额外的费用。
  • 在 service 提交后,Kubernetes 就会调用 cloudprovider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP 地址配置给负载均衡服务做后端。

  • externalIPs:service 允许为其分配外部IP,如果外部IP路由到集群中一个或多个Node上,Service会被暴露给这些 externalIPs。
  • 通过外部IP进入到集群的流量,将会被路由到Service的Endpoint上。
  • Ingress:只需一个或少量的公网 IP 和 LB,即可同时将多个 HTTP 服务暴露到外网,七层反向代理。
  • 可以简单理解为service的service,它其实就是一组基于域名和URL路径,把用户的请求转发到一个或多个service的规则。

目前比较流行的 IngressController 有

  • ingress-nginx(由Kubemetes官方维护)

  • nginx-ingress(由 Nginx 官方维护,注意和Ingress-nginx的区别)

  • Traefik

  • Istio

Ingress 组成

ingress

  • 是一个 API 对象
  • 对象的作用是定义请求如何转发到 service 的规则,可以理解为配置模版
  • 通过 yaml 文件来配置
  • 通过 http 或 https 暴露集群内部 service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于域名的反向代理
  • 要依靠 ingress-controller 来具体实现以上功能。

ingress-controller

  • 是具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
  • 并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现
  • 是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller, 而ingress对象是用来告诉ingress-controller该如何转发请求

目前

由 k8s 维护的 ingress-controller 只有

  • google云的GCE
  • ingress-nginx

其它还有很多第三方维护的 ingress-controller 

一般 ingress-controller 的形式都是一个 pod,里面跑着 daemon 程序和反向代理程序

  • daemon 负责不断监控集群变化,根据 ingress 对象生成配置并应用新配置到反向代理

Ingress 工作过程

用户访问一个业务的流程

  • 用户在浏览器中输入域名
  • 域名解析至业务的入口IP(一般为外部负载均衡器,比如阿里的SLB或者DMZ的网关)。
  • 外部负载均衡器反向代理至kubernetes的入口(一般为Ingress,或者通过NodePort暴露的服务等)。
  • Ingress 根据自身的配置找到对应的Service,再代理到对应的Service上。
  • 最后到达Service对应的某一个 Pod 上。

一般情况下

  • Ingress 主要是一个用户 kubernetes 集群业务的入口。
  • 是业务能够正常提供服务的核心

  • 在生产环境中,推荐使用单独的服务器作为Ingress Controller。

 Controller

  • 可以使用Traefik、Istio、Nginx、HaProxy等作为Ingress Controller。

Ingress 工作原理

  • ingress-controller 通过和 kubernetes APIServer 交互,动态的去感知集群中ingress规则变化
  • 然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置
  • 再写到 nginx-ingress-controller的pod里,这个ingress-controller的pod里运行着一个Nginx服务,控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中
  • 然后 reload 一下使配置生效。以此达到域名区分配置和动态更新的作用。

安装 Ingress Nginx Controller

  • 由于 Ingress Controller 相当于kubernetes集群中服务的 “大门

在生产环境中

  • 一定要保障 Controller 的稳定性和可用性
  • 为了Ingress Controller的可用性,一般采用单独的服务器作为Controller节点以此保障Ingress Controller的Pod资源不会被其他服务的Pod影响

Ingress Nginx

  • 官方提供了多种部署方式,本此将采用 Helm 的方式进行安装并且将Ingress Controller安装在k8s-node0l节点

首先将 images 镜像文件通过 Xftp 上传至 master、node01、node02(101、102、103)

 将 ingress-nginx 文件单独上传至 master(101)

最后再将资源清单文件单独上传至 master(101)

这一步开启会话同步

进入镜像文件三个节点同时导入镜像 

主机一

[root@k8s-master ~]# cd images/
[root@k8s-master images]# bash imp_docker_img.sh

主机二

[root@k8s-node01 ~]# cd images/
[root@k8s-node01 images]# bash imp_docker_img.sh

主机三

[root@k8s-node02 ~]# cd images/
[root@k8s-node02 images]# bash imp_docker_img.sh

取消会话同步

下载并安装 helm(已有 helm 环境可忽略此步骤)

https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz

解压

[root@k8s-master ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz

移动到指定目录下

[root@k8s-master ~]# mv linux-amd64/helm /usr/local/bin/

下载 Ingress Controller(已有离线包可忽略此步骤)

https://kubernetes.github.io/ingress-nginx

[root@k8s-master ~]# helm repo add ingress-nginx
"ingress-nginx" has been added to your repositories

修改 Ingress Controller 参数

[root@k8s-master ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ingress-nginx" chart repository
Update Complete. ⎈Happy Helming!⎈

拉取对应的镜像版本

[root@k8s-master ~]# helm pull ingress-nginx/ingress-nginx --version 4.7.1

解压

[root@k8s-master ~]# tar xvf ingress-nginx-4.7.1.tgz

修改配置文件

[root@k8s-master ~]# vim ingress-nginx/values.yaml
controller:
    name: controller
    image:
        chroot: false
        registry: registry.cn-hangzhou.aliyuncs.com
        image: tanzu/controller
        tag: "v1.6.4"
        #digest: sha256:15be4666c53052484dd2992efacf2f50ea77a78ae8aa21ccd91af6baaa7ea22f
        #digestChroot: sha256:0de01e2c316c3ca7847ca13b32d077af7910d07f21a4a82f81061839764f8f81

 # 将Controller的registry仓库地址修改为国内的

  • registry: registry.cn-hangzhou.aliyuncs.com
  • image: tanzu/controller
  • tag: "v1.6.4"
  • #digest: sha256:15be4666c53052484dd2992efacf2f50ea77a78ae8aa21ccd91af6baaa7ea22f
  • #digestChroot: sha256:0de01e2c316c3ca7847ca13b32d077af7910d07f21a4a82f81061839764f8f81

​​​修改 opentelemetry 镜像地址

opentelemetry:
    enabled: false
    image: registry.cn-hangzhou.aliyuncs.com/tanzu/opentelemetry:v20230107
    containerSecurityContext:
      allowPrivilegeEscalation: false
  •  image: registry.cn-hangzhou.aliyuncs.com/tanzu/opentelemetry:v20230107

将 admissionWebhook 的镜像地址修改为国内的

patchWebhookJob:
      securityContext:
        allowPrivilegeEscalation: false
      resources: {}
    patch:
      enabled: true
      image:
        registry: registry.cn-hangzhou.aliyuncs.com
        image: tanzu/kube-webhook-certgen
        tag: v20220916-gd32f8c343
        #digest: sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b
        pullPolicy: IfNotPresent
  • registry: registry.cn-hangzhou.aliyuncs.com
  • image: tanzu/kube-webhook-certgen
  • tag: v20220916-gd32f8c343
  • #digest: sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b

修改 hostNetwork 的值为 true

  • 设置为 true 时,该 Pod 将与其所在节点共享网络命名空间。

dnsPolicy设置为 ClusterFirstWithHostNet

  • kubernetes 可以在 pod 级别通过 dnspolicy 字段设置DNS策略。

目前支持的 DNS 策略

  • Default:继承 pod 所在宿主机的域名解析设置。
  • ClusterFirst:将优先使用kubernetes环境的dns服务(如coreDNS提供的域名解析服务),将无法解析的域名转发到系统配置的上游DNS服务器。

  • ClusterFirstWithHostNet:适用与以hostNetwork模式运行的pod。

  • None:忽略集群的 DNS 配置,需要手工通过dnsConfig自定义DNS配置。这个选项在1.9版本中开始引入,到1.10版本时升级为Beta,到1.14版本时达到稳定版本。

nodeSelector 添加 ingress: "true"

nodeSelector:
    ingress: true
    kubernetes.io/os: linux

此配置能够将ingress安装在带有“ingress: true”标签的节点上。

  • ingress: true

修改 kind 类型为 DaemonSet

kind: DeamonSet
  • 如果已经下载好了离线的 helm 和 ingress-nginx,可以直接解压并安装,不必下载。

部署 ingress

给需要部署 Ingress Controller 的节点打标签

[root@k8s-master ~]# kubectl label node k8s-node01 ingress=true

创建 namespace

[root@k8s-master ~]# kubectl create ns ingress-nginx
namespace/ingress-nginx created

进入目录

[root@k8s-master ~]# cd ingress-nginx

安装 ingress-nginx

[root@k8s-master ingress-nginx]# helm install ingress-nginx -n ingress-nginx .
  • 注意最后有一个点

查看安装信息

[root@k8s-master ingress-nginx]# kubectl get po -n ingress-nginx -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
ingress-nginx-controller-2t6qh   1/1     Running   0          17s   192.168.10.102   k8s-node01   <none>           <none>

Ingress Nginx 入门

首先从最简单的配置开始

  • 假如公司有一个web服务的容器,需要为其添加一个域名,此时可以使用 Ingerss 实现该功能

创建一个用于学习的 namespace

[root@k8s-master ingress-nginx]# kubectl create ns study-ingress

创建一个 nginx 作为 web 服务

[root@k8s-master ingress-nginx]# kubectl create deployment nginx --image=nginx:1.7.9 \
-n study-ingress

创建一个该 web 容器的 Service

[root@k8s-master ingress-nginx]# kubectl expose deployment nginx --port 80 -n study-ingress

创建 ingress 指向上一步的 Service

[root@k8s-master ingress-nginx]# vim web-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: study-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: nginx.test.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific
  • service:
  •     name: nginx
  •      port:
  •          number: 80

路径类型

有3种支持 path 类型

  • ImplementationSpecific:对于这种path类型,匹配取决于IngressClass。可以将其视为一个单独的pathType或者将其认为和Prefix或者Exact路径类型一样。
  • Exact:精确匹配 URL 路径,并且区分大小写
  • Prefix:根据 URL 中的,被 / 分割的前缀进行匹配。匹配区分大小写并且按照元素对路径进行匹配。path元素指的是路径中由/分隔符分隔的标签列表。

路径的最后一个元素是请求路径中最后一个元素的子字符串,那么这个是不匹配的。

举例:/foo/bar匹配/foo/bar/baz,但是不匹配 /foo/barbaz

创建该 ingress

[root@k8s-master ingress-nginx]# kubectl create -f web-ingress.yaml
  • 不删除此 ingress,否则后面的 ssl 无法访问

客户端访问测试

  • 创建的 Ingress绑定的域名为nginx.test.com
  • 由于本次的 IngressController 是以 hostNetwork 模式部署的,因此将域名解析至 IngressController 所在的节点即可。
  • 如果 IngressController 上层还有一层网关,解析至网关IP即可。
  • 接下来通过域名 nginx.test.com 即可访问 Web 服务器。

虚拟机打开一个带桌面的主机

找到 hosts 文件并用记事本打开

打开并添加地址

打开浏览器输入地址访问

  • 可以看到通过上述简单的 Ingress 资源定义就可以实现以域名的方式访问服务,不需要再去维护复杂的Ngmx配置文件,大大降低了运维的复杂度和出错的频率。

Ingress Nginx 域名重定向 Redirect

  • 一个服务要更换域名时并不能直接更改,要有一个过渡过程
  • 这个过程中要将旧域名的访问跳转到新域名,可以使用 Redirect 功能
  • 等旧域名无访问时,再停止旧域名

Nginx 作为代理服务器时,Redirect 可用于域名的重定向

比如

  • 访问 old.com 被重定向到 new.com
  • Ingress 可以更简单的实现 Redirect 功能

用 nginx.redirect.com 作为旧域名,baidu.com 作为新域名演示

编辑 Ingress 文件

[root@k8s-master ingress-nginx]# vim redirect.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: https://www.baidu.com
  name: nginx-redirect
  namespace: study-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: nginx.redirect.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific

创建 Ingress

[root@k8s-master ingress-nginx]# kubectl create -f redirect.yaml

测试

  • 在客户端的 hosts文件添加域名 nginx.redirect.com

  • 使用域名 nginx.redirect.com 访问网站,打开的是 baidu.com,说明跳转成功

Ingress Nginx 前后端分离 Rewrite

  • 现在大部分应用都是前后端分离的架构,也就是前端用某个域名的根路径进行访问,后端接口采用/api进行访问,用来区分前端和后端。
  • 或者同时具有很多个后端,需要使用/api-a到A服务,/api-b到B服务,但是由于A和B服务可能并没有/api-a和/api-b的路径,因此需要将/api-x重写为“/”,才可以正常到A或者B服务,否则将会出现404的报错。

此时可以通过 Rewrite 功能达到这种效果

创建一个应用模拟后端服务

[root@k8s-master ~]# kubectl create deployment backend-api --image=nginx:1.7.9 -n study-ingress

创建 Service 暴露应用

[root@k8s-master ~]# kubectl expose deployment backend-api --port 80 -n study-ingress

查看该 Service 的地址

[root@k8s-master ~]# kubectl get svc -n study-ingress
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
backend-api   ClusterIP   10.108.159.54   <none>        80/TCP    49s
nginx         ClusterIP   10.106.204.36   <none>        80/TCP    103m

通过 /api-a 访问测试

  • http://nginx.test.com/api-a

编辑 ingress 实现 rewrite

[root@k8s-master ~]# vim rewirte.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: backend-api
  namespace: study-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: nginx.test.com
    http:
      paths:
      - backend:
          service:
            name: backend-api
            port:
              number: 80
        path: /api-a(/|$)(.*)
        pathType: ImplementationSpecific

创建该 ingress

[root@k8s-master ~]# kubectl create -f rewirte.yaml

访问测试

  • http://nginx.test.com/api-a

Ingress Nginx SSL 配置

  • 生产环境对外的服务般需要配置HTTPS协议使用Ingress也可以非常方便地添加HTTPS的证书。
  • 由于是学习环境并没有权威证书因此需要使用OpenSSL生成个测试证书(如果是生产环那么证书为在第三方公司购买的证书无须自行生成)

生成证书

[root@k8s-master ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginx.test.com"
Generating a 2048 bit RSA private key
.................+++
........................................+++
writing new private key to 'tls.key'

创建证书的 secret

[root@k8s-master ~]# kubectl create secret tls ca-secret --cert=tls.crt --key=tls.key -n study-ingress

编辑 ingress

[root@k8s-master ~]# vim ingress-ssl.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  creationTimestamp: null
  name: nginx-ingress-ssl
spec:
  ingressClassName: nginx-ssl
  rules:
  - host: nginx.test.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific
  tls:
  ##证书授权的域名列表
  - hosts:
    - nginx.test.com
    ##证书的secret名字
    secretName: ca-secret

创建此 ingress

[root@k8s-master ~]# kubectl create -f ingress-ssl.yaml

访问测试

  • https://nginx.test.com

Ingress Nginx 基本认证

  • 有些网站可能需要通过密码来访问,对于这类网站可以使用 nginx 的 basic-auth 设置密码访问

由于需要使用htpasswd工具因此需要安装httpd

安装 httpd(在 master 主节点)101

[root@k8s-master ~]# yum -y install httpd

使用 htpasswd 创建用户

[root@k8s-master ~]# htpasswd -c auth zhangsan
New password: 
Re-type new password: 
Adding password for user zhangsan

基于之前创建的密码文件创建 secret

[root@k8s-master ~]# kubectl create secret generic basic-auth --from-file=auth -n study-ingress

编辑 ingress 包含密码认证

[root@k8s-master ~]# vim ingress-with-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-realm: Please Input Your Username and Password
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-type: basic
  name: ingress-with-auth
  namespace: study-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: auth.test.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific
  • nginx.ingress.kubernetes.io/auth-secret: basic-auth:密码文件的secret名称
  • nginx.ingress.kubernetes.io/auth-type: basic:认证类型
  • ingressClassName: nginx
  • - host: auth.test.com
  • host: auth.test.com 客户端要访问的域名,注意不要使用前面的域名,或者把前面的ingress都删掉

部署此 ingress

[root@k8s-master ~]# kubectl create -f ingress-with-auth.yaml

访问测试

  • 在客户端 hosts 文件新添加域名 auth.test.com  的解析

灰度/金丝雀发布

灰度与蓝绿发布

  • 是为新版本服务创建一个与老版本服务完全一致的生产环境,在不影老版本服务的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。

灰度发布方式

  • 通常用于AB测试,是指一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。

金丝雀发布

  • 指在生产环境中逐步推出新版本应用程序,只在一小部分用户或流量中使用该版本,并根据反馈逐步扩大规模,最终完全替换旧版本。
  • 允许快速检测新版本与旧版本之间是否存在兼容性问题、性能问题或其他问题,并减轻了在实施全新发布时可能遭受的损失。

蓝绿部署

  • 指同时运行两个版本的应用。
  • 部署时并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量切换到新版本上。

例如

  • 发布前在蓝色的系统上进行测试,测试完成后切换为蓝色系统,同时观察蓝色系统的运行状态,如果运行出现问题可以及时切回绿色系统。

蓝绿部署的优点

  • 可以减少发布影响的时间。

例如

  • 某网站要进行后端升级,无需完全停掉服务更新,且出现问题后可以及时切回老版本。

蓝绿部署的缺点

  • 需要两倍的硬件资源
  • 需要额外进行付费
  • 微服务架构很难这样进行迁移
  • 要求蓝绿两套系统完全没有耦合
  • 迁移后未完成的任务进行迁移需要一定的成本

创建 V1 版本

首先创建模拟生产(Production)环境的命名空间和服务

[root@k8s-master ~]# kubectl create ns production

创建 v1 版本的应用

[root@k8s-master ~]# kubectl create deployment canary-v1 --image=registry.cn-beijing.aliyuncs.com/dotbalo/canary:v1 -n production

创建 Service 暴露应用

[root@k8s-master ~]# kubectl expose deployment canary-v1 --port 8080 -n production

创建 ingress 指定域名为 canary.com

[root@k8s-master ~]# cat v1-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: canary-v1
  namespace: production
spec:
  ingressClassName: nginx
  rules:
  - host: canary.com
    http:
      paths:
      - backend:
          service:
            name: canary-v1
            port:
              number: 8080
        path: /
        pathType: ImplementationSpecific
  • - host: canary.com
  •        - backend:
  •              service:
  •                  name: canary-v1
  •                 port:
  •                     number: 8080

路径类型 pathType

  • ImplementationSpecific:系统默认,有IngressClass控制器提供具体实现
  • exact:精确匹配URL路径,区分大小写

  • prefix:匹配URL路径的前缀

部署 ingress

[root@k8s-master ~]# kubectl create -f v1-ingress.yaml

测试访问

  • 在客户端添加 canary.com 的域名解析

创建 v2 版本

  • 充当灰度环境

创建 v2 版本的命名空间

[root@k8s-master ~]# kubectl create ns canary

创建 v2 版本的应用

[root@k8s-master ~]# kubectl create deployment canary-v2 --image=registry.cn-beijing.aliyuncs.com/dotbalo/canary:v2 -n canary

创建 v2 版本的 service

[root@k8s-master ~]# kubectl expose deployment canary-v2 --port 8080 -n canary

获取 svc 的信息

[root@k8s-master ~]# kubectl get svc -n canary
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
canary-v2   ClusterIP   10.110.139.239   <none>        8080/TCP   39s

测试连通性

[root@k8s-master ~]# curl 10.110.139.239:8080
<h1>Canary v2</h1>

通过 ingress 控制流量

[root@k8s-master ~]# vim canary-v2.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    ##指定此为灰度环境
    nginx.ingress.kubernetes.io/canary: "true"
    ##灰度环境的权重
    nginx.ingress.kubernetes.io/canary-weight: "10"
   ##此ingress的名称
   name: canary-v2
  ##所属的命名空间
  namespace: canary
spec:
  ingressClassName: nginx
  rules:
  ##客户端访问的域名
  - host: canary.com
    http:
      paths:
      ##后端设置,通常用来设置service
      - backend:
          service:
            name: canary-v2
            port:
              number: 8080
        path: /
        pathType: ImplementationSpecific
  • nginx.ingrss.kubernetes.io/canary: "true":表示此站点为灰度模式
  • nginx.ingress.kubernetes.io/canary-weight: "10":表示为该站点分配10%的流量,原站点就可以得到90%的流量

weight:“10”        权重为10

测试灰度发布

进行测试

[root@k8s-master ~]# for i in $(seq 10);do curl -s canary.com;done
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
  • 从结果大致判断出,两个网站的访问比例大约为1:9

修改权重为50的测试结果

[root@k8s-master ~]# ku edit ingress canary-v2 -n canary
#修改权重值为50
nginx.ingress.kubernetes.io/canary-weight: "50"

 循环遍历10次输出查看结果

[root@k8s-master ~]# for i in $(seq 10);do curl -s canary.com;done
<h1>Canary v2</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v2</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>

小阿轩yx-服务发布Ingress进阶

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个简单的示例配置,将 nginx-ingress 代理到 httpd 服务。 首先,你需要在 Kubernetes 集群中安装 nginx-ingress 控制器。然后,你需要创建一个 Kubernetes 服务和一个 Deployment 来运行 httpd。 下面是一个示例 Deployment 文件,名为 `httpd.yaml`: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: httpd spec: replicas: 1 selector: matchLabels: app: httpd template: metadata: labels: app: httpd spec: containers: - name: httpd image: httpd:latest ports: - containerPort: 80 ``` 然后创建这个 Deployment: ``` kubectl apply -f httpd.yaml ``` 接下来,你需要创建一个 Kubernetes 服务来将流量路由到 httpd。 下面是一个示例 Service 文件,名为 `httpd-service.yaml`: ```yaml apiVersion: v1 kind: Service metadata: name: httpd-service spec: selector: app: httpd ports: - name: http port: 80 targetPort: 80 ``` 然后创建这个 Service: ``` kubectl apply -f httpd-service.yaml ``` 最后,你需要创建一个 Ingress 对象来将流量路由到 httpd 服务。 下面是一个示例 Ingress 文件,名为 `httpd-ingress.yaml`: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: httpd-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: /httpd pathType: Prefix backend: service: name: httpd-service port: name: http ``` 在这个示例中,我们将流量路由到 `example.com/httpd`。 然后创建这个 Ingress: ``` kubectl apply -f httpd-ingress.yaml ``` 这样就完成了 nginx-ingress 代理 httpd 服务的示例配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值