在 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 资源。