使用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 端口吗?
通过在部署模板上定义
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>