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

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

我正在使用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
2个回答
1
投票

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


1
投票

通过在部署模板上定义

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>
  • kubectl proxy
    命令会在本地计算机上启动代理服务器,并允许您通过此代理访问 Kubernetes API 服务器和服务。

  • kubectl port-forward service/d-service 8080:80
    会将本地端口 8080 转发到集群内 d-service 上的端口 80。您将能够通过在终端而不是浏览器中导航到 http://localhost:8080 来访问该服务。

© www.soinside.com 2019 - 2024. All rights reserved.