如何公开在 Amazon EKS 集群上运行的 Kubernetes 服务?
我想要公开在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上运行的 Kubernetes 服务。
简短描述
要公开集群上运行的 Kubernetes 服务,首先请创建一个示例应用程序。然后,将 ClusterIP、NodePort 和 LoadBalancer Kubernetes ServiceTypes 应用于您的示例应用程序。
请记住以下细节:
- ClusterIP 在集群内部 IP 地址上公开服务。
- NodePort 在静态端口每个节点的 IP 地址上公开服务。
- LoadBalancer 使用负载均衡器在外部公开服务。
**注意:**Amazon EKS 为运行在 Amazon Elastic Compute Cloud (Amazon EC2) 实例工作线程上的容器组(pod)提供网络负载均衡器和 经典负载均衡器支持。Amazon EKS 通过使用 LoadBalancer 提供此支持。您可以将均衡网络流量加载到网络负载均衡器(实例或 IP 目标)或经典负载均衡器(仅限实例目标)。
解决方法
创建示例应用程序
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 是为服务自动创建的 NodePort 和 ClusterIP。上述命令的输出显示 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. 要创建具有实例类型目标的网络负载均衡器,请将以下注释添加到服务清单:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
-或者-
若要使用 IP 目标创建网络负载均衡器,请部署 AWS 负载均衡器控制器,然后创建使用 IP 目标的负载均衡器。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前