Kubernetes安装IngressNginx
安装
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.44.0/deploy/static/provider/baremetal/deploy.yaml |
部署完,我们查看一下状态
对应的service和deployment已经创建完毕,并且service以NodePort方式对外开放了32756端口
部署tomcat进行测试
我准备了yaml文件,部署一个tomcat,并指定host信息
1 | --- |
部署到集群
1 | kubectl apply -f tomcat.yaml |
等部署完毕后,我们访问一下http://tomcat.custom.com:32756/,tomcat.custom.com随意映射集群任何一个节点就可以
说明ingressNginx已经成功代理了我们的域名服务
但是还有一个我们访问的端口是ingressnginx生成的NodePort接口,我们更希望直接代理到80端口上,这种情况怎么处理呢
官方给出了几种解决方法,我们来看一下
注意事项
通过NodePort服务
NodePort通过kube-proxy组件在每个主机节点上公开相同的非特权端口(默认值:30000-32767)。
可以使用**–service-node-port-rangeAPI服务器标志重新配置NodePort范围以包括非特权端口并能够公开端口80和443听起来很诱人,但这样做可能会导致意外问题,包括(但不限于)使用否则保留给其他用户使用的端口系统守护程序,以及授予kube-proxy**它可能不需要的特权。
这种方式可以指定监听80端口,但是不鼓励这种做法。
主机网络
可以将Pod配置ingress-nginx为使用其运行的主机的网络,而不是kubenetes内部网络。这种方法的好处是,NGINX Ingress控制器可以将端口80和443直接绑定到Kubernetes节点的网络接口,而无需由NodePort Services施加额外的网络转换。
这可以通过启用hostNetworkPods规范中的选项来实现。
1 | template: |
此部署方法的一个主要限制是,在每个群集节点上只能调度单个NGINX Ingress控制器Pod,因为从技术上讲,在同一网络接口上多次绑定同一端口是不可能的。由于这种情况只能每个节点启动唯一的pod
扩展组件(推荐)
此部署方法需要第三方扩展组件为Kubernetes集群提供公共入口点。该组件可以是硬件(例如供应商设备)或软件(例如HAproxy),并且通常由运营团队在Kubernetes领域之外进行管理。
这种部署建立在上面“基于NodePort服务”中描述的NodePort服务的基础上,有一个显着的区别:外部客户端不直接访问群集节点,只有边缘组件可以访问。这特别适用于没有任何节点具有公共IP地址的私有Kubernetes集群。
在组件方面,唯一的要求是专用于将所有HTTP请求转发到Kubernetes节点和/或主节点的公共IP地址。TCP端口80和443上的传入流量被转发到目标节点上的相应HTTP和HTTPS NodePort,如下图所示: