在上一节中,您学习了向群集外部客户端公开服务的两种方法(节点端口和负载平衡器)。本节介绍——Ingress的另一种方法。
为什么需要Ingress
一个很重要的原因是每个LoadBalancer服务都需要属于它自己的负载均衡器以及独立的公共IP地址,而Ingress只需要一个公网IP就能为许多服务提供访问。当客户端发送HTTP请求到Ingress时,Ingress会根据请求中的主机名和路径决定将请求转发到哪个服务,如下图所示:
通过一个Ingress就可以暴露多个服务。
Ingress在网络堆栈的应用层上工作,可以提供诸如基于cookie的会话绑定等service无法提供的特性。
什么是Ingress
Ingress是Kubernetes中的一种资源对象,它使我们能够为运行在kubernetes集群中的应用程序配置一个HTTP负载均衡器,该应用程序由一个或多个服务表示。为了将这些应用程序交付给Kubernetes集群之外的客户端,这种负载均衡器是必要的。Ingress公开从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingresss资源上定义的规则控制。
下面是一个简单的例子,Ingress将其所有的流量发送到一个服务:
Ingress资源支持如下特性:
什么是Ingress控制器
Ingress控制器一个运行在集群中的应用,它会根据Ingress资源配置一个HTTP负载均衡器。该负载均衡器可以是一个运行在集群中的软件负载均衡器,也可以是一个在集群外部运行的硬件或者云负载均衡器。不同的负载均衡器需要不同的Ingress控制器实现方式。
如果想要Ingress能正常工作,首先必须确保在集群中运行Ingress控制器。不同的Kubernetes环境使用不同的控制器实现方式,但有些根本不提供默认的控制器。
例如,GKE(Google Kubernetes Engine)使用Google Cloud Platform自己的HTTP负载均衡特性来提供Ingress功能。对于Minikube来说,最初并没有提供开箱即用的控制器,但现在它包含一个可以启用的插件便于Ingress的功能。
本文我们使用Nginx Ingress控制器来演示如何使用Ingress控制器。
安装Nginx Ingress控制器
在Master节点上下载de文件:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/de
之所以先下载这个文件,而不是直接通过kubectl apply -f 命令执行,是因为国内无法访问该文件中指定的k8s.gcr.io下的镜像。所以将文件下载下来后,还需要使用我们事先准备好的阿里云镜像替换该镜像:
sed -i 's#k8s.gcr.io/ingress-nginx/controller:v0.41.2@sha256:1f4f402b9c14f3ae92b11ada1dfe9893a88f0faeb0b2f4b903e2c67a0c3bf0de#registry.cn-shanghai.aliyuncs.com/pmx/ingress-nginx:v0.41.2@sha256:8aa4fda472ec83ae59fe0ce9720684d769ed277ff9bdcbb0169178dc9d1f8e85#g' de
另外,对外开放的时候,需要固定Node上的端口,如果不想Kubernetes帮我们随机生成,可以修改该文件。找到Source: ingress-nginx/template,在ports上添加nodePort,设置http端口为32080,https端口为32443:
然后创建Nginx Ingress控制器:
kubectl apply -f de
检查Ingress控制器pod是否已经启动:
kubectl get pods -n ingress-nginx
-l a --watch
查看生成的service:
到此处就可以直接通过nodeIP:nodePort的方式来访问这个服务。
这个服务是nginx Ingress 控制器对外访问的一个入口,接收集群外部流量:
说明Nginx Ingress控制器部署成功。
通过如下命令查看Ingress 控制器的版本:
POD_NAMESPACE=ingress-nginx
POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l a --field-selector= -o jsonpath='{.items[0].me}')
kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version
接下来我们就可以创建我们的第一个Ingress资源了。
创建后端服务
创建一个后端服务来演示如何通过Ingress进行访问。
vim
apiVersion: v1
kind: Service
metadata:
name: test-tomcat-svc
spec:
selector:
app: tomcat
ports:
- name: http
targetPort: 8080
port: 8080
vim
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-tomcat-deploy
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomca
ports:
- name: http
containerPort: 8080kubectl apply -f
kubectl get deploy
创建Ingress资源
vim
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-tomcat-ingress-nginx
annotations:
kuberne: "nginx"
spec:
rules:
- host:
http:
paths:
- path:
backend:
serviceName: test-tomcat-svc
servicePort: 8080kubectl apply -f
进入nginx ingresss控制器pod,查看更新后的nginx配置文件:
kubectl exec -it ingress-nginx-controller-55bcfcfd89-xfvmv -n ingress-nginx bash
cat nginx.conf
访问后端服务
在本地Windows系统上配置hosts文件,添加一条hosts记录:
192.168.188.132
其中192.168.188.132为节点IP地址。
访问地址::32080
如果觉得本文对您有帮助,欢迎关注我的头条号订阅更新,我会不断推出更多学习教程、视频以及偏实战的文章!
1.《【ff9修改器】专题从零开始学K8s: 28.Ingress》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【ff9修改器】专题从零开始学K8s: 28.Ingress》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.cxvn.com/gl/djyxgl/187287.html