目录

ingress是什么

k8s中ingress实施

1、ingress controller安装

2、使用

ingress切换宿主机ip

ingress定义

ingress是什么



首先,要来看传统k8s中service的NodePort存在的不足


1、一个端口只能一个服务使用,端口需要提前规划


2、只支持4层网络协议


四层(传输层):基于ip和端口转发的


七层(应用层):基于应用层协议转发,例如http、可以根据域名、url等转发



所以,使用ingress的话,他可以在集群中实现一个统一的负载均衡,在集群中提供一个访问入口,




其中,ingress分为ingress和ingress Controller


ingress: k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法


ingress Controller: 根据Ingress生成具体的路由规则,并对pod负载均衡




k8s配置ingress规则 k8s ingress controller_k8s配置ingress规则


Ingress Controller有很多实现,我们这里采用官方维护的基于Nginx实现的控制器。


 项目地址: GitHub - kubernetes/ingress-nginx: NGINX Ingress Controller for Kubernetes 


文档: Installation Guide - NGINX Ingress Controller 



其他控制器: Ingress Controllers | Kubernetes



k8s中ingress实施



首先先下载实施yaml文件


 https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/baremetal/deploy.yaml


ingress有两种部署方式,因为他本质上也是一个pod,所以他有两种暴露方式,第一种。pod创建,用service在对他进行代理。第二种。直接共用宿主机网络,将端口暴露在宿主机


官方yaml默认是由service代理的




k8s配置ingress规则 k8s ingress controller_运维_02



1、ingress controller安装


1、执行下载好的yaml


kubectl apply -f ingress-controller-1.1.yaml


2、他默认在ingress-nginx这个命名空间下


kubectl get pods -n ingress-nginx



k8s配置ingress规则 k8s ingress controller_kubernetes_03


其中,imagess-nginx-controller启动即可,剩余两个为job容器, 不需要理会



查看暴露的service端口


kubectl get pods,svc -n ingress-nginx



k8s配置ingress规则 k8s ingress controller_kubernetes_04




2、使用


先创建规则



kubectl apply -f xxx.yaml


kubectl get ingress


 测试:本地电脑绑定hosts记录对应ingress里面配置的域名 例: web1.aliangedu.cn



例如这可以生成一个示例yaml


kubectl create ingress web1 --rule=host/path=web:80 --dry-run=client -o yaml



k8s配置ingress规则 k8s ingress controller_kubernetes_05


可以以此为参考



或者直接在官网下载示例


官网地址


Ingress | Kubernetes



在使用前要明白一点。即ingress是代理service的,所以在使用ingress前要先有创建service


kubectl get svc



k8s配置ingress规则 k8s ingress controller_运维开发_06



以这个nginx的service为例


vi ingress1.yaml


apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: web1

spec:

ingressClassName: "nginx"

  rules:

web1.aliangedu.cn

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

name: nginx

            port:

              number: 80


标红都是需要注意修改的,service是此ingress绑定的service



执行


kubectl apply -f ingress1.yaml


查看ingress


kubectl get ingress



k8s配置ingress规则 k8s ingress controller_k8s配置ingress规则_07


他们分别是此images名、代理的service名、代理的域名、节点所在ip、服务走的端口



所以,我们访问域名即可访问此服务


注意:访问前先确定自己的访问电脑是否对此域名做了dns解析



在访问域名加对应的ingress端口即可成功



k8s配置ingress规则 k8s ingress controller_容器_08




整个访问流程:


Service NodePort访问Ingress Controller


域名(web1.aliangedu.cn:32613) -> 公网负载均衡器(80) -> service nodeport(80:32613/TCP,443:31743/TCP)-> iptables/ipvs -> ingress controller Pod(nginx,基于域名分流) -> 分布在各个节点上的pod




ingress切换宿主机ip



在ingress的yaml中搜索containers


在containers上新加hostNetwork: True,与containers同级



k8s配置ingress规则 k8s ingress controller_运维开发_09


kubectl apply -f ingress-controller-1.1.yaml


他会重建



k8s配置ingress规则 k8s ingress controller_运维开发_10



此时访问地址变成这样


hostNetwork访问Ingress Controller:


域名(web1.aliangedu.cn:80) -> 公网负载均衡器(80) -> 宿主机80端口是ingress controller监听的 -> ingress controller(nginx,基于域名分流) -> 分布在各个节点上的pod



使用network的好处时他避开了service的代理,直接从宿主机访问,更方便快捷,坏处是只能访问他分配到的ip才能访问,没有service那么灵活



ingress定义


ingress是一个全局入口(80和443),为集群中所有应用转发



公网负载均衡器在其中的作用:


1、将k8s节点(内网)暴露到互联网上


2、为互联网用户统一访问入口,特别是针对service nodeport


3、加强k8s网络安全