一、Ingress Controller的暴露方式¶
当使用K8S中的Ingress资源对象来暴露应用时,用户访问应用的入口是 Ingress Controller 的地址。
Ingress Controller 会根据 Ingress 规则将请求路由到相应的服务,并将服务的响应返回 给客户端。
这时候就要把Ingress Controller暴露出去,暴露方式有以下几种:
- NodePort:使用 NodePort 服务类型来暴露 Ingress Controller,这种方式可以将 Ingress Controller 暴露到 Kubernetes 集群的所有节点上,通过节点的 IP 地址和 NodePort 可以访问到 Ingress Controller。
- 优点: 比较简单,易于配置和管理。
- 缺点: 需要暴露每个节点的端口,容易造成端口泛滥,不易于后续管理,或者 在安全方面存在一些隐患。
-

-
LoadBalancer(推荐):使用 LoadBalancer 服务类型来暴露 Ingress Controller,这种方式可以将 Ingress Controller 暴露到云服务提供商的负载均衡器上, 从而可以通过负载均衡器的IP地址来访问 Ingress Controller。可以实现更好的负载均衡和高可用性。
- 优点:可以自动创建负载均衡器,可以动态地分配IP地址,易于管理和扩展。
- 缺点:需要依赖云厂商提供的负载均衡器服务,对于一些不支持负载均衡器服务的云平台或者本地环境不太适用。

二、测试验证¶
采用前面课程中的java应用:
#定义资源文件
[root@master01 ~]# cd /root/6
[root@master01 6]# vim java.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot
spec:
replicas: 2
selector:
matchLabels:
app: springboot
template:
metadata:
labels:
app: springboot
spec:
containers:
- name: springboot
image: registry.cn-hangzhou.aliyuncs.com/abroad_images/springboot:v1-aming
resources:
limits:
memory: "1Gi"
cpu: "1"
requests:
memory: "128Mi"
cpu: "100m"
ports:
- containerPort: 8080
name: web
livenessProbe:
httpGet:
port: web
path: /apptwo
timeoutSeconds: 2
periodSeconds: 30
readinessProbe:
tcpSocket:
port: web
initialDelaySeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: springboot
spec:
type: ClusterIP
selector:
app: springboot
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
#应用
[root@master01 6]# kaf java.yaml
配置HTTP:ingress-nginx转发模板:
#定义ingress
[root@master01 6]# vim http-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
spec:
ingressClassName: nginx
rules:
- host: java.zhang-qing.com
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /
#应用ingress
[root@master01 6]# kaf http-ingress.yaml
#测试访问
[root@master01 6]# curl http://java.zhang-qing.com/appone
appone
环境清理
[root@master01 ~]# k delete -f java.yaml -f http-ingress.yaml
配置HTTPS:ingress-nginx转发模板:
(1)上传java.zhang-qing.com.key和java.zhang-qing.com.pem证书文件到/root目录下
[root@master01 ~]# ls java.zhang-qing.com.*
java.zhang-qing.com.key java.zhang-qing.com.pem
(2)创建ingress-tls
#创建
[root@master01 ~]# kubectl create secret tls ingress-secret-java -n default --key java.zhang-qing.com.key --cert java.zhang-qing.com.pem
#验证
[root@master01 ~]# kg secret | grep ingress-secret
ingress-secret-java kubernetes.io/tls 2 52s
(3)创建ingress-nginx
#定义ingress资源
[root@master01 6]# vim https-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
spec:
ingressClassName: nginx
rules:
- host: java.zhang-qing.com
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /
tls:
- hosts:
- java.zhang-qing.com
secretName: ingress-secret-java
#应用ingress
[root@master01 6]# kaf https-ingress.yaml
#测试访问
[root@master01 6]# curl https://java.zhang-qing.com/appone
appone
主要参数:
- 在 metadata 字段中,name 字段指定了创建的 Ingress 资源的名称。
- 在 spec 字段中,ingressClassName 字段指定了要使用的 Ingress 控制器。这里使用了名为 nginx 的 Ingress 类别(早先课程演示使用的参数为:kong)。
- rules:指定了 Ingress 的规则列表。在这里只有一个规则,即当外部流量通过 HTTP 访问 Ingress 时,应该使用下面的配置:
- path:指定了应该匹配的 URL 路径。在这里,所有路径都匹配 /,也就是只要是 java.zhang-qing.com请求都会进入到咱们的Springboot容器。
- pathType:指定了路径匹配方式,这里使用了 Prefix 类型,表示只要路径以 / 开头,就匹配成功。
- backend:指定将匹配的流量转发到哪个后端(Service)。这里选择了 springboot 的 Service(ClusterIP类型),及 Service 的 8080 端口接收流量。
- tls:指定了 Ingress 的https。
- hosts:主要域名;
- secretName:通过如上创建的证书secret;
环境清理
[root@master01 ~]# k delete -f java.yaml -f https-ingress.yaml
[root@master01 ~]# k delete secret ingress-secret-java
三、总结¶
Ingress-Nginx解决方案总结:
- 功能层面:Ingress-Nginx是一个Kubernetes集群中的一个Ingress控制器,能够处理HTTP(s)和TCP流量,实现请求的路由、负载均衡、TLS终止、网络ACL等常见的负载均衡器功能。
- 技术层面:Ingress-Nginx是使用Nginx作为反向代理服务器来实现的,同时它使用了Lua脚本、Nginx插件等技术,以便实现高效、灵活、可扩展的负载均衡器功能。
- 部署和配置层面:Ingress-Nginx可以快速部署和配置,其配置文件使用了 Kubernetes的标准API,并提供了多种安装方式,包括使用Helm、YAML文件等。 用户可以通过这些方式轻松地进行配置和自定义。
- 生态层面:Ingress-Nginx是Kubernetes生态系统中流行的Ingress控制器之一,具有广泛的社区支持和活跃的开发者。在官方的GitHub存储库中,有大量的文档、示例和更新,可以帮助用户快速使用和解决常见问题。