如何公开在我的 Amazon EKS 集群上运行的 Kubernetes 服务?
我想公开在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上运行的 Kubernetes 服务。
解决方法
要公开在您的集群上运行的 Kubernetes 服务,请先创建一个示例应用程序。然后,将 ClusterIP、NodePort 或 LoadBalancer Kubernetes 服务类型应用于示例应用程序。有关详细信息,请参阅 Kubernetes 网站上的服务类型。
创建示例应用程序
完成以下步骤:
-
在 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
-
要创建部署,请运行以下命令:
kubectl apply -f nginx-deployment.yaml
-
要验证您的容器组 (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 服务类型
完成以下步骤:
-
创建一个名为 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
-
使用声明式命令或命令式命令在 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
-
要获取 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
-
要使用 CLUSTER-IP 地址访问应用程序,请运行以下命令:
curl -silent 10.100.12.153:80 | grep title
**注意:**要访问服务,您必须登录到 Worker 节点或位于容器组 (pod) 的容器中。
-
要删除 ClusterIP 服务,请运行以下命令:
kubectl delete service nginx-service-cluster-ip
输出示例:
service "nginx-service-cluster-ip" deleted
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
-
使用声明式命令或命令式命令在 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
-
要获取有关 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 之前,请将节点的安全组设置为允许传入流量通过输出中列出的端口。
-
对于位于公有子网中且可通过互联网访问的节点,请检查该节点的公有 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
-
要使用节点 IP 和 NodePort 访问应用程序,请运行以下命令:
curl -silent <Public/PrivateNodeIP>:30994 | grep title
-
要删除 NodePort 服务,请运行以下命令:
kubectl delete service nginx-service-nodeport
输出示例:
service "nginx-service-nodeport" deleted
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
-
要应用 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
-
要获取有关 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
-
要验证您是否可以从外部访问负载均衡器,请运行以下命令:
curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
-
要删除 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 官方已更新 2 年前
- AWS 官方已更新 9 个月前
- AWS 官方已更新 3 年前