如何公开在我的 Amazon EKS 集群上运行的 Kubernetes 服务?
上次更新时间:2020 年 12 月 28 日
我想要公开在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上运行的 Kubernetes 服务。
简短描述
以下解决方案向您显示如何创建示例应用程序,然后将以下 Kubernetes ServiceTypes 应用至您的示例应用程序:ClusterIP、NodePort 和 LoadBalancer。
请记住以下内容:
- 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
注:ServiceType 为 NodePort。ClusterIP 自动创建产生,并从 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 目标。