如何使用Nginx Ingress

Nginx Ingress是一种用于Kubernetes集群的网络流量管理解决方案,通过Ingress API对象将外部流量路由到集群内部服务。Nginx Ingress Controller部署在集群内部,提供高性能和可定制性。ACK Edge集群整合社区版本和阿里云产品功能,提供更便捷的使用体验。本文介绍如何在ACK Edge集群中使用Nginx Ingress。

操作步骤

  1. 分别在云端节点池和边缘节点池部署Nginx Ingress Controller,具体操作,请参见部署Nginx Ingress Controller。 部署完成后,可以查看Nginx Ingress Controller状态,以及服务暴露状态。

    1. 执行以下命令查看云端节点池Nginx Ingress Controller Pod状态。

      kubectl get po -n ingress-cloud -o wide

      预期输出:

      NAME                                                     READY   STATUS    RESTARTS   AGE     IP           NODE           NOMINATED NODE   READINESS GATES
      ack-ingress-nginx-v1-cloud-controller-7d7b555f8b-5kgqb   1/1     Running   0          20s     10.10.0.1    cloud-node-1   <none>           <none>
      ack-ingress-nginx-v1-cloud-controller-7d7b555f8b-725cl   1/1     Running   0          20s     10.10.0.2    cloud-node-2   <none>           <none>
    2. 执行以下命令查看云端节点池Nginx Ingress Controller服务状态。

      kubectl get svc -n ingress-cloud

      预期输出:

      NAME                                    TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
      ack-ingress-nginx-v1-cloud-controller   LoadBalancer   172.12.0.1     xxx.xxx.xxx.xxx   80:30080/TCP,443:30443/TCP    30S
    3. 执行以下命令查看边缘节点池Nginx Ingress Controller Pod状态。

      kubectl get po -n ingress-edge -o wide

      预期输出:

      NAME                                                    READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
      ack-ingress-nginx-v1-edge-controller-7d57b84c88-4wsm4   1/1     Running   0          17s   10.10.0.1    edge-node-1   <none>           <none>
      ack-ingress-nginx-v1-edge-controller-7d57b84c88-fqvj8   1/1     Running   0          17s   10.10.1.1    edge-node-2   <none>           <none>
    4. 执行以下命令查看边缘节点池Nginx Ingress Controller服务状态。

      kubectl get svc -n ingress-edge

      预期输出:

      NAME                                   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
      ack-ingress-nginx-v1-edge-controller   NodePort   172.12.0.2      <none>        80:32080/TCP,443:32443/TCP   3m51s
  2. 使用以下内容,创建cube.yaml。

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool
    spec:
      type: ClusterIP
      selector:
        app: cube
      ports:
        - port: 80
          targetPort: 80
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cube
      labels:
        app: cube
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: cube
      template:
        metadata:
          labels:
            app: cube
        spec:
          containers:
          - name: cube-web
            image: registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube:1.0
            ports:
            - containerPort: 80
  3. 执行以下命令,创建测试应用cube和Service。

    kubectl apply -f cube.yaml

    执行以下命令,查看业务Pod是否分别部署在云端节点池和边缘节点池。

    kubectl get pod  -o wide

    预期输出:

    NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE           
    cube-757558c974-9zfkn   1/1     Running   0          11m   10.10.0.1     cloud-node-1   
    cube-757558c974-cw72m   1/1     Running   0          11m   10.10.0.2     cloud-node-2   
    cube-757558c974-fbvlf   1/1     Running   0          11m   10.10.1.1     edge-node-1    
    cube-757558c974-ngwxt   1/1     Running   0          11m   10.10.1.2     edge-node-2    
  4. 使用以下内容,创建ingress.yaml,分别为云端Ingress Controller和边缘Ingress Controller创建Ingress。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: cube-ingress-cloud
      namespace: default
    spec:
      ingressClassName: ack-nginx-cloud               # 为云端Ingress Controller创建Ingress。
      rules:
      - host: example.cube.com
        http:
          paths:
          - path: /
            backend:
              service:
                name: cube-svc
                port:
                  number: 80
            pathType: ImplementationSpecific
    
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: cube-ingress-edge
      namespace: default
    spec:
      ingressClassName: ack-nginx-edge                 # 为边缘Ingress Controller创建Ingress。
      rules:
      - host: example.cube.com
        http:
          paths:
          - path: /
            backend:
              service:
                name: cube-svc
                port:
                  number: 80
            pathType: ImplementationSpecific

    执行以下命令,创建Ingress资源。

    kubectl apply -f ingress.yaml
  5. 执行以下命令,查看ingress资源。

    kubectl get ingress

    预期输出:

    NAME                 CLASS             HOSTS              ADDRESS           PORTS   AGE
    cube-ingress-cloud   ack-nginx-cloud   example.cube.com   139.224.xxx.xxx   80      24m
    cube-ingress-edge    ack-nginx-edge    example.cube.com   172.20.xxx.xxx    80      24m
    • 云端节点池的Ingress Controller通过LoadBalancer类型的Service对外暴露服务,因此负载均衡的地址会自动填充到Ingress的地址字段中。您可以直接使用这个负载均衡的地址来访问服务。

    • 边缘节点池的Ingress Controller通过NodePort类型的Service对外暴露服务,因此会将Service的ClusterIP地址填充到Ingress的地址中,您可以使用节点地址加上NodePort的方式来访问服务。

相关文档

ACK Edge集群ACK集群Pro版的基础上扩展了边缘节点池用于接入边缘节点、IDC机器,因此在ACK Edge集群上使用Nginx Ingress可支持以下能力:

相关操作

文档

ACK Edge差异点

如何创建Nginx Ingress?

创建Nginx Ingress

需要根据实际场景配置流量拓扑。

如何部署Nginx Ingress Controller组件?

部署Nginx Ingress Controller

仅支持应用市场部署。

如何升级Nginx Ingress Controller组件?

升级应用市场ack-ingress-nginx

仅支持应用市场升级。

如何通过部署Nginx Ingress Controller来支撑高负载应用?

部署高负载场景的Nginx Ingress Controller

无。

如何配置Ingress Controller CLB的公网和私网类型?

配置公网和私网类型的Nginx Ingress Controller

仅支持部署在云上节点池的Ingress Controller。

如何通过Nginx Ingress实现灰度发布和蓝绿发布?

通过Nginx Ingress实现灰度发布和蓝绿发布

无。

如何通过Ingress Controller来实现应用的流量复制?

通过Ingress Controller来实现应用的流量复制

无。

如何进行Nginx Ingress Controller组件的链路追踪?

实现Nginx Ingress Controller组件的链路追踪

无。

如何部署及查看Nginx Ingress访问日志?

Nginx Ingress访问日志分析与监控

仅支持命令行开启。

如何通过Ingress Controller实现gRPC服务访问?

通过Ingress Controller实现gRPC服务访问

无。