20221220 8. Ingress

简介

Ingress 概念 | Kubernetes

Ingress API | Kubernetes

K8s集群对外暴露服务的方式目前只有三种:loadblancer、nodeport、ingress

ingress由两部分组成:ingress controller和ingress服务。

其中ingress controller目前主要有两种:基于nginx服务的ingress controller和基于traefifik的ingress controller。

而其中traefifik的ingress controller,目前支持http和https协议。由于对nginx比较熟悉,而且需要使用TCP负载,所以在此我们选择的是基于nginx服务的ingress controller。

在kubernetes集群中,我们知道service和pod的ip仅在集群内部访问。如果外部应用要访问集群内的服务,集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube-proxy组件将其转发给相关的pod。

而Ingress就是为进入集群的请求提供路由规则的集合,通俗点就是提供外部访问集群的入口,将外部的HTTP或者HTTPS请求转发到集群内部service上。

Ingress-Nginx

Ingress-Nginx组成

Ingress-nginx一般由三个组件组成:

  • 反向代理负载均衡器:通常以service的port方式运行,接收并按照ingress定义的规则进行转发,常用的有nginx,Haproxy,Traefifik等,本次实验中使用的就是nginx

  • Ingress Controller:监听APIServer,根据用户编写的ingress规则(编写ingress的yaml文件),动态地去更改nginx服务的配置文件,并且reload重载使其生效,此过程是自动化的(通过lua脚本来实现)

  • Ingress:将nginx的配置抽象成一个Ingress对象,当用户每添加一个新的服务,只需要编写一个新的ingress的yaml文件即可

Ingress-Nginx的工作原理

  1. ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化。然后读取它,按照自定义的规则,规则就是写明了那个域名对应哪个service,生成一段nginx配置。

  2. 再写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入 /etc/nginx.conf 文件中。然后reload一下使配置生效,以此达到分配和动态更新问题。

ingress与ingress-controller

  • ingress对象:指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。

  • ingress-controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。

简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。

ingress-controller

ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。

但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据ingress对象生成配置并应用新配置到反向代理,比如nginx-ingress就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置。

nginx-controller原理

# 查看ingress-nginx 命名空间下的pod
kubectl get pods -n ingress-nginx

# 进入ingress-nginx 的pod
kubectl exec nginx-ingress-controller-6779f7d56-26hp6 -n ingress-nginx -- cat /etc/nginx.conf

ingress

ingress是一个API对象,和其他对象一样,通过yaml文件来配置。ingress通过http或https暴露集群内

部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于host的方向代理。ingress要依

靠ingress-controller来具体实现以上功能。

Ingress-Nginx官网地址

基于nginx服务的ingress controller根据不同的开发公司,又分为k8s社区的ingres-nginx和nginx公司的nginx-ingress。

Ingress-Nginx

下载资源文件

根据github上的活跃度和关注人数,我们选择的是k8s社区的ingres-nginx

下载ingrees-controller

打开github官网:选择某一个具体版本后进入 deploy/static/ 目录中,复制mandatory.yaml文件内容。

https://github.com/kubernetes/ingress-nginx/tree/nginx-0.30.0/deploy/static/mandatory.yaml

下载ingress服务

https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

ingress 示例

运行ingress-controller

在mandatory.yaml文件的Deployment资源中增加属性

sepc.template.sepc.hostNetWork: true

hostNetwork网络,这是一种直接定义Pod网络的方式。如果在Pod中使用hostNetwork:true配置网络,那么Pod中运行的应用程序可以直接使用node节点的端口

# 运行ingress/mandatory.yaml文件
kubectl apply -f mandatory.yaml

运行ingress服务

# 运行ingress/service-nodeport.yaml文件
kubectl apply -f service-nodeport.yaml

部署tomcat服务

ingress/tomcat-service.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  labels:
    app: tomcat-deployment
spec:
  replicas: 1
  template:
    metadata:
      name: tomcat-deployment
      labels:
        app: tomcat-deployment
    spec:
      containers:
        - name: tomcat-deployment
          image: tomcat:9.0.20-jre8-alpine
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
      restartPolicy: Always
  selector:
    matchLabels:
      app: tomcat-deployment
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
spec:
  selector:
    app: tomcat-deployment
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30088
  type: NodePort
# 运行tomcat-service
kubectl apply -f tomcat-service.yml -n 

部署ingress规则文件

ingress/ingress-tomcat.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress-test
spec:
  rules:
    - host: ingress-tomcat.lagou.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: tomcat-svc
                port:
                  number: 8080
# 运行ingress规则
kubectl apply -f ingress-tomcat.yml
# 查看ingress
kubectl get ingress

# 查看ingress服务:查看service的部署端口号
kubectl get svc -n ingress-nginx

# 查看ingress-controller运行在那个node节点
kubectl get pod -n ingress-nginx -o wide

通过ingress访问tomcat

http://192.168.198.158:30088

修改hosts文件后

159.75.19.155       ingress-tomcat.lagou.com

http://ingress-tomcat.lagou.com:30088

posted @ 2022-12-22 14:48  流星<。)#)))≦  阅读(44)  评论(0编辑  收藏  举报