如何使用 ec2 公共 IP 从外部访问“NodePort”类型的 kubernetes 服务

如何使用 ec2 公共 IP 从外部访问“NodePort”类型的 kubernetes 服务

在 ec2 上,运行单节点 k8s 集群。在该节点上,运行一个类型为“NodePort”的服务,其公开端口为“31380”。

我需要通过端口 80 从外部访问此服务。

  apiVersion: v1
  kind: Service
  metadata:
    name: demo-nginx
    labels:
      run: demo-nginx
  spec:
    ports:
    - port: 80
      protocol: TCP
    selector:
      run: demo-nginx
    type: **NodePort**

从 ec2 公共 IP 访问需要哪些额外的配置,例如成功的“curl ec2publicIp:80”或通过浏览器?

> ~$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
demo-nginx   NodePort    10.107.6.8   <none>        80:31380/TCP   17m
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        23m

注#1)我能够使用私有IP从节点内部访问该服务。

卷曲 172.31.8.98:31380

注意#2)我尝试了 IPtable 规则的组合,例如:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.31.8.98:31380
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

注#3)我的 ec2 安全组和规则配置为允许 http 流量。

注#4)我已经更新了我的 EC2 实例上的 IP 转发。

注#5)k8s服务公开了一个简单的nginx部署。

> $ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
demo-nginx   1/1     1            1           43m

任何关于这个问题的见解都将受到高度赞赏。

NB:我已经搜索了很多内容但找不到解决方案。

答案1

如果你正在寻找向外部(集群外部)公开 Kubernetes 服务的解决方案,那么 Kubernetes入口资源将是实现这一目标的最佳选择。Ingress,专门用于提供从集群外部到嵌套的 Kubernetes 服务的 HTTP 和 HTTPS 路由功能。

当您考虑使用时Ingress,安装前的第一步ingress controller是选择合适的入口提供商,它应该满足特定的云平台要求。

对于 AWS,我建议使用,NGINX Ingress Controller因为它天真地提供了 L4 或 L7 级别紧急负载平衡,您可以找到有关ingress-nginx实施的更多信息这里

如果你使用过警察要构建集群,请查看ingress-nginx安装这里

我还建议检查AWS ALB 入口控制器适用于 Kubernetes。

答案2

尝试使用kubectl port-forward

在单独的终端中尝试此命令:kubectl port-forward pod/demo-nginx 9998:80然后尝试执行curl localhost:80。如果您想在后台运行此命令,只需&在命令末尾添加 。

请注意,这只能在您的计算机上运行。如果您想将其公开,我建议您考虑使用 LoadBalancer 类型的服务或某种 Ingress 资源。

相关内容