提问人:Vishal Balaji 提问时间:11/17/2023 更新时间:11/17/2023 访问量:65
更改端口号时,kubectl port-forward 失败
kubectl port-forward fails when I change the port numbers
问:
我正在关注一本书,他们有一个应用程序的配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
labels:
app: demo
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: cloudnatived/demo:hello
ports:
- containerPort: 8888
---
apiVersion: v1
kind: Service
metadata:
name: demo
labels:
app: demo
spec:
# NOTE: depending on which version of the book you have, this may say port 9999. The latest version of the book uses 8888 to match the pod.
ports:
- port: 8888
protocol: TCP
targetPort: 8888
selector:
app: demo
type: ClusterIP
这工作正常。
kubectl port-forward service/demo 9999:8888
>>> Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888
Handling connection for 9999
curl localhost:9999/info
>>> Hello, 世界
但是,如果我更改容器端口,它就不起作用了。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
labels:
app: demo
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: cloudnatived/demo:hello
ports:
- containerPort: 9278
---
apiVersion: v1
kind: Service
metadata:
name: demo
labels:
app: demo
spec:
# NOTE: depending on which version of the book you have, this may say port 9999. The latest version of the book uses 8888 to match the pod.
ports:
- port: 4269
protocol: TCP
targetPort: 9278
selector:
app: demo
type: ClusterIP
kubectl port-forward service/demo 9999:4269
>>> Forwarding from 127.0.0.1:9999 -> 9278
Forwarding from [::1]:9999 -> 9278
Handling connection for 9999
E1117 15:59:19.151771 38005 portforward.go:409] an error occurred forwarding 9999 -> 9278: error forwarding port 9278 to pod 0c928b279bf1932972fc6724a22d8dac57ebb89696569269868959a342072b24, uid : container not running (0c928b279bf1932972fc6724a22d8dac57ebb89696569269868959a342072b24)
error: lost connection to pod
curl localhost:9999/info
>>> curl: (52) Empty reply from server
我不确定为什么这会失败。据我了解,当您这样做时,它会通过服务上的端口 9999 将我的本地端口 9279 转发到 pod 9278 中的端口。kubectl port-forward service/demo 9999:4269
我已经尝试了多次,结果相同。当我将所有内容切换回 8888 的那一刻,一切正常。
答:
在 YAML 规范中,
image: cloudnatived/demo:hello
ports:
- containerPort: 8888
表示您使用并公开 8888 端口作为部署。查看 https://kubernetes.io/docs/tutorials/services/connect-applications-service/#exposing-pods-to-the-clustercoludnatived/demo:hello
请注意,容器没有使用节点上的端口 80,也没有任何特殊的 NAT 规则将流量路由到 Pod。这意味着您可以在同一节点上运行多个 nginx pod,所有 pod 都使用相同的 containerPort,并使用为 pod 分配的 IP 地址从集群中的任何其他 pod 或节点访问它们。
在您的示例中,您使用副本和三个容器,暴露 9278 端口负载均衡器(在您的示例中为 Service)可以触及它。 这并不意味着您的应用程序映像正在监听 9278。
但具有讽刺意味的是,在 docs(https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#container-v1-core)
ports:要从容器公开的端口列表。此处未指定端口不会阻止该端口被公开。任何侦听容器内默认“0.0.0.0”地址的端口都可以从网络访问。使用战略合并修补程序修改此数组可能会损坏数据。有关详细信息,请参阅 https://github.com/kubernetes/kubernetes/issues/108255。无法更新。
我该如何澄清这一点,我想展示一些带有以下 9278 选项的示例。 运行此 CLI。
kubectl get pods
--- pods showed ---
kubectl port-forward [anypod] 9999:8888
即使您的部署容器端口设置为 9278,但 Pod 可以使用 8888 访问和访问。
评论
kubectl apply -f k8s/app.yaml
kubectl describe pod/POD_NAME
Port: 9278/TCP
kubectl describe service/SERVICE_NAME
Port: <unset> 4269/TCP
TargetPort: 9278/TCP
评论
containerPort: 9278
containerPort:
kubectl apply -f k8s/app.yaml
kubectl describe pod/POD_NAME
Port: 9278/TCP
kubectl describe service/SERVICE_NAME
Port: <unset> 4269/TCP
TargetPort: 9278/TCP
containerPort: 9278