图解 Kubernetes Ingress

图解 Kubernetes Ingress

TL; DR

Kubernetes Ingress不是Kubernetes服务。 非常简化的只是一个Nginx Pod,它将请求重定向到其他内部(ClusterI( P k F % A A ! KP)服务。 该Pod本身可以@ : x通过Kubernetes服务(通常是LoadBalancer)来访问。

你甚至应该g * G 3 K # c 读这个吗?

首先,我希望我能给您一个清晰而简单的概述,X I 7 ! r T r了解这个神秘的Kubernetes Ingress的背后,然后使您更容易了解您实际正在实施的内容或什至应该这样做。

稍后,我将基于@ = B [ P v } O本文中使用的示例展示一些示例配置。

为什么要使用Ingress?

您可以使用它来从群集/ B $ r u外部访问内部服务。 它省去了= a f L 0 2宝贵的静态IP,因为您无需声明多个LoadBalancer服务。 而且,如我们所见,K r D w S * S它还允许进行更多的配置和更容易的设置。

我们在这里做什么?

首先,我们对HTTP服/ Y v K 9务器(尤其是Nginx)如何工作以及它们可以做什么进行了非常简短的考察。

然后,我们将说明如何手动设置Ingress,从而完全不用花哨的Kubernetes Ingress资源。

接下来,我们将看到Kubernetes Ingress只是预配置的Nginx服务@ u = ! 9 J器。

听起来令人困惑? 只要在这里跟: = c A ) + k O ~随我。

简要了解简单HTTP服务器的世界

在这里,我们回到容器,Kubernetes和现代云M # 3 ! 6 I世界之前的时代。 和我在一起,时间会很短。

(Nginx)HTTP服务器可以做什么?

它可以通过HTTs V HP协议接收特定文件路径的请求,检查附加文件系统上的文件路径v k n T e | },如果该文件存在,则将其返回:

图解 Kubernetes Ingress

在Nginx中,例如可以通过以下方式完成此操作:

location /folder {
root /var/www/;
index index.html;
}

(Nginx)HTTP服务器还能做什么?

它可以接收对特定文件路径的请求,将该请求重定向到另一个服务器(这意味着它充) J E l } I 1 ^ k当代理),然后将该服务器的响应重定C s R 9 t ^ F : `向回客户端。 对于客户端,没有任W - # l 6 (何变化,接收到的结果仍然是请求的文件(如果存在)。

图解 Kubernetes Ingress

我们不会深入探讨这个问题,但是在Nginx中,例如可以将代理重定向配置为:

location /folder {
proxy_pass http://second-nginx-server:8000;
}

这意味着Nginx可以充当代理来提供文件系统中的文件或将响应重定向到其他服务器并返回其响应。

一个简单的Kubernetes示例:

使用ClusterI8 Q & f # tP服务

同样,从这一点开始,您应该了解Kubernetes Services。 我们有两个工作程} ! O 5 v Y ( M &序节点,这里我们忽略主节点。 我们有两个服务service-nginx和serviW h k 5 S 9 p xce-python,它们指向各种容器。

服务不是在任何特定的节点上调度的,只能说它们\"在群集中的任何地方都可用\0 j $"# L b

图解 Kubernetes Ingress

您应该了解这里发生了什么。 在我们集群的内部,Y u F x我们可以通过它们的服Q 4 - E务访问Nginx pod和Python: s o pod。 接下来,我们还U % } # ` { A M要从集群k : A - w外部提供这些资源。 因此,我们将它们转换为Loap j Q 3 ^ rdBalanceC ~ F . Sr服务:

使用LoadBalancer服务

您可以看到我们将ClusterIP服务转换为LoadBalancer服务。 因为我们的Kubernetes集群托管有可以e p 3 l 9 g X c t处理此问题的云提供商(Gcloud,AWS,DigitalOcean…),所以d = h它创建了两个外部负载均衡器,可将请求重定向到我们的外部节点IP,然后将其重[ G x S X w L D R定向到内部ClusterIP服务。

图解 Kubernetes Ingress

我们看到两个LoadBalancers,每个都有自己的IP。 如果我们向LoadBalj p = Mancer 22.33.44.55发送请求,它将被重定向到内部服务nginx。 如果我们将请求发送到77.6c X C R , ] 3 R6.55.44,它将被重定向B y R p . v P Y到我们的内部service-python。

这很棒! 但是IP地址很少,LoadBalancer的定价取决于云提供商。 现_ U b d g } %在想象一下,我们想要创建LoaU c w : Z _ f ` _dBalancers的不仅仅是内部服务,还有更多内部服务,成本将会增加。

可能会有另一种解决方案,使我们仅使用一个LoadBalancer(具有一个IP),但仍可以直接访问我W O , 8 L `们的两? + R u y h h个内部服务吗? 首先,我们通过实施手动(非Kubx m K g w ,ern^ s y m L s getg & 7 Xes)方法来对此进行探讨。

手动将Nginx服务配置为代理

如前所述,Nginx可以充当代理。 在下图中,我们看到j p K e B l T j w一个名为service-nginx-proxy的新服务,它实际上是我们唯一的LoadBalaU 3 $ * R D | jncer服务。 service-nginx-proxy仍将指向一个或多个NginO 8 i rx-pod端点,但为简单起见,我未在图形中包括该端点。 之前的其他两项服务将转换回简单的ClusterIP服务:

图解 Kubernetes Ingress

我们可以看到,我们只打了一个LoadBalancer(11.22.33.4G E j B u # f4),但是使用了不同的http URL,这些请求以黄色显示为相同的目标,并且只包含不同的内容(请求URL)。

服务service-1 D ! u fnginx-proxy根据所传递的URL决定(通过使用Nginx* J h代理传递和位置),他应将请求重定向到哪个服务。

在这种情况下,我们有两个选择,红色和蓝色。 红色重定向到service-nginx,蓝色重定向到service-python。

# very simplified Nginx config example
location /folder {
proxy_a Q y t U [ spass http://service-nginx:3001;
}
location /other {
proxy_pass http://service-python:3S } g a O a002;
}

当前,我们需要手动配置service-nginx-proxy。 就像创建指向我们的ClusterIP服务的正确的Nginx配置文件一样。 这是一个可能的,可行的且通用的解决方案。

并且由于这是/是& E ~ ` u h 5 E a常见的解决方案,因此创建了Kubernetes Ingress以R b h | o p 6 F使配置更容易且更易于管理。

从这一点开始,a y ] V = . ` + !您应该了解图像中显示的上述示例的优势。 如果您不愿意,请随时在下面添加评论以进行讨论。

在我们的示例中使用Kubernetes Ingress

将以下图像与上一张图像进行比较。 真的没多大变化。 我们只是使用了预先配置的Nginx(Kubernetes Ingra ? I f 4 , = = 7ess),它已经为我们完成了所有代理重定向,从而节省了很多手动配置工作:

图解 Kubernetes Ingress

这就是了解Kubernetes In0 n y - b & E Ygress是什么的全部。 现在,让我们转到一些示例配置。

安装Kubernetes入口控制器

Kubernete| 3 N n n z , Ss Ingress是额外的Kubernetes资源,可以通过以下方式安装:

kuS j , T f obectlr K O apply -f https://raw.githubusercontent.com/kubernetey O ~ 6 0s/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml
kubectl apply -f https://raw.githubuserconf h %tent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/cloud-generic.yaml

使用以下命令,您将看到k8s资源已安装在名称空间ingress-nginx中:

kL 2 A o r #ubectl get svc,pod --namespace=ing! i x = t . / 8ress-nginx

图解 Kubernetes Ingress

您会看到带有外部IP和附属Pod的常规LoadBalancer服务。 您甚至@ [ }可以将kubectl exec放入该C ^ B 3 q z cpod中,以查看其中包含预先配置的Nginx服务器:

图解 Kubernetes Ingress

在nginx.conf中,您X $ 5 p e { O会看到各种代理重定向设置和其他相关配置。

示例Kubernc y k M setes入口配置

我们一直在使用的示例Ingress yaml可能如下所示:

# just example, not tested
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadaj 7 Q N l | kta:
annotations:
kc h 3 + 5 U B =ubernete+ $ c * P X )s.io/ingress.class: nginx
namespace: default
name: test-iF ? W [ngress
spec:
rules:
- htU ) v ? X & M tp:
paths:
- path: /folder
backend:
serviceName: 6 X j service-nginx
se. c S DrvicePort: 3G # u * $ v {001
- http:
paths:
- path: /other
backend:
serviceName: service-python
servicePort: 3002

我们需要像通过kubectl create -f ingress.yaml来创建y ] x s _ 0 4其他任何资源一样的yaml。 然后,该yaml将由先前安装的Ingress Controller转换为Nginx配置。

示例Kubernetes入口/不同的命名空间

现在,: : & e .如果Ingress应该重定向到的内部服务之一在另一个名称空间_ , c中怎么办? 因为您定义的入口资源是命名空间。 在Ingress配置中,您只能重定向到相同名称空间中的服务。

如果定义了多个Ingress yaml配置,则这些配置将由一个Iw ` * ^ &ngress Controller合并到一个Nginx配置中。 含义:所有人也都使用相同的LoadBalancer IP。

因此4 v } f b u s [,我们考虑将serviceI p 6 6 K 1 P &-nginx设置为默认名称空间:

# jus` T T A o Ht example, not tested
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotatib X V g h } Aons:
kubernetes.io/ingress.class: nginx
namespace: default
name: ingress1
spec:
rules:
- http:
paths:
- path: /folder
backend:| ] 9 Q G ` S
serviceName: service-nginx
servicePo? K y T w @ 3 mrt: 3001

然后service-python_ 8 O ,在命名空间namespace2中:

# just example, not% B  c $ | L & B test{ 2 y Q r ^ Oed
apiVersio/ = # A # 2 q %n: netwo{ K 3 t k + Prking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.clas& y w ws: nginx
na x J F Xmespace: namespace2
name: ingress2
spec:
rules:
- http:
paths:
- path: /other
backend:
serviceName: se| 0 ` ^ m ` .rvice-python
servicePort: 3002

因此,我们创建了两个Ingress yaml资源。

如何微调Ingress Nginx配置$ 1 : N (

您可以通过Inhgre ~ A Ness Kubernetes资源上的注释来做到这一点。 例如,您可以q _ X W N T . v w配置通常可以直接在Nginx中配置的各种选项:

kind: In_ q i ! & zgress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-connect-timeout: \'30\'
nginx.ingress.kubernetes.io/proxy-send-timeout: \'500\'
nginx.ingress.kubernetes.io/proxy-read-timeout: \'500\'
nginx.ingress.kubernetes.io/send-tim[ O i . : ; r I leout: \"500\"
nginx.ingress.kubernetes.io/enable-cors: \D = u g L w"true\"
nginx.ingress.kubernetes.io/cors-allow-methods: \"*\"
nginx.ingress.kubernetes.io/cors-a) $ ! w & i 7llow-origin: \"*\"
...

您甚至可以执行非常具体的规则,例如:

n{ j e ; 5 j a 1 2ginX & * L , ) l yx.ingress.kubernetes.io/configuration-sniV D ] S = kppet: |
if ($host = \'www.wuestkamp.com\' ) {W ? 7 i q Y b %
rewrite ^ https://wuestkamp.com$request_uri permanent;
}

使用www是如此的\"2008I $ i w ? + 3\"!

然后,这些注释将转换为Nginx配置。 您始终可以通过手动将(kubectl exec)连接到入口Nginx Pod并查看配置来+ f 5 l * r b ( _进行检查。

有各种配置示例:

https://github.com/kuberD / z 0 { +netes/ingress-nginx/tree $ C _ 7/master/docs/user-guide/nginx-configuration

https://github3 # T g U.com/kubernetes/ingr: T m t I P Cess-nginx/blob/master/docs/uB f % a Q k 1ser-gui1 F h X t qde/nginx-configuration_ a d ! } g/annotations.md#lua-resty-waf

检查入口/ Nginx日U d y ( b ! I }

找出问题或错误,查看Ingress日志也很有帮助:

kubectl logs -n ingress-nginx ingrb F t h y } | . [ess-nginx-controller-6cfd5b6544-k2r4n

图解 Kubernetes Ingress

使用CurU U A Xl测试设置

如果您想k 9 l U测试您9 g ! :的Ingress / Nginx重定向规则,则最好使用curl -v yourhost.com而不是浏览器以避免缓存等。

重定向方式/入口规则

在本文的示例中,我们使用了/ folder或/ other / d` ! N w x f D airectory之类的路径来重定向到其他服务。 这称为\"路径列表\"。

还可以通过主机名来区分请求,例如将api.myurl.com和websit# m 8 Qe.myurl.com重定向到其他内部ClusterIP服务。 可能看起来像这样:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fa* ~ ! * C Vnout-example
spec:
rules:
- host: api.myu= - U X N B $ F Drl.com
http:
paths:
- path: /foo
backend:
servib J + c 0 ` [ 0 ZceName: service1D 2 P k W p i ?
servicePort: 4200
- path: /bar
backend:
serviceName: service2
servicePort: 8080
- host: website.myurl.com
http:
paths:
- path: /
backend:
serviceName: service3
servicePort: 3333u V f n O $ p

在此示例中,我们看到对于特定的主机名,我们将不同的http路径重定向到不同的内部服务。

SSL / HTTPS* @ d

SSL。你听说过N c Y n c吗? :)您可能希望通过安全的httpsS 0 D访问您的网站。 Kubernetes Ingress提供了非常简单的: 1 X : 5 `“ TLS终止”,这意味着它可以处理$ w y i所有SSL通信,解密/终止SSL请求,然后将解密后的请求发送到您的内部服务。

如果您的多个内部服务使用的是相同的SSL证书(甚至是通配符),那么这很好,因为这样一来,, 7 w E 6 7 ^ M您只需在Ings @ U 5 K fress上配置一次即可,而不必在所有其他内部3 ! 1服务上进行配置。 入口可以使用已配置的TLS Kub` L 2 % @ X = C bernetes Secret中的SSL证书。

apiVersion: networking } , $ %.k8s.io/v1beta1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- sslexample.foo.com
secretName{ ] _ p y l j $: testsecret- [ F Htls
rules:
- host: sslexample.foo.com
http:
paths:
- pat) P B x C eh: /
backend:9 ` n : L q T G
serviceName:7 Q d U } j w P service1
servicePort: 80

您只需要确保如果您在不同的命名空间中具有多个Ingreso t f p M vs资源,则您的TLS密钥也必须在您使用它定义了Ingress资源的所有命名空间中都可用。

概括

我只是想为您提供+ . ) +有关神秘的Kubernetes Ingress背后的内容的广泛概述。 简化:无非就是一种K 3 J U z Z , 3轻松配置Nginx服务器的方法,该服务器会将请求重定向到其他内部服务。

这为您节省了宝贵的静态IP和LoadBalancers。 但是,不应将Kubernetes Ingress视为Kubernetes服务之一。 I n angress本身不是Kubernetes服务,但通常使用一个,主要是LoadBalancer。

请注意,还有其他Kubernetes F ] -s Ingress类型并未在内部设置Nginx服务,但可能会使用其h 9 : j [ K D B他代理技术。u O t 2 i t x :

(本文翻译自Kim Wuestka[ # q | Mmp的文章《Kubernetes Ingress simply visually explained》,参考:https://codebuZ $ ! { ` grst.io/kubernetes-ingress-simply-visually-explained-d9cad44J q b A z ) k . ie4419)

下一篇

谢军:整治APP乱象需要全社会合猎

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部