我正在使用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 端口吗?
正如我提供的评论中提到的,此问题的唯一原因是游乐场提供的 IP 地址是私有 IP 地址,无法在游乐场集群之外访问这些地址。因此,如果您想通过浏览器访问示例应用程序,请尝试在任何云提供商或本地设备中创建虚拟机并复制集群,以便您可以通过浏览器访问应用程序。
通过在部署模板上定义
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 来访问该服务。