本教程介绍NGINX Ingress控制器的安装,这是一个由Kubernetes社区开发的开源项目。k0s没有内置Ingress控制器,但如本文档所示,部署NGINX Ingress很容易。也可以使用其他Ingress解决方案(请参阅页面末尾的链接)。
Kubernetes为向外部网络公开服务提供了多种选择。主要选项有NodePort、LoadBalancer和Ingress控制器
NodePort: 意味着节点上的端口被配置为将传入请求路由到某个服务。端口范围限制为30000-32767,因此您无法使用NodePort公开常用的端口,如80或443。
LoadBalancer: 是一种服务,通常由云提供商作为外部服务实现(需要额外付费)。负载均衡器也可以通过MetalLB在Kubernetes集群内部安装,MetalLB通常用于裸机部署。负载均衡器提供单个IP地址来访问您的服务,这些服务可以在多个节点上运行。
Ingress controller 有助于将多个应用程序的路由规则整合到一个实体中。在NodePort、LoadBalancer或主机网络的帮助下,Ingress控制器暴露在外部网络中。您还可以使用Ingress控制器在一个地方终止域的TLS,而不是分别终止每个应用程序的TLS。
NGINX入口控制器是Kubernetes中非常流行的入口。
在许多云环境中,它可以通过使用云提供商提供的负载均衡器暴露于外部网络。但是,云负载平衡器不是必需的。负载均衡器也可以用MetalLB来实现,MetalLB可以部署在同一个Kubernetes集群中。将Ingress控制器暴露给外部网络的另一种选择是使用NodePort。第三种选择是使用主机网络。下面将通过单独的示例更详细地描述所有这些替代方案。
使用NodePort安装NGINX是Ingress Controller最简单的示例,因为我们可以避免负载均衡器依赖。NodePort用于将NGINX入口暴露给外部网络。
1 . 安装NGINX入口控制器(使用Ingress NGINX项目的官方清单)
kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/baremetal/deploy.yaml
2 . 检查Ingress controller pods 是否已启动
kubectl get pods-n ingress nginx
3 . 检查您是否可以看到 NodePort 服务
kubectl get services -n ingress-nginx
4 . 从Ingress NGINX Controller的v1.0.0版本开始,需要一个ingressclass对象: https://kubernetes.github.io/ingress-nginx/#what-is-an-ingressclass-and-why-is-it-important-for-users-of-ingress-nginx-controller-now
在默认安装中,已经创建了一个名为nginx的ingressclass对象。
kubectl -n ingress-nginx get ingressclasses
kubectl -n ingress-nginx annotate ingressclasses nginx ingressclass.kubernetes.io/is-default-class="true"
5 . 尝试使用上一步中的NodePort连接Ingress控制器(在30000-32767的范围内)
curl <worker-external-ip>:<node-port>
curl<worker外部ip>:<节点端口>
如果你还没有配置任何后端服务,你应该会看到nginx的“404 Not Found”。表示运行成功了。 如果你看到nginx的响应,那么Ingress控制器正在运行,你可以访问它。
6 . 部署一个小型测试应用程序(httpd-web服务器)来验证您的Ingress控制器。
创建以下YAML文件,并将其命名为simple-web-server-with-ingress.yaml:
apiVersion: v1
kind: Namespace
metadata:
name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
namespace: web
spec:
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: httpd
image: httpd:2.4.53-alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-server-service
namespace: web
spec:
selector:
app: web
ports:
- protocol: TCP
port: 5000
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-server-ingress
namespace: web
spec:
ingressClassName: nginx
rules:
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-server-service
port:
number: 5000
部署应用程序:
kubectl apply -f simple-web-server-with-ingression.yaml
7 . 验证您是否可以使用步骤3中的NodePort访问您的应用程序。
curl <worker-external-ip>:<node-port> -H 'Host: web.example.com'
curl<worker外部ip>:<节点端口>-H'主机:web.example.com'
如果你成功了,你应该看到<html><body><h1>It works!</h1></body></html>
在这个例子中,您将在k0s上使用LoadBalancer安装NGINX Ingress控制器
1 . 安装LoadBalancer
在k0s上安装LoadBalancer有两种选择。按照链接安装LoadBalancer。
2 . 验证LoadBalancer
为了继续,您需要为Kubernetes集群提供负载均衡器。要验证它是否可用,请部署一个简单的负载均衡器服务。
apiVersion: v1
kind: Service
metadata:
name: example-load-balancer
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
kubectl apply -f example-load-balancer.yaml
然后运行以下命令,查看具有外部IP地址的LoadBalancer
kubectl get service example-load-balancer
如果LoadBalancer不可用,您将无法获得EXTERNAL-IP的IP地址。相反,它是<pending>。在这种情况下,您应该返回上一步并检查负载平衡器的可用性。
kubectl delete -f example-load-balancer.yaml
3 .按照上一章中的步骤(步骤1至步骤4)安装NGINX入口控制器。
4 . 编辑NGINX入口控制器以使用LoadBalancer而不是NodePort
kubectl edit service ingress-nginx-controller -n ingress-nginx
找到spec.type字段并将其从“NodePort”更改为“LoadBalancer”
5 . 检查您是否可以看到LoadBalancer类型的ingress nginx控制器。
kubectl get services -n ingress-nginx
6 . 尝试连接到Ingress控制器
如果在步骤2中为MetalLB使用了私有IP地址,则应从本地网络运行以下命令。使用上一步EXTERNAL-IP列中的IP地址。
curl <EXTERNAL-IP>
curl<外部-IP>
如果你还没有配置任何后端服务,你应该会看到nginx的“404 Not Found”。表示运行了。如果您看到nginx的响应,则表示Ingress控制器正在运行,您可以使用LoadBalancer访问它。
7 . 部署一个小型测试应用程序(httpd-web服务器)来验证您的Ingress。
如前一章(步骤6)所述,创建YAML文件 simple-web-server-with-ingress.yaml 简单web服务器并部署它。
kubectl apply -f simple-web-server-with-ingress.yaml
8 . 验证您是否可以通过LoadBalancer和Ingress控制器访问您的应用程序。
curl <worker-external-ip> -H 'Host: web.example.com'
如果你成功了,你应该看到<html><body><h1>It works!</h1></body></html>。
主机网络选项直接使用工作节点的IP地址公开Ingress。它还允许您使用端口80和443。此选项不使用任何服务对象(ClusterIP、NodePort、LoadBalancer),并且它的限制是每个集群节点上只能调度一个Ingress控制器Pod。
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/baremetal/deploy.yaml
spec:
template:
spec:
hostNetwork: true
您还可以完全删除ingress-nginx-controller 控制器,因为不需要它。
3 . 安装Ingress
kubectl apply -f deploy.yaml
4 . 尝试连接到Ingress控制器,部署测试应用程序并验证访问权限。这些步骤与前面的安装方法类似。