详解K8S入口Ingerss
1 缘起
学习K8S的过程中,先学习使用,了解K8S正常工作需要哪些模块,
然后,学习各个模块,
之前,学习了K8S的Pod、Service,完成K8S内部服务部署和访问,
当需要将服务暴露给外部(K8S之外的机器集群)调用时,需要设计一个路由分发的组件,
匹配不同的Service,Ingerss即完成该工作的模块,官方文档,
本文围绕Ingress展开,
帮助读者了解和学习Ingerss的设计。
回顾知识:Pod和Service的相关文档如下:
详解K8S的Pod
详解K8S网络模型(包含Service讲解)
2 Ingress
2.1 相关术语
序号 | 术语 | 描述 |
---|---|---|
1 | 节点(Node) | Kubernetes集群中的某台工作的机器 |
2 | 集群(Cluster) | 由Kubernetes管理运行容器应用的一组节点 |
3 | 边缘路由器(Edge router) | 强制防火墙策略的集群路由器,可以是由云服务商或者物理机提供的网关 |
4 | 集群网络(Cluster network) | 根据Kubernetes网络模型,一组逻辑或物理链路,帮助集群内通信 |
5 | 服务(Service) | 使用标签选择器识别一组Pod的Kubernetes服务。除非另外说明,否则假定服务只有虚拟IP才能在集群网络中路由 |
2.2 是什么
Ingress是集群中管理外部接入Service的接口(API)对象。
Ingress可提供负载均衡、SSL终端和基于名称虚拟主机等功能。
Ingress将外部集群的HTTP和HTTPS暴露给集群内部的Service,示意图如下图所示,
由图可知,Ingress将集群外部的请求通过路由规则(routing rule)转发给Servcie,
然后由Service匹配到最终的Pod。
Ingress将外部集群的HTTP和HTTPS暴露给集群内部的Service,示意图如下图所示。
Ingress可以通过配置为Service提供可访问的URL,流量负载均衡,终端SSL/TLS以及基于名称的的虚拟主机。
Ingress控制器提供入口功能,通常使用负载均衡器,也可以通过配置边缘路由器或其他前端辅助处理流量。
Ingress不会暴露任何端口或协议。向Internet暴露HTTP和HTTPS以外的服务通常使用service的Type:如NodePort或LoadBalancer。
2.3 配置Ingress
Ingress需要apiVersion、kind、metadata和spec属性。Ingress对象的名称必须是有效的DNS子域名。
Ingress经常使用注解配置Ingress控制器的依赖,如rewrite-target注解。不同的Ingress控制器支持不同的注解。Ingress属性spec拥有配置负载均衡或代理服务的所有信息。最重要地是包含请求的规则匹配列表。Ingress资源仅支持定向的HTTP(s)流量路由。
如果省略ingressClassname,需要定义默认的Ingress类。
Ingress配置最小单元如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: minimal-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: nginx-examplerules:- http:paths:- path: /testpathpathType: Prefixbackend:service:name: testport:number: 80
2.4 Ingress规则
每个HTTP规则包含如下信息:
- 可选主机。当前例子中没有配置host,因此规则适用于通过指定IP地址入站的所有HTTP流量。如果配置host,规则适用于配置的host,如foo.bar.com。
- 路径列表。路径关联后台服务,这些服务通过servcie.name、service.port.name或者service.port.number定义。host和path必须在负载均衡定向流量到Service前匹配请求内容,以分发流量到Service。
- 后台服务是Service和端口名称的组合。HTTP(或HTTPS)请求到Ingress后,会将请求发送到与host和path匹配的后台服务中。
Ingress控制器中通常配置默认的后台来服务没有匹配到path的请求。
2.5 默认后端
没有配置规则的Ingress将所有流量发送到某个默认的后端,.spec.defaultBackend即处理请求的后端。defaultBackend通常是Ingress控制的可选属性,Ingress资源中并未指定。如果没有指定的.spec.rules,则必须指定.spec.defaultBackend。如果没有配置defaultBackend,不符合任何规则的请求的处理由Ingress控制器决定。
Ingress对象中没有host和path与HTTP请求相匹配,流量会被路由到默认后端。
2.6 资源后端
资源后端是对象引用到另一个Kubernetes资源中有相同命名空间的Ingress对象。
资源与服务是互斥的,如果两者同时指定,会导致验证失败。资源后端通用场景是使用静态资产将数据输入到对象存储后端。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-resource-backend
spec:defaultBackend:resource:apiGroup: k8s.example.comkind: StorageBucketname: static-assetsrules:- http:paths:- path: /iconspathType: ImplementationSpecificbackend:resource:apiGroup: k8s.example.comkind: StorageBucketname: icon-assets
- 查看Ingress
kubectl describe ingress ingress-resource-backend
- 结果
Name: ingress-resource-backend
Namespace: default
Address:
Default backend: APIGroup: k8s.example.com, Kind: StorageBucket, Name: static-assets
Rules:Host Path Backends---- ---- --------*/icons APIGroup: k8s.example.com, Kind: StorageBucket, Name: icon-assets
Annotations: <none>
Events: <none>
2.8 路径类型
Ingress中的每个路径需要有对应的路径类型。路径不包括具体的pathType会校验失败。
支持的三种路径类型:
- ImplementationSpecific:该路径类型的匹配取决于IngressClass。实现可将其视为单独的pathType,亦可以等同于Exact或Prefix路径类型。
- Exact:精确匹配URL并且区分大小写(大小写敏感)。
- Prefix:基于以/分割的URL路径前缀匹配。匹配区分大小写,并以路径元素为基础进行。路径元素指由/分隔符分割的路径中的标签列表。
匹配样例:
序号 | 路径类型 | 路径 | 请求路径 | 是否配置 |
---|---|---|---|---|
1 | Prefix | / | 所有路径 | 匹配,即只有一个/分隔符匹配所有路径 |
2 | Prefix | /foo | /foo或/foo/ | 匹配 |
3 | Prefix | /aaa/bb | /aaa/bbb或/aaa/bbxyz | 不匹配 |
4 | Prefix | /aaa/bbb | /aaa/bbb或/aaa/bbb/ | 匹配 |
5 | Prefix | /,/aaa | /aaa/ccc | 匹配,通过/aaa匹配,因为ccc已经使用/分隔了 |
6 | Exact | /foo | /foo | 匹配 |
7 | Exact | /foo | /foo/ | 不匹配 |
8 | Exact | /foo/ | /foo | 不匹配 |
9 | Exact | /foo | /bar | 不匹配 |
10 | Mixed | /foo(Prefix),/foo(Exact) | /foo | 匹配 |
2.9 主机名通配符
主机可以精确匹配(如foo.bar.com)或通配符匹配(如*.foo.com)。精确匹配需要HTTP主机头匹配主机属性。通配符匹配需要HTTP主机头与通配符规则的后缀相同。
匹配样例:
序号 | 主机 | 主机头 | 是否配置 |
---|---|---|---|
*.foo.com | bar.foo.com | 匹配,后缀相同 | |
*.foo.com | baz.bar.foo.com | 不匹配,通配符只覆盖单个DNS标签 | |
*.foo.com | foo.com | 不匹配,通配符只覆盖单个DNS标签 |
配置样例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-wildcard-host
spec:rules:- host: "foo.bar.com"http:paths:- pathType: Prefixpath: "/bar"backend:service:name: service1port:number: 80- host: "*.foo.com"http:paths:- pathType: Prefixpath: "/foo"backend:service:name: service2port:number: 80
2.10 Ingress类
Ingress可以通过不同的控制器实现,配置通常也不相同。
每个Ingress应该指定一个类,引用IngressClass的资源配置包括控制器名称(应该实现的类)。
IngressClass配置样例,
IngressClass的属性.spec.parameters允许引用另一个资源,为IngressClass提供相关的配置。
指定的参数类型的使用依赖于Ingress控制器,即指定的.spec.controller。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: external-lb
spec:controller: example.com/ingress-controllerparameters:apiGroup: k8s.example.comkind: IngressParametersname: external-lb
2.10.1 IngressClass作用域
IngressClass作用域依赖于Ingress控制器,可以使用参数配置为集群范围(cluster-wide)或者只配置一个命名空间。
2.10.1.1 集群(Cluster)
IngressClass参数的默认属性为集群范围(cluster-wide)。
如果配置.spec.paramters属性时没有设置.spec.paramters.scope,或者配置.spec.parameters.scope为Cluster,IngressClass指向集群范围的资源。kind参数指向集群范围的API(组合apiGroup),name参数标识该API的特定集群资源。
配置样例:
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: external-lb-1
spec:controller: example.com/ingress-controllerparameters:# The parameters for this IngressClass are specified in a# ClusterIngressParameter (API group k8s.example.net) named# "external-config-1". This definition tells Kubernetes to# look for a cluster-scoped parameter resource.scope: ClusterapiGroup: k8s.example.netkind: ClusterIngressParametername: external-config-1
2.10.1.2 命名空间(Namespace)
如果配置.spec.paramters属性时,将.spec.parameters.scope设定为Namespace,IngressClass指向命名空间资源。必须设置.spece.parameters的namespace属性来指定需要使用的命名空间。
kind参数(组合apiGroup)指向命名空间API(如ConfigMap),name参数标识指定命名空间的资源。
命名空间参数有助于集群操作员通过用于工作负载的配置代理控制(如负载均衡配置、API网关定义)。
配置样例:
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: external-lb-2
spec:controller: example.com/ingress-controllerparameters:# The parameters for this IngressClass are specified in an# IngressParameter (API group k8s.example.com) named "external-config",# that's in the "external-configuration" namespace.scope: NamespaceapiGroup: k8s.example.comkind: IngressParameternamespace: external-configurationname: external-config
2.10.1.3 默认IngressClass
可以为集群指定一个特定的默认IngressClass。在IngressClass资源中将ingressclass.kubernetes.io/is-default-class注解设置为true,可保证在不指定ingressClassName时使用默认的IngressClass。
2.11 Ingress类型
2.11.1 Ingress由单一服务支持
现存的Kubernetes概念允许暴露单个服务,Ingress可以通过无规则的默认后端实现。
配置样例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: test-ingress
spec:defaultBackend:service:name: testport:number: 80
2.11.2 简单扇出
扇出配置将流量从一个IP地址路由到多个Service,基于HTTP URI请求,
示意图如下图所示。
配置样例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: simple-fanout-example
spec:rules:- host: foo.bar.comhttp:paths:- path: /foopathType: Prefixbackend:service:name: service1port:number: 4200- path: /barpathType: Prefixbackend:service:name: service2port:number: 8080
2.11.3 基于名称的虚拟主机
基于名称的虚拟主机在相同的IP地址支持路由HTTP流量到多个主机名称,
示意图如下图所示。
配置样例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: name-virtual-host-ingress
spec:rules:- host: foo.bar.comhttp:paths:- pathType: Prefixpath: "/"backend:service:name: service1port:number: 80- host: bar.foo.comhttp:paths:- pathType: Prefixpath: "/"backend:service:name: service2port:number: 80
当创建Ingress资源时没有定义主机规则,
可以匹配进入到Ingress控制器IP地址的任何web流量,无需基于名称的虚拟主机。
比如,Ingress将请求first.bar.com的流量路由到service1,second.bar.com路由到service2,
不匹配first.bar.com和second.bar.com的流量路由到service3。
配置样例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: name-virtual-host-ingress-no-third-host
spec:rules:- host: first.bar.comhttp:paths:- pathType: Prefixpath: "/"backend:service:name: service1port:number: 80- host: second.bar.comhttp:paths:- pathType: Prefixpath: "/"backend:service:name: service2port:number: 80- http:paths:- pathType: Prefixpath: "/"backend:service:name: service3port:number: 80
2.12 TLS
通过指定包含TLS私有密钥和认证的Secret加密Ingress。
Ingress资源仅支持单个TLS端口:443,并假定TLS在入口点终止(到服务及Pods的流量为明文)。
Ingress的TLS配置指定不同的主机,通过SNI TLS扩展指定的主机名在同一端口多路复用(前提是Ingress控制器支持SNI)。TLS密钥必须包含的键名:tls.crt和tls.key,用于指定TLS认证和私有密钥。
配置样例如下:
apiVersion: v1
kind: Secret
metadata:name: testsecret-tlsnamespace: default
data:tls.crt: base64 encoded certtls.key: base64 encoded key
type: kubernetes.io/tls
配置密钥后,Ingress需要引用配置的密钥,Ingress配置样例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: tls-example-ingress
spec:tls:- hosts:- https-example.foo.comsecretName: testsecret-tlsrules:- host: https-example.foo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: service1port:number: 80
2.13 负载均衡
Ingress控制器启动时会加载负载均衡策略配置应用到所有Ingress,比如负载均衡算法、后端权重方案等。
高级的负载均衡概念Ingress尚未公开(如持久会话、动态权重)。
2.14 更新Ingress
将新的主机添加到Ingress,可以通过编辑资源更新:
# 查看ingerss
kubectl describe ingress test
Name: test
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:Host Path Backends---- ---- --------foo.bar.com/foo service1:80 (10.8.0.90:80)
Annotations:nginx.ingress.kubernetes.io/rewrite-target: /
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ADD 35s loadbalancer-controller default/test
修改Ingress
# 编辑ingress
kubectl edit ingress test
添加service2
spec:rules:- host: foo.bar.comhttp:paths:- backend:service:name: service1port:number: 80path: /foopathType: Prefix- host: bar.baz.comhttp:paths:- backend:service:name: service2port:number: 80path: /foopathType: Prefix
更新并保存文档,再查看Ingress:
kubectl describe ingress test
完成服务添加,结果如下:
Name: test
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:Host Path Backends---- ---- --------foo.bar.com/foo service1:80 (10.8.0.90:80)bar.baz.com/foo service2:80 (10.8.0.91:80)
Annotations:nginx.ingress.kubernetes.io/rewrite-target: /
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ADD 45s loadbalancer-controller default/test
3 小结
(1)Ingress是集群中管理外部接入Service的接口(API)对象。
(2)Ingress可提供负载均衡、SSL终端和基于名称虚拟主机等功能。
(3)Ingress中的每个路径需要有对应的路径类型。支持的三种路径类型:ImplementationSpecific、Exact和Prefix。
(4)Ingress可路由一个或多个Service,并且可动态更新Service路由关系。通过kubectl edit ingress ingress-name。
详解K8S入口Ingerss相关推荐
- 详解 K8S 高可用部署,超详细
一.前言 二.基础环境部署 1)前期准备(所有节点) 2)安装容器 docker(所有节点) 3)配置 k8s yum 源(所有节点) 4)将 sandbox_image 镜像源设置为阿里云 goog ...
- 直击痛点,详解 K8s 日志采集最佳实践
作者 | 元乙 阿里云存储服务技术专家 导读:上一篇文章主要介绍 Kubernetes 日志输出的一些注意事项,日志输出最终的目的还是做统一的采集和分析.在 Kubernetes 中,日志采集和普通虚 ...
- 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
作者| 阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李响 一.什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台.Kubernetes 这个 ...
- 详解k8s deployment的滚动更新
k8s deployment的滚动更新 一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18 ...
- 详解k8s一个完整的监控方案(Heapster+Grafana+InfluxDB) - kubernetes
每天学习一点点 编程PDF电子书.视频教程免费下载: http://www.shitanlife.com/code 1.浅析整个监控流程 heapster是一个监控计算.存储.网络等集群资源的工具,以 ...
- 深入浅出学K8s - 详解K8s的网络模型
云世 微信公众号:云世 [云世]公众号关注每个想要提升硬实力和软实力上的人,持续不断发布以下话题的相关内容: Ø 云原生系列(容器Docker,K8s,Service Mesh,DevOps,云原生落 ...
- 实验 详解K8S多节点部署群集
目录 一 环境部署 二 实验操作步骤 2.1 master02部署 2.2 nginx负载均衡集群部署 一 环境部署 主机名 IP地址 部署的服务 master01 20.0.0.101 apiser ...
- php7的安装方法,php7 iis安装方法详解(图文)
php7 iis安装方法详解(图文) php7 iis安装方法:首先在官网下载PHP7:然后将其解压到合适的位置:接着找到"php.ini-development"文件,并将其后缀 ...
- 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard
笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...
最新文章
- 0基础培训java必须掌握的一些知识点
- 设置VSCode快捷键Alt+U(首字母转换为大写)、Shift+Alt+U(全部转换为大写)、Shift+Alt+L(全部转换为小写)
- 人工智能 | 自动驾驶与人工智能前沿研究报告(应用篇)
- MySQL8改root密码
- 在 JQuery Mobile 中实现瀑布流图库布局
- tomee_微服务系列:MicroProfile和Apache TomEE
- pr调色预设_视频调色不好掌握?用这2000套PR、AE、达芬奇调色预设吧
- Jenkins的安装配置
- 68 个人脸landmark 点分布图
- 前端-JavaScript1-6——JavaScript之变量类型的转换
- webpack+ES6+Sass搭建多页面应用
- placeholder—Jquery插件placeholder的使用方法
- ExecutorService的shutDown和shutDownNow方法的区别
- java创建包顺序_Java中包含继承关系时对象的创建与销毁顺序详解(附源码)
- JSOUP爬虫常见问题解决方法
- java面试题--算法集锦(建议收藏)
- 计算机系统:系统级I/O
- 噪声、白噪声、高斯噪声、高斯白噪声以及加性和乘性噪声
- 《遥远的救世主》遵守客观规律(一)——对王庙村能做什么分析
- 微信小程序网易云音乐播放界面