使用labs.play-with-k8s.com。我创建了一个小型的k8s集群:2个工作节点,1个主节点。
部署4个pods,httpd镜像运行并通过服务暴露。我问chatgpt如何从外部浏览器访问pods。它建议port-foward cmd或'kubectl proxy'。然而没有结果。
node 2是主节点,每个工作节点上运行2个pod。
deployment的containerPort为77,service的targetport为77,它们确实匹配。我选择它为非默认值80,这样我就可以检查使用另一个端口是否有效,服务是否通过非标准端口正确暴露部署。
部署yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: d
name: d
spec:
replicas: 2
selector:
matchLabels:
app: d
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: d
spec:
containers:
- image: httpd
name: httpd
ports:
- containerPort: 77
字符串
服务的类型为node port,暴露在nodeport 31399上。
apiVersion: v1
kind: Service
metadata:
name: d-service
spec:
selector:
app: d
ports:
- protocol: TCP
port: 80
targetPort: 77
nodePort: 31399
type: NodePort
型
然后我试图从外部用curl命中1worker节点:192.168.0.23是一个worker节点的ip,31399是服务应该公开部署的nodeport
curl 192.168.0.23:31399
型
它给出:连接失败,连接被拒绝
我尝试了代理转发,但它不起作用。
服务是否仅适用于标准80端口?
x1c 0d1x的数据
2条答案
按热度按时间goucqfw61#
正如我提供的评论中提到的,这个问题的唯一原因是操场提供的IP地址是私有IP地址,这些地址不能在操场集群之外访问。所以,如果你想通过浏览器访问你的示例应用程序,请尝试在任何云提供商或本地设备中创建VM,并复制集群,以便你可以通过浏览器访问应用程序。
bq8i3lrv2#
通过在部署模板上定义
containerPort: 77
,您只更改了暴露的容器端口,但您的httpd服务器仍将侦听端口80(默认配置)。您需要更改
httpd listen
配置以匹配新的公开端口。如果您希望调整httpd的默认配置,则需要使用
Listen 77
配置更新httpd.conf。例如,如果你喜欢一个“单行工作区”仍然使用原始的httpd镜像,你可以改变命令/args来替换每次启动时的listen配置:
字符串
然后你可以使用你的k8snode的IP进行 curl :
型
kubectl proxy
命令在本地机器上启动代理服务器,并允许您通过此代理访问Kubernetes API服务器和服务。kubectl port-forward service/d-service 8080:80
会将本地端口8080转发到集群内d-service上的端口80。您可以在终端而不是浏览器中导航到http://localhost:8080来访问该服务。