本教程介绍NGINX Ingress控制器的安装,这是一个由Kubernetes社区开发的开源项目。k0s没有内置Ingress控制器,但如本文档所示,部署NGINX Ingress很容易。也可以使用其他Ingress解决方案(请参阅页面末尾的链接)。

NodePort 和 LoadBalancer 和 Ingress控制器 介绍

  • Kubernetes为向外部网络公开服务提供了多种选择。主要选项有NodePort、LoadBalancer和Ingress控制器

  • NodePort: 意味着节点上的端口被配置为将传入请求路由到某个服务。端口范围限制为30000-32767,因此您无法使用NodePort公开常用的端口,如80或443。

  • LoadBalancer: 是一种服务,通常由云提供商作为外部服务实现(需要额外付费)。负载均衡器也可以通过MetalLB在Kubernetes集群内部安装,MetalLB通常用于裸机部署。负载均衡器提供单个IP地址来访问您的服务,这些服务可以在多个节点上运行。

  • Ingress controller 有助于将多个应用程序的路由规则整合到一个实体中。在NodePort、LoadBalancer或主机网络的帮助下,Ingress控制器暴露在外部网络中。您还可以使用Ingress控制器在一个地方终止域的TLS,而不是分别终止每个应用程序的TLS。

Ingress controller 介绍

NGINX入口控制器是Kubernetes中非常流行的入口。
在许多云环境中,它可以通过使用云提供商提供的负载均衡器暴露于外部网络。但是,云负载平衡器不是必需的。负载均衡器也可以用MetalLB来实现,MetalLB可以部署在同一个Kubernetes集群中。将Ingress控制器暴露给外部网络的另一种选择是使用NodePort。第三种选择是使用主机网络。下面将通过单独的示例更详细地描述所有这些替代方案。

一、 使用NodePort安装NGINX

使用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>

二、 使用LoadBalancer安装NGINX

在这个例子中,您将在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>。在这种情况下,您应该返回上一步并检查负载平衡器的可用性。

  • 如果你成功了,你会看到一个真实的IP地址,你可以继续。
    您可以删除示例负载平衡器(测试程序了):
    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>。

三、 使用host network安装NGINX

主机网络选项直接使用工作节点的IP地址公开Ingress。它还允许您使用端口80和443。此选项不使用任何服务对象(ClusterIP、NodePort、LoadBalancer),并且它的限制是每个集群节点上只能调度一个Ingress控制器Pod。

  1. 下载NGINX入口控制器官方清单:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/baremetal/deploy.yaml
  1. 编辑deploy.yaml。找到Deployment ingress-nginx-controller,并通过添加hostNetwork启用主机网络选项:
spec:
  template:
    spec:
      hostNetwork: true

您还可以完全删除ingress-nginx-controller 控制器,因为不需要它。

3 . 安装Ingress

kubectl apply -f deploy.yaml

4 . 尝试连接到Ingress控制器,部署测试应用程序并验证访问权限。这些步骤与前面的安装方法类似。

四 、k0s上Ingress Controllers的替代示例

附加信息