通过 k8s Playground 上浏览器上的服务公开后无法访问 httpd 部署

问题描述 投票:0回答:1

使用labs.play-with-k8s.com。我创建了一个小型 k8s 集群:2 个工作节点,1 个主节点。

部署 4 个 Pod,运行 httpd 映像并通过服务公开。 我问 chatgpt 如何从外部浏览器访问 pod。它建议使用 port-forward cmd 或“kubectl proxy”。然而没有结果。

node2 是主节点,每个工作节点上运行 2 个 pod。

部署的容器端口为 77,服务的目标端口为 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  

服务属于节点端口类型,在节点端口 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从外部打入1个worker节点: 192.168.0.23 是工作节点的 IP,31399 是服务应该公开部署的节点端口

curl 192.168.0.23:31399

它给出:连接失败,连接被拒绝

我尝试了代理转发,但没有成功。

服务仅适用于标准 80 端口吗?

kubernetes deployment service minikube
1个回答
0
投票

通过在部署模板上定义

containerPort: 77
,您仅更改公开的容器端口,但您的 httpd 服务器仍将侦听端口 80(因为它是默认配置的)。

您需要更改

httpd listen
配置以匹配新的暴露端口。

如果您希望调整 httpd 默认配置,您需要使用 Listen 77 配置更新您的

httpd.conf

例如,如果您更喜欢仍然使用原始 httpd 映像的“单行解决方法”,您可以更改命令/参数以在每次启动时替换监听配置:

  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 http://<node-ip>:31399
<html><body><h1>It works!</h1></body></html>
© www.soinside.com 2019 - 2024. All rights reserved.