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

上次更新日期:2021 年 4 月 21 日

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

简短描述

要公开在集群上运行的 Kubernetes 服务,请创建示例应用程序。然后,将 ClusterIPNodePortLoadBalancer Kubernetes ServiceTypes 应用于您的示例应用程序。

请记住以下内容:

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

注意:Amazon EKS 为运行在 Amazon Elastic Compute Cloud (Amazon EC2) 实例工作线程节点上的 pod 提供 Network Load Balancer 和 Classic Load Balancer 支持。Amazon EKS 通过使用 LoadBalancer 提供此支持。您可以将均衡网络流量加载到 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-cluster-ip
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-cluster-ip created

-或者-

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

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

输出:

service "nginx-service-cluster-ip" exposed

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

3.    访问应用程序并获取 ClusterIP 编号:

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

4.    删除 ClusterIP 服务:

kubectl delete service nginx-service-cluster-ip

输出:

service "nginx-service-cluster-ip" deleted

创建 NodePort 服务

1.    要创建 NodePort 服务,请创建一个名为 nodeport.yaml 的文件,然后将类型设置为 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

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

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

kubectl create -f nodeport.yaml

-或者-

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

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

输出:

service/nginx-service-nodeport exposed

3.    获取与 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

重要提示:ServiceType 是为服务自动创建的 NodePortClusterIP。上述命令的输出显示 NodePort 服务在可用工作线程节点的 EC2 实例的端口 (30994) 上外部公开。从集群外部访问 NodeIP:NodePort 之前,您必须设置节点的安全组以允许传入流量。您可以允许通过上述 kubectl get service 命令输出中列出的端口 (30994) 的传入流量。

4.    如果节点位于公共子网中并且可通过 Inernet 访问,请检查节点的公共 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

-或者-

如果节点位于私有子网中并且仅可在内部或者通过 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

5.     删除 NodePort 服务:

kubectl delete service nginx-service-nodeport

输出:

service "nginx-service-nodeport" deleted

创建 LoadBalancer 服务

1.    要创建 LoadBalancer 服务,请创建一个名为 loadbalancer.yaml 的文件,然后将类型设置为 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

2.    应用 loadbalancer.yaml 文件:

kubectl create -f loadbalancer.yaml

输出:

service/nginx-service-loadbalancer created

-或者-

公开 LoadBalancer 类型的部署:

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

输出:

service "nginx-service-loadbalancer" exposed

3.    获取与 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

4.    验证您是否可以在外部访问负载均衡器:

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

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

5.    删除 LoadBalancer 服务:

kubectl delete service nginx-service-loadbalancer

输出:

service "nginx-service-loadbalancer" deleted

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

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

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

-或者-

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


这篇文章对您有帮助吗?


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