如何公开在我的 Amazon EKS 集群上运行的 Kubernetes 服务?

4 分钟阅读
0

我想公开在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上运行的 Kubernetes 服务。

解决方法

要公开在您的集群上运行的 Kubernetes 服务,请先创建一个示例应用程序。然后,将 ClusterIPNodePortLoadBalancer Kubernetes 服务类型应用于示例应用程序。有关详细信息,请参阅 Kubernetes 网站上的服务类型

创建示例应用程序

完成以下步骤:

  1. 在 Kubernetes 中定义并应用部署文件。以下示例命令创建一个名为 nginx-deployment.yaml 的文件,然后创建一个可启动两个 nginx 容器组 (pod) 的 ReplicaSet

    cat <<EOF > nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    EOF
  2. 要创建部署,请运行以下命令:

    kubectl apply -f nginx-deployment.yaml
  3. 要验证您的容器组 (pod) 是否正在运行且拥有自己的内部 IP 地址,请运行以下命令:

    kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t

    输出示例:

    NAME                               STATUS   IP
    nginx-deployment-574b87c764-hcxdg  Running  192.168.20.8
    nginx-deployment-574b87c764-xsn9s  Running  192.168.53.240

应用服务类型

确定要如何公开应用程序,然后应用相应的服务类型。有关每种服务类型的信息,请参阅 Kubernetes 网站上的类型: clusterIP类型: NodePort 以及类型: LoadBalancer

ClusterIP 服务类型

完成以下步骤:

  1. 创建一个名为 clusterip.yaml 的文件。

  2. 类型设置为 ClusterIP,如以下示例中所示:

    cat <<EOF > clusterip.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-cluster-ip
    spec:
      type: ClusterIP
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. 使用声明式命令或命令式命令在 Kubernetes 中创建 ClusterIP 对象。
    要创建对象并应用 clusterip.yaml 文件,请运行以下声明式命令:

    kubectl create -f clusterip.yaml

    输出示例:

    service/nginx-service-cluster-ip created>/code>

    -or-

    要公开 ClusterIP 类型的部署,请运行以下命令式命令:

    kubectl expose deployment nginx-deployment  --type=ClusterIP  --name=nginx-service-cluster-ip

    **注意:**expose 命令将创建一个服务,但不会创建 YAML 文件。但是,kubectl 会将您的命令式命令转换为 Kubernetes 声明式部署对象。
    输出示例:

    service "nginx-service-cluster-ip" exposed
  4. 要获取 CLUSTER-IP 地址,请运行以下命令:

    kubectl get service nginx-service-cluster-ip

    输出示例:

    NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s
  5. 要使用 CLUSTER-IP 地址访问应用程序,请运行以下命令:

    curl -silent 10.100.12.153:80 | grep title

    **注意:**要访问服务,您必须登录到 Worker 节点或位于容器组 (pod) 的容器中。

  6. 要删除 ClusterIP 服务,请运行以下命令:

    kubectl delete service nginx-service-cluster-ip

    输出示例:

    service "nginx-service-cluster-ip" deleted

NodePort 服务类型

完成以下步骤:

  1. 创建一个名为 nodeport.yaml 的文件。

  2. 类型设置为 NodePort,如以下示例中所示:

    cat <<EOF > nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:  name: nginx-service-nodeport
    spec:
      type: NodePort
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. 使用声明式命令或命令式命令在 Kubernetes 中创建 NodePort 对象。
    要创建对象并应用 nodeport.yaml 文件,请运行以下声明式命令:

    kubectl create -f nodeport.yaml

    -or-

    要公开 NodePort 类型的部署,请运行以下命令式命令:

    kubectl expose deployment nginx-deployment  --type=NodePort  --name=nginx-service-nodeport

    输出示例:

    service/nginx-service-nodeport exposed
  4. 要获取有关 nginx-service 的信息,请运行以下命令:

    kubectl get service/nginx-service-nodeport

    输出示例:

    NAME                     TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    nginx-service-nodeport   NodePort   10.100.106.151   <none>        80:30994/TCP   27s

    **重要事项:**NodePort 将创建一个可在集群内访问的服务 IP 地址,并使用指定端口公开每个节点上的服务。以上命令的输出显示,NodePort 服务类型在可用 Worker 节点的 Amazon Elastic Compute Cloud (Amazon EC2) 实例的端口上对外部公开。在从集群外部访问 NodeIP:NodePort 之前,请将节点的安全组设置为允许传入流量通过输出中列出的端口。

  5. 对于位于公有子网中且可通过互联网访问的节点,请检查该节点的公有 IP 地址:

    kubectl get nodes -o wide |  awk {'print $1" " $2 " " $7'} | column -t

    输出示例:

    NAME                                      STATUS  EXTERNAL-IP
    ip-10-0-3-226.eu-west-1.compute.internal  Ready   1.1.1.1
    ip-10-1-3-107.eu-west-1.compute.internal  Ready   2.2.2.2

    -or-

    对于位于私有子网中且只能通过虚拟私有云 (VPC) 访问的节点,请检查该节点的私有 IP 地址:

    kubectl get nodes -o wide |  awk {'print $1" " $2 " " $6'} | column -t

    输出示例:

    NAME                                      STATUS  INTERNAL-IP
    ip-10-0-3-226.eu-west-1.compute.internal  Ready   10.0.3.226
    ip-10-1-3-107.eu-west-1.compute.internal  Ready   10.1.3.107
  6. 要使用节点 IPNodePort 访问应用程序,请运行以下命令:

    curl -silent <Public/PrivateNodeIP>:30994 | grep title
  7. 要删除 NodePort 服务,请运行以下命令:

    kubectl delete service nginx-service-nodeport

    输出示例:

    service "nginx-service-nodeport" deleted

LoadBalancer 服务类型

完成以下步骤:

  1. 创建一个名为 loadbalancer.yaml 的文件。

  2. 类型设置为 LoadBalancer,如以下示例中所示:

    cat <<EOF > loadbalancer.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-loadbalancer
    spec:
      type: LoadBalancer
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. 要应用 loadbalancer.yaml 文件,请运行以下命令:

    kubectl create -f loadbalancer.yaml

    输出示例:

    service/nginx-service-loadbalancer created

    -or-

    要公开 LoadBalancer 类型的部署,请运行以下命令:

    kubectl expose deployment nginx-deployment  --type=LoadBalancer  --name=nginx-service-loadbalancer

    输出示例:

    service "nginx-service-loadbalancer" exposed
  4. 要获取有关 nginx-service 的信息,请运行以下命令:

    kubectl get service/nginx-service-loadbalancer |  awk {'print $1" " $2 " " $4 " " $5'} | column -t

    输出示例:

    NAME                        TYPE          EXTERNAL-IP                        PORT(S)
    nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP
  5. 要验证您是否可以从外部访问负载均衡器,请运行以下命令:

    curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
  6. 要删除 LoadBalancer 服务,请运行以下命令:

    kubectl delete service nginx-service-loadbalancer

    输出示例:

    service "nginx-service-loadbalancer" deleted

**注意:**默认情况下,LoadBalancer 服务类型会创建经典负载均衡器。

要创建使用实例类型目标的网络负载均衡器,请在服务清单中添加以下注释:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

-or-

要创建使用 IP 目标的网络负载均衡器,请部署 AWS 负载均衡器控制器,然后创建使用 IP 目标的负载均衡器

AWS 官方
AWS 官方已更新 5 个月前