3、Ingress实践

3.1、什么是Ingress?

在ingress之前,我们想要访问k8s集群中的pod服务时,是通过部署一个service,将service的type设置为NodePort或者将设置为LoadBalance,这样可以在物理机上开辟出一个物理端口给到对应的service,service再通过dns解析出具体要路由的Pod服务,从而对Pod服务进行服务转发访问。

但是在生产环境,一般是会有几百上千个pod服务,意味着需要有几百上千个service对象,那么多service对象对外提供访问服务,都需要开辟端口,需要面临下面几个问题:

1、这些service该怎么去管理?

2、这么多端口管理,端口的建立需要消耗资源,降低性能。

3、访问困难,这么多service,到底应该访问哪个service?

因此kubernetes提供了Ingress方案,Ingress方案为整个集群提供了统一的入口,相当于微服务中的网关(gateway/nginx),所有的service不再对外提供接口方案,所有的请求都经过ingress进行路由转发。

Ingress可以理解为Service 的Service , 相关于是一个网关入口,通过Ingress统一实现请求的分发,根据定义的路由规则,把请求分发给下游服务。



有了Ingress服务后,只需要对外暴露一个端口即可,其它所有的服务都只需要在内网访问即可。

3.2、Ingress原理

官网的原图:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/



Ingress的作用跟Nginx有点像,但这里之所以不用Nginx,是因为每个Pod服务都是动态生成的,以为Pod服务域名、IP都可能会发生变化,所以没办法直接用Nginx.

而Ingress就像是一个提供动态的nginx。通过将要路由的服务转化成一个规则,通过对一系列的规则进行监听转发。

3.3、Ingress实战

3.3.1、Ingreess安装

可以参考https://github.com/kubernetes/ingress-nginx/tree/nginx-0.30.0



按顺序部署上图中的几个文件服务即可。

再给ingress开辟一个物理端口:

apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30080
protocol: TCP
- name: https
port: 443
targetPort: 443
nodePort: 30443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx

执行:kubectl apply -f ingress-servce.yaml

3.3.2、入门案例

目标:实现ingress转发规则定义,实现从Ingress定义的规则把请求转发到服务。

1)定义一个后端服务:

apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: harbor.hyz.com/library/mynginx:v1
ports:
- containerPort: 80

2)定义Ingress转发规则:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
rules:
- host: ingress.huangyz.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80

通过域名访问:



具体的流转对应流程:



随机进入某一个nginx-ingress-controller服务,查看根据规则动态生成的nginx路由配置:

3.3.3、多个域名(多个服务)

1)部署nginx服务(已部署),部署tomcat服务

apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
ports:
- port: 8080
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: harbor.hyz.com/library/mytomcat:v1
ports:
- containerPort: 8080
  1. 部署Ingress规则
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
rules:
- host: ingress1.huangyz.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
- host: ingress2.huangyz.com
http:
paths:
- path: /
backend:
serviceName: tomcat
servicePort: 8080

访问:http://ingress1.huangyz.com:30080,http://ingress2.huangyz.com:30080:分别访问nginx,tomcat的应用页面。





查看动态生成的配置,多了tomcat一项的路由配置:

3.3.4、一个域名(多个服务)

部署nginx,tomcat服务(已部署)

部署ingress规则:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: default
labels:
app: nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: / # 请求重写,重写定位到跟路径下访问服务
spec:
rules:
- host: ingress.huangyz.com
http:
paths:
- path: /nginx # 请求是/nginx/** 都会被拦截,请求发送给nginx服务
backend:
serviceName: nginx
servicePort: 80
- path: /tomcat
backend:
serviceName: tomcat
servicePort: 8080

注意

path : /nginx 请求必须满足:ingress.huangyz.com/nginx 必须要求后端服务也有与之对应的请求;

@GetMapping(“/nginx”)

Path: / tomcat

@GetMapping(“/tomcat”)

3.3.5、Ingress重定向

我们把nginx的请求重定向到百度首页:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: default
labels:
app: nginx
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: https://www.baidu.com
spec:
rules:
- host: ingress.huangyz.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80

3.3.6、总结

这里只是试验了几种情况,验证了基本都是nginx的功能,只不过实现了nginx的路由规则动态配置化了。感兴趣的童鞋也可以根据上面的几种情况,在自己的环境上进行一个验证。

kubernetes之ingress探索实践的更多相关文章

  1. Kubernetes容器编排探索与实践v1.22.1-上半部分

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  2. vivo 公司 Kubernetes 集群 Ingress 网关实践

    文章转载自:https://mp.weixin.qq.com/s/qPqrJ3un1peeWgG9xO2m-Q 背景 vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经 ...

  3. [5.19 线下活动]Docker Meetup杭州站—拥抱Kubernetes,容器深度实践

    对本次线下活动感兴趣的朋友,欢迎点击此处报名,领取免费票. 今年3月,Docker刚刚过完5岁生日,五年期间,Docker也逐渐在技术和实践方面趋于成熟,更是在去年年底主动拥抱Kubernetes. ...

  4. 干货分享:如何使用Kubernetes的Ingress API

    您可以通过使用诸如Kong for Kubernetes的Ingress控制器(使用自定义资源定义并提供许多插件)来极大地扩展Ingress资源的功能. Kubernetes正在整个技术行业中得到采用 ...

  5. Kubernetes生产环境最佳实践

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 众所周知,Kubernetes很难! 以下是在生产中使用 ...

  6. Openstack+Kubernetes+Docker微服务实践之路--服务发布

    结合上文,我们的服务已经可以正常运行了,但它的访问方式只能通过服务器IP加上端口来访问,如何通过域名的方式来访问到我们服务,本来想使用Kubernetes的Ingress来做,折腾一天感觉比较麻烦,I ...

  7. kubernetes nginx ingress 使用记录

    前言 ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service. ingress controller是来管理所 ...

  8. kubernetes之ingress及ingress controller

    什么是ingress Ingress是授权入站连接到达集群服务的规则集合. 从外部流量调度到nodeprot上的service 从service调度到ingress-controller ingres ...

  9. kubernetes nginx ingress controller部署

    Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...

随机推荐

  1. Java语言学习day06-7月05日

    今日内容介绍流程控制语句之循环语句循环高级###10for循环_1 * A: for循环_1 * a: 使用格式 for(初始化变量 ; 条件 ; 增量){ 循环体; } * b: 各模块解释 初始化 ...

  2. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  3. Vert.X CompositeFuture 用法

    CompositeFuture 是一种特殊的 Future,它可以包装一个 Future 列表,从而让一组异步操作并行执行:然后协调这一组操作的结果,作为 CompositeFuture 的结果.本文 ...

  4. 【深度学习 论文篇 03-2】Pytorch搭建SSD模型踩坑集锦

    论文地址:https://arxiv.org/abs/1512.02325 源码地址:http://github.com/amdegroot/ssd.pytorch 环境1:torch1.9.0+CP ...

  5. [题解] [AGC024F] Simple Subsequence Problem

    题目大意 有一个 01 串集合 \(S\),其中每个串的长度都不超过 \(N\),你要求出 \(S\) 中至少是 \(K\) 个串的子序列的最长串,如果有多解,输出字典序最小的那组解. 由于 \(S\ ...

  6. vue - Vue组件化编程

    今天是对vue组件化的一个理解,最主要的单文件组件,然后就可以脚手架的学习了,本来昨晚就该上传的,但是用的那个上传博客园的Python脚本不行了,换了一个新的. 组件化让我越来越感觉到框架的力量了 一 ...

  7. 评价管理后台PC端

    1.css动画效果    --2020.12.26 2.remove() --2020.12.28 3.执行顺序 --2020.12.30 4.联动 --2021.01.06 5.奥利给~ --202 ...

  8. 在vue-cli中安装scss,且可以全局引入scss的步骤

    简历魔板__个人简历模板在线生成 在写vue的css样式时,觉得需要css预处理器让自己的css更加简洁.适应性更强.可读性更佳,更易于代码的维护,于是在vue-cli脚手架采用scss.写过的人都知 ...

  9. 使用用户名密码或ssl证书获取zabbix-api token,批量操作管理zabbix-server

    概述 Zabbix API 允许你以编程方式检索和修改 Zabbix 的配置,并提供对历史数据的访问.它广泛用于: 创建新的应用程序以使用Zabbix: 将Zabbix与第三方软件集成: 自动执行常规 ...

  10. 使用python脚本+zabbix前端监控云联网底层TCP数据流所负载的链路质量,并在丢包时联动保存MTR记录

    背景 目前国内各家云联网跨区域数据传输,会将数据流通过哈希运算负载到不同的底层链路上,而底层链路质量差异较大,这种情况导致的现象就是,使用传统的icmp监控线路正常,但是业务一直不稳定,所以才有了使用 ...