kubernetes 在k8s playground上通过浏览器上的服务暴露后,无法访问httpd部署

14ifxucb  于 11个月前  发布在  Kubernetes
关注(0)|答案(2)|浏览(137)

使用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的数据

goucqfw6

goucqfw61#

正如我提供的评论中提到的,这个问题的唯一原因是操场提供的IP地址是私有IP地址,这些地址不能在操场集群之外访问。所以,如果你想通过浏览器访问你的示例应用程序,请尝试在任何云提供商或本地设备中创建VM,并复制集群,以便你可以通过浏览器访问应用程序。

bq8i3lrv

bq8i3lrv2#

通过在部署模板上定义containerPort: 77,您只更改了暴露的容器端口,但您的httpd服务器仍将侦听端口80(默认配置)。
您需要更改httpd listen配置以匹配新的公开端口。
如果您希望调整httpd的默认配置,则需要使用Listen 77配置更新httpd.conf
例如,如果你喜欢一个“单行工作区”仍然使用原始的httpd镜像,你可以改变命令/args来替换每次启动时的listen配置:

containers:
  - image: httpd
    name: httpd
    command: ["/bin/sh","-c"]
    args: ["sed -i 's/Listen 80/Listen 77/g' /usr/local/apache2/conf/httpd.conf && exec /usr/local/apache2/bin/httpd -DFOREGROUND"]
    ports:
    - containerPort: 77

字符串
然后你可以使用你的k8snode的IP进行 curl :

$ curl http://<node-ip>:31399
<html><body><h1>It works!</h1></body></html>

  • kubectl proxy命令在本地机器上启动代理服务器,并允许您通过此代理访问Kubernetes API服务器和服务。
  • kubectl port-forward service/d-service 8080:80会将本地端口8080转发到集群内d-service上的端口80。您可以在终端而不是浏览器中导航到http://localhost:8080来访问该服务。

相关问题