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

上次更新时间:2020 年 12 月 28 日

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

简短描述

以下解决方案向您显示如何创建示例应用程序,然后将以下 Kubernetes ServiceTypes 应用至您的示例应用程序:ClusterIPNodePortLoadBalancer

请记住以下内容:

  • ClusterIP 在集群内部 IP 地址上公开服务。
  • NodePort 在静态端口每个节点的 IP 地址上公开服务。
  • LoadBalancer 使用负载均衡器在外部公开服务。

注意:Amazon EKS 通过 LoadBalancer 为运行在 Amazon Elastic Compute Cloud (Amazon EC2) 实例工作线程节点上的 pod 提供 Network Load Balancer 和 Classic Load Balancer 支持。您可以将均衡网络流量加载到 Network Load Balancer(实例或 IP 目标)或 Classic Load Balancer(仅限实例目标)。

解决方法

创建示例应用程序

1.    定义及应用部署文件。下方示例所示为创建一个可启动两个 nginx pod 的 ReplicaSet,然后创建名为 nginx-deployment.yaml 的文件。

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

创建 ClusterIP 服务

1.    创建名为 clusterip.yaml 的文件,然后将类型设置为 ClusterIP。例如:

cat <<EOF > clusterip.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    使用声明式或命令式命令在 Kubernetes 中创建 ClusterIP 对象。

要创建对象并应用 clusterip.yaml 文件,请运行以下声明式命令:

kubectl create -f clusterip.yaml

您将收到以下输出:

service/nginx-service created

-或者-

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

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

您将收到以下输出:

service "nginx-service" exposed

注意:exposed 命令将创建一项服务,而不是创建 YAML 文件。然而,kubectl 会将您的命令式命令转换为声明式 Kubernetes 部署对象。

3.    要访问应用程序并获取 ClusterIP 编号,请运行以下命令:

kubectl get service nginx-service

您将收到以下输出:

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-service   ClusterIP   172.20.65.130   <none>        80/TCP    15s

创建 NodePort 服务

1.    要创建 NodePort 服务,请创建一个名为 nodeport.yaml 的文件,然后将类型设置为 NodePort。例如:

cat <<EOF > nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    要删除 ClusterIP 服务并使用相同服务名称 (nginx-service) 创建一个 NodePort 服务,请运行以下命令:

kubectl delete service nginx-service

您将收到以下输出:

service "nginx-service" deleted

3.    使用声明式或命令式命令在 Kubernetes 中创建 NodePort 对象。

要创建对象并应用 nodeport.yaml 文件,请运行以下声明式命令:

kubectl create -f nodeport.yaml

-或者-

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

kubectl expose deployment nginx  --type=NodePort  --name=nginx-serviceservice "nginx-service" exposed

您将收到以下输出:

service/nginx-service created

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

kubectl get service/nginx-service

您将收到以下输出:

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   172.20.36.247   <none>        80:30648/TCP   11s

注:ServiceTypeNodePortClusterIP 自动创建产生,并从 NodePort 获取路由。NodePort 服务在端口 30648 上通过外部公开在可用工作线程节点上。

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

重要提示:从外部集群中访问 NodeIP:NodePort 之前,您必须启用节点的安全组以允许通过端口 30648 的传入流量。

创建 LoadBalancer 服务

1.    要创建 LoadBalancer 服务,请创建一个名为 loadbalancer.yaml 的文件,然后将类型设置为 LoadBalancer。例如:

cat <<EOF > loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    要删除 ClusterIP 服务并使用相同的服务名称 (nginx-service) 创建 LoadBalancer 服务,请运行以下命令:

kubectl delete service nginx-service

您将收到以下输出:

service "nginx-service" deleted

3.    要应用 loadbalancer.yaml 文件,请运行以下命令:

kubectl create -f loadbalancer.yaml

您将收到以下输出:

service/nginx-service created

-或者-

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

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

您将收到以下输出:

service "nginx-service" exposed

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

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

您将收到以下输出:

NAME           TYPE          EXTERNAL-IP                        PORT(S)
nginx-service  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP

5.    要验证您是否可以在外部访问负载均衡器,请运行以下命令:

curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title

您应该收到包含在 HTML 标题标签中的以下输出:"Welcome to nginx!"

注意:默认情况下,之前的 LoadBalancer 服务会创建 Classic Load Balancer。

要创建具有实例类型目标的 Network Load Balancer,请将以下注释添加到服务清单:

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

要创建具有 IP 目标的 Network Load Balancer,请参阅负载均衡器 — IP 目标


这篇文章对您有帮助吗?


您是否需要账单或技术支持?