使用NodePort类型的Service暴露应用

在Kubernetes中,Service是用于将运行在一组Pod上的应用程序公开为网络服务的抽象概念,本文以Nginx无状态应用为例,介绍如何在ACK Edge集群中使用NodePort类型的Service暴露应用。

使用NodePort类型的Service

由于在边缘侧无负载均衡,因此常见的对集群外服务暴露的方式常常采用NodePort类型的Service。在ACK Edge集群中使用NodePort Service如图所示。部署NodePort类型的Service并选择好后端Pod后,您可以直接通过节点地址和节点端口访问后端服务。更多Service类型以及介绍详情,请参见Service快速入门

image

注意事项

由于ACK Edge集群中的节点常分布在不同的网络域中,多个网络域中的节点、容器无法相互访问。

  • 为确保访问流量仅转发到本节点池或本节点上的后端Pod,可配置Service服务拓扑,以避免流量被转发到其他网络域的Pod后端而导致的网络不通问题。具体操作,请参见节点池服务拓扑管理

  • 为方便您在各个网络域中监听节点端口,并确保不同网络域之间的端口不发生冲突,建议配置端口隔离。具体操作,请参见NodePort端口监听隔离

操作步骤

步骤一:部署示例应用

  1. 使用以下示例的YAML内容,创建名为nginx.yaml文件。

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx   
      labels:
        app: nginx
    spec:
      replicas: 2     
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80           
  2. 执行以下命令,部署示例应用。

    kubectl apply -f nginx.yaml
  3. 执行以下命令,查看示例状态。

    kubectl get deployment nginx

    预期输出:

    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    nginx      2/2     2            2           43s

步骤二:使用NodePort类型的Service

  1. 使用以下示例服务的YAML内容,创建nginx-svc.yaml的文件。

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: nginx
      name: nginx-svc
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:                # 其中spec.selector对应上文中nginx.yaml的spec.selector.matchLabels对应标签。
        app: nginx
      type: NodePort
  2. 执行以下命令,创建名为nginx-svc.yaml的Service,并且公开应用。

    kubectl apply -f nginx-svc.yaml
  3. 执行以下命令,确认NodePort类型的Service成功创建。

    kubectl get svc my-nginx-svc

    预期输出:

    NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)        AGE
    nginx-svc    NodePort    192.168.xxx.xxx   <none>        80:31309/TCP   3s
  4. 执行以下命令,访问示例应用。

    curl <Node-IP>:31309 # 请将<Node-IP>替换为您需要访问的节点地址。