k8s ingress概念和实践

news2024/11/25 14:17:31

什么是Ingress

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP/HTTPS

该特性从1.19版本开始作为stable状态进行发布

Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

如下图将所有流量都发送到同一 Service 的简单 Ingress 示例:
Ingress示意图

Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort或 Service.Type=LoadBalancer类型的 Service或者直接共享主机网络。

Ingress控制器

为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,与作为 kube-controller-manager 可执行文件的一部分运行的其他类型的控制器不同, Ingress 控制器不是随集群自动启动的。Kubernetes官方目前支持和维护 AWS、 GCE 和 Nginx Ingress 控制器。

应用场景

金丝雀发布:是一种基于流量比例的发布策略,部署一个或者一小批新版本的服务,将少量(比如1%)的请求引流到新版本,逐步调大流量比重,直到所有用户流量都被切换新版本为止。由于这种模式不是非黑即白,所以又称为灰度发布。

那么这里就有一个问题,就是如何把生产流量进行一个转发?

通常呢,开发者会在接口请求的流量上做一个标记,如某些主机接收到应用流量后,对Header进行一个新增标记,来说明这个流量是用于新版本处理的。当这个流量进入k8s集群时,那么会被ingress定义的规则进行处理,将流量转发到新版本的业务的service,再由service转发到pod上面去。

金丝雀(灰度)发布实践

环境准备

nginx-controller安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml

启用deployment中的ingress-nginx-controller的容器为共享主机网络,即设置hostNetwork为true

deployments.spec.template.spec.hostNetwork 

查看nginx-controller所在的主机

$ kubectl get pod -n ingress-nginx -o wide
NAME                                        READY   STATUS      RESTARTS   AGE     IP              NODE               NOMINATED NODE   READINESS GATES
ingress-nginx-admission-create-s4wn5        0/1     Completed   0          3d14h   10.244.1.104    k8s-node1-ubantu   <none>           <none>
ingress-nginx-admission-patch-v5vh6         0/1     Completed   1          3d14h   10.244.1.105    k8s-node1-ubantu   <none>           <none>
ingress-nginx-controller-54cdc69c44-5tr2m   1/1     Running     0          2d14h   192.168.31.42   k8s-node2-ubantu   <none>           <none>
创建测试工作空间

为了方便演示和测试,避免干扰其他命名空间的资源,我们创建一个ingress-test的命名空间来进行测试,并且切换kubectl config的默认操作命名空间

kubectl create ns ingress-test
kubectl config set-context --current --namespace=ingress-test

实践步骤

  1. 创建两个应用,模拟新老应用版本

    kubectl create deployment old-app --image=nginx:1.19.0
    kubectl create deployment new-app --image=nginx
    

    通过pod network来验证两个app的访问

    kubectl get pods -o wide
    
    NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
    new-app-69d99d595-vq7lf    1/1     Running   0          54s   10.244.2.72   k8s-node2-ubantu   <none>           <none>
    old-app-788c89d6c7-q2qnp   1/1     Running   0          61s   10.244.2.71   k8s-node2-ubantu   <none>           <none>
    $ curl 10.244.2.71/version
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.19.0</center>
    </body>
    </html>
    $ curl 10.244.2.72/version
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.23.3</center>
    </body>
    </html>
    

    可以看到两个新老应用的nginx版本是不一致的,新版本为1.23.3,而老的版本为1.19.0

  2. 创建两个service,来访问新老应用

    kubectl expose deployment old-app --port=80 --target-port=80
    kubectl expose deployment new-app --port=80 --target-port=80
    

    通过service网路来验证两个app的访问

    kubectl get svc -o wide
    
    $ kubectl get svc -o wide
    NAME      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    new-app   ClusterIP   10.99.150.77   <none>        80/TCP    70s   app=new-app
    old-app   ClusterIP   10.96.98.15    <none>        80/TCP    79s   app=old-app
    $ curl 10.96.98.15/version
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.19.0</center>
    </body>
    </html>
    $ curl 10.99.150.77/version
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.23.3</center>
    </body>
    </html>
    
  3. 创建ingress,设定流量转发规则

    kubectl create ingress old-app --rule=k8s-node2-ubantu/*=old-app:80 --class=nginx
    kubectl create ingress new-app --rule=k8s-node2-ubantu/*=new-app:80 --annotation=nginx.ingress.kubernetes.io/canary="true" --annotation=nginx.ingress.kubernetes.io/canary-by-header="app" --annotation=nginx.ingress.kubernetes.io/canary-by-header-value="new" --class=nginx
    
  4. 验证访问

    正常流量访问

    $ curl  http://k8s-node2-ubantu/version
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.19.0</center>
    </body>
    </html>
    

    新版本流量访问,即在http请求头加入app=new,那么这部分的流量就会到new-app的应用上进行处理

    $ curl -H 'app:new'  http://k8s-node2-ubantu/version
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.23.3</center>
    </body>
    </html>
    

    nginx-controller原理

    nginx-controller通过监听k8s集群ingress对象的创建/修改情况,同步更新内部的nginx的配置文件,来达到负载均衡/虚拟主机的能力,我们可以通过查看ingress-nginx-controller的容器日志来诊断流量分发的相关问题

    kubectl logs -n ingress-nginx ingress-nginx-controller-54cdc69c44-5tr2m
    

    日志示例

    I0115 04:06:37.459568       6 admission.go:149] processed ingress via admission controller {testedIngressLength:4 testedIngressTime:0.023s renderingIngressLength:4 renderingIngressTime:0s admissionTime:40.9kBs testedConfigurationSize:0.023}
    I0115 04:06:37.459591       6 main.go:100] "successfully validated configuration, accepting" ingress="ingress-test/old-app"
    I0115 04:06:37.462976       6 store.go:430] "Found valid IngressClass" ingress="ingress-test/old-app" ingressclass="nginx"
    I0115 04:06:37.463137       6 event.go:285] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"ingress-test", Name:"old-app", UID:"1a3a9c15-a7a9-4914-b4ac-d0821486df11", APIVersion:"networking.k8s.io/v1", ResourceVersion:"1935618", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync
    I0115 04:06:37.463244       6 controller.go:168] "Configuration changes detected, backend reload required"
    I0115 04:06:37.512904       6 controller.go:185] "Backend successfully reloaded"
    

    查看nginx-controller的nginx配置文件

    kubectl exec  -n ingress-nginx ingress-nginx-controller-54cdc69c44-5tr2m -- cat nginx.conf
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python算法:三种简单排序的方法

目录 前言 1、插入排序 实例 2、选择排序 实例 3、冒泡排序 实例 前言 声明&#xff1a;本文所有动图来源为菜鸟教程 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红…

监督学习、半监督学习、无监督学习、自监督学习、强化学习和对比学习

目录 一、监督学习 二、半监督学习 三、无监督学习 3.1.聚类算法 3.2.降维算法 3.3.异常检测 3.4.自动编码器 3.5.生成模型 3.6.关联规则学习 3.7.自组织映射(SOM) 四、自监督学习 4.1. 基于上下文&#xff08;Context based&#xff09; 4.2. 基于时序&#xff08…

85.【Vue-细刷-01】

Vue(一)、利用Vscode开发Vue1.在桌面创建文件夹code2.使用Vscode进行打开这个文件夹3.在Vscode的右键创建文件夹4.右键创建.html文件(二)、第一个Vue程序1.下载并引入Vue.js2.引入vue.js3.创建视图层4.创建Model层5.获取Vue实列中的数据6.效果展示⭐为什么要使用new 关键字来创…

文件操作(二):学习笔记10

目录 一.概念梳理 1.文件的分类 2.程序运行时&#xff0c;内存和外存数据交流的过程 二.文件缓冲区 三.常用的文件读写函数笔记 1.常用格式化文件读写函数 (1)格式化文件写入函数 用fprintf进行文件写入操作&#xff1a; (2)格式化文件读取函数 用fscanf进行文件读取 2…

Java枚举类与注解

目录 一、枚举类的使用 枚举类的实现 枚举类的属性 自定义枚举类 步骤 举例 使用enum定义枚举类 使用说明 举例 Enum类的主要方法 实现接口的枚举类 二、注解的使用 概述 常见的Annotation示例 自定义Annotation&#xff08;参照SupressWarnings 定义&#xff09…

一不小心,登上支付宝开发者社区热文榜单Top3

大家好&#xff0c;我是小悟 那天中午要午休的时候&#xff0c;看到微信通讯录新朋友有个红色1&#xff0c;像俺这种有强迫症的&#xff0c;那不得去把它点掉。打开一看&#xff0c;加好友的备注是“我是熊二&#xff0c;支付宝开发者社区运营”。 收到支付宝社区的运营添加微…

【ROS】dynamic_reconfigure配置详细说明

文章目录 文章目录 前言 一、编写.cfg文件 二、为节点配置dynamic_reconfigure 总结 前言 dynamic_reconfigure配置是ROS中为了方便用户对程序中的参数进行实时调整而推出的工具&#xff0c;配置好自己的dynamic_reconfigure文件后&#xff0c;可以很方便的使用ROS提供的r…

2022-12-18 网工进阶(三十八)MPLS LDP---LDP基础、工作原理(会话、标签的发布和管理、特性)、配置举例

LDP概述 LDP是MPLS的一种控制协议&#xff0c;相当于传统网络中的信令协议&#xff0c;负责FEC的分类、标签的分配以及LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程。 LDP的工作过程主要分为两部分&#xff1a;LSR之间建立LDP会话&#xff1b;…

一种小型项目的超时机制方案

设计背景 在小型项目中&#xff0c;状态机的跳转往往依赖于某个事件的状态&#xff0c;因此监控某个事件是否处于超时状态就至关重要&#xff1b; 注意事项 超时机制应该能够准确的判断出事件是否真正超时&#xff0c;并预留出设置自定义超时处理的接口&#xff1b;超时机制…

什么是大数?大数有什么用?如何使用大数?

0 什么是大数 如果基本的整数和浮点数精度不能够满足需求&#xff0c;那么可以使用 javamath 包中两个很有用的类:BigInteger和 BiDecimal。 这两个类可以处理包含任意长度数字序列的数值。 BigInteger类实现任意精度的整数运算&#xff0c;BigDecimal实现任意精度的浮点数运算…

Android | Fragment

Android Fragment Fragment 概念 Fragment 表示应用界面中可重复的一部分&#xff0c;Fragment 定义和管理自己的布局&#xff0c;具有自己的生命周期&#xff0c;并且可以处理自己的输入事件。fragment 不能独立存在&#xff0c;而是必须由 Activity 或另一个 fragment 托管…

麦克纳姆轮(麦轮)原理

一、麦轮原理 麦克纳姆轮&#xff1a;简称麦轮&#xff0c;由轮毂和围绕轮毂的辊子组成。 辊子&#xff1a;没有动力的从动小滚轮。 麦克纳姆轮辊子轴线和轮毂轴线夹角是45度。 A轮&#xff08;左旋&#xff09;与B轮&#xff08;右旋&#xff09;互为镜像关系 麦轮在车上的…

Go语言开发小技巧易错点100例(五)

往期回顾&#xff1a; Go语言开发小技巧&易错点100例&#xff08;一&#xff09;Go语言开发小技巧&易错点100例&#xff08;二&#xff09;Go语言开发小技巧&易错点100例&#xff08;三&#xff09;Go语言开发小技巧&易错点100例&#xff08;四&#xff09; …

打工人必学的法律知识(五)——《女职工劳动保护特别规定》

女职工劳动保护特别规定https://flk.npc.gov.cn/detail2.html?ZmY4MDgwODE2ZjNjYmIzYzAxNmY0MTBmMWVkNTE0NTE &#xff08;2012年4月18日国务院第200次常务会议通过 2012年4月28日中华人民共和国国务院令第619号公布 自公布之日起施行&#xff09;第一条 为了减少和解决女职工…

如何减少频繁创建数据库连接的性能损耗?

为极速开发出一套某垂直领域电商系统&#xff0c;采用最简架构&#xff1a; 前端一台Web服务器运行业务代码后端一台DB服务器存储业务数据 大多系统初生时就是这样&#xff0c;只是随业务不但发展变得复杂&#xff0c;架构迭代。系统上线后&#xff0c;虽用户量不大&#xf…

第十三届蓝桥杯大赛软件类决赛Java大学B组C题——左移右移

【问题描述】 小蓝有一个长度为 N 的数组&#xff0c;初始时从左到右依次是 1, 2, 3, . . . N。 之后小蓝对这个数组进行了 M 次操作&#xff0c;每次操作可能是以下 2 种之一&#xff1a; 左移 x&#xff0c;即把 x 移动到最左边。右移 x&#xff0c;即把 x 移动到最右边。 …

数字信号处理音频FIR去噪滤波器(基于MATLAB GUI的开发完整代码+报告+课设)

1、内容简介利用MATLAB GUI设计平台&#xff0c;用窗函数法设计FIR数字滤波器&#xff0c;对所给出的含有噪声的声音信号进行数字滤波处理&#xff0c;得到降噪的声音信号&#xff0c;进行时域频域分析&#xff0c;同时分析不同窗函数的效果。将文件解压至一个目录下&#xff0…

ithewei的2022年度总结

窗外的雨&#xff0c;顺着晒衣架汇聚成豆大的珠&#xff0c;落到一楼庭院顶棚上&#xff0c;嘀嗒不停&#xff1b; 路上的车&#xff0c;由远及近&#xff0c;又由近及远&#xff0c;疾驰而过&#xff1b; 床边的猫&#xff0c;也已入睡&#xff0c;时不时发出一两声细微的鼾声…

面试问:@Resource 和@Autowired 的区别是什么?该怎么回答

Resource 和 Autowired 这两个注解的作用都是Spring生态里面去实现 Bean 的依赖注入 Autowired注解的作用 Autowired是Spring里面提供的一个注解&#xff0c;它默认是根据类型来实现Bean的依赖注入。 Autowired注解里面有一个required属性&#xff0c;它的默认值是true&#…

人大金仓数据库安装篇

图形化安装 规划安装路径与修改目录属主 先用root账户挂载金仓镜像包 mount -o loop /install/KingbaseES_V008R006C005B0023_Lin64_single_install.iso /mnt 切换kingbase用户来安装金仓数据库 进入挂载目录/mnt执行./setup.sh 将金仓注册为系统服务 /KingbaseES/V8/Scrip…