【k8s学习】Kubernetes Ingress介绍

【本文内容】

  • 什么是Ingress
  • Ingress的yaml配置
  • Ingress的use case(什么情况下需要用到Ingress)
  • Ingress Controller的介绍
  • Demo - 通过Ingress暴露kubernetes dashboard
  • tls相关(https)

【前置文章】

1. External Service vs. Ingress

External Service

假设我们的Kubernetes集群中有my-app pod,以及my-app external service,意味着我们可以从外部以NodeIP + Port的形式访问my-app项目,如http://124.89.11.11:35010 --> 这就是external service能达到的效果。这时候my-app service的yaml中的配置,则需要配成:spec.type = LoadBalancer,并且需要配置spec.ports.nodePord = 35010,表明需要对集群外暴露这个Service,以下是定义external service的示例:

image.png

Ingress

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

但如果我们想要用https://my-app.com来访问my-app项目,那么就需要用到Ingress组件了。即会先创建一个my-app ingress --> 然后转发到my-app internal service --> 再转发到my-app pod,可以看到有了Ingress组件后,Service组件不再需要external了(即上述的type可以删掉,不填默认是ClusterIP,即internal service了,不对外暴露,nodePort也可以删除)。

2. Ingress yaml配置文件

简单的Ingress yaml示例:

注,这里的apiVersion有更新,之前的版本是apiVersion: extensions/v1beta1,最新的版本是下述的v1,两者的语法有些许差别,比如v1beta1中是serviceName,servicePort,而在v1(下述)中则是service.name和service.port.number

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - host: dashboard.info.abc
    http:
      paths:
        - path: "/"
          pathType: Prefix
          backend:
            service:
              name: myapp-internal-service
              port:
                number: 8080
  • apiVersionkind,前两行是声明,其中kind表示当前需要创建的是Ingress资源。
  • spec中的rules:表示Routing rules,路由规则。表示这个从host来的请求,需要被转发到serviceName中,即request from myapp.com --> 转发到myapp-internal-service
  • 其中的paths表示可以按url的后缀进行匹配,下文有具体的例子解释。
  • 【和internal service的对应】,Ingress中的serviceName对应的是service yaml中的metadata.name,Ingress中的servicePort对应的是service yaml中的spec.ports.port。

3. Ingress Controller

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

3.1 Ingress Controller介绍

除了安装Ingress组件之外,我们还需要一个Ingress的实现(Implementation),这个实现就是Ingress Controller,Ingress Controller也是运行在Pod中的,即我们可以创建一个Pod,叫Ingress Controller Pod。

Ingress Controller是干什么的?它是用来解析上述Ingress yaml中的rules规则的,即需要怎样的跳转。(如一级域名,二级域名等等,诸如此类的跳转规则的实现)。

目前有很多第三方的实现,如:

3.2 现实中的Ingress Controller架构

如果用的是一些云服务器,例如aws, google提供的Kubernetes,那么请求会先到达这些云服务商的负载均衡器上,即Cloud Load Balancer --> 再跳转到我们在Kubernetes集群内定义的Ingress Controller Pod上 --> 然后再是my-app ingress --> my-app internal service --> my-app pod

相当于云服务商会帮我们做掉负载均衡的部分。

如果我们的Kubernetes集群运行在自己的服务器上(没有依赖aws这些云服务商提供服务),那么在Ingress Controller之前,可能需要一台Proxy Server,用来做转发(负载均衡)。

3.3 在Minikube上安装Ingress Controller

在minikube上可以通过以下命令,minikube会自动帮我们安装Kubernetes Nginx Ingress Controller,安装的时候可能需要一些时间:

�minikube addons enable ingress

我minikube启动的时候vm-driver用的是hyperkit,然后遇到如下问题:
image.png

于是我换成docker作为vm-driver,先用命令minikube delete --all删除下minikube,然后再run:minikube start --vm-driver=docker
再安装ingress,就没有问题了:

image.png

通过查看namespace=kube-system下的pod,可以看到名为nginx-ingress-controller的相关的已经running了:

kubectl get all -n ingress-nginx

image.png
3.4 示例:给kubernetes-dashboard配置Ingress

在minikube上安装好基于Kubernetes Nginx的Ingress Controller后,我们试着给kubenetes-dashboard配置Ingress,以便以hostName的方式暴露给集群外部使用。
首先运行minikube dashboard:

minikube dashboard

image.png

首先查看kubernetes dashboard的所有配置(在namespace为kubernetes-dashboard下):

kubectl get all -n kubernetes-dashboard

image.png

编写Ingress yaml文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard-ingress
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: dashboard.com
    http:
      paths:
        - path: "/"
          pathType: Prefix
          backend:
            service:
              name: kubernetes-dashboard
              port:
                number: 80

kubectl apply -f dashboard-ingress.yaml

创建好之后,查看Ingress列表,需要加上-n(即namespace的意思),否则只会在namespace=default下查询:
image.png

进入host文件(我的是MacOS系统,如果是Windows,自行查阅):

sudo vim /etc/hosts

在host文件的最后加上跳转的mapping:


image.png

这要在浏览器中访问dashboard.com的时候会访问到我们的kubernetes dashboard。

3.5 default-http-backend

kubectl describe ingress dashboard-ingress -n kubernetes-dashboard

可能会遇到以下信息:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)

这个表示我们没有default http来处理不正确的url,即如果我们在url中输入dashboard.com/abc,会跳404,但如果我们配置了一个Service,名字就叫default-http-backend,那么所有404的跳转,就会跳到这个Service上了。

4. Ingress同一个域名下多个路径

4.1 配置多个path

比如myapp.com网站,除了首页之前,我们可能会有很多Service(即myapp.com项目并不只是一个Web项目,而是拆分成很多的微服务,那么可能会部署不同的Pod以及Mapping在不同的Service上),比如/analytics,/shopping,

我们可以通过在同一个Ingress配置多个path来达到这样的效果:

spec:
  rules:
    - host: myapp.com
      http:
        paths:
          - path: /analytics
            pathType: Prefix
            backend:
              service:
                name: analytics-service
                port:
                  number: 3000
          - path: /shopping
            pathType: Prefix
            backend:
              service:
                name: shopping-service
                port:
                  number: 3001
4.2 配置多个host

另外一种case是有些大公司不止一个域名,除了myapp.com这个主域名外,还会有二级域名,如analytics.myapp.com,shopping.myapp.com等等,针对这种情况,需要配置多个host:

spec:
  rules:
    - host: analytics.myapp.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: analytics-service
                port:
                  number: 3000
    - host: shopping.myapp.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: shopping-service
                port:
                  number: 3001

5. 配置TLS认证—http://

官网:https://kubernetes.io/docs/concepts/services-networking/ingress/#tls

需要要Ingress yaml配置文件中的spec加tls配置,指向Secret中的metadata.name(所以还需要再配置一个Secret yaml文件)。

spec:
  tls:
  - hosts:
      - my-app.com
    secretName: myapp-secret-tls

Secret yaml配置文件,当需要创建tls的Secret,需要指定的type为kubernetes.io/tls

apiVersion: v1
kind: Secret
metadata:
  name: myapp-secret-tls
  namespace: default
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
type: kubernetes.io/tls

需要注意的是Secret中的namespace需要和Ingress中的一致,否则Ingress无法mapping这个信息。


参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356