我在看一本书,他们有一个应用程序的配置
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
x
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
的一个字符串
我不知道为什么会失败。据我所知,当你执行kubectl port-forward service/demo 9999:4269
时,它会通过服务上的端口4269将我的本地端口9999转发到pod 9278中的端口。
我已经试过很多次了,结果都是一样的。当我把所有东西都切换回8888的那一刻,一切都很好。
1条答案
按热度按时间plicqrtu1#
在YAML规范中,
字符串
表示使用
coludnatived/demo:hello
并将8888端口公开为部署。请参阅https://kubernetes.io/docs/tutorials/services/connect-applications-service/#exposing-pods-to-the-cluster请注意,容器没有使用节点上的端口80,也没有任何特殊的NAT规则将流量路由到Pod。这意味着您可以在同一个节点上运行多个nginx Pod,所有这些Pod都使用同一个containerPort,并使用为Pod分配的IP地址从集群中的任何其他Pod或节点访问它们。
在您的示例中,您使用副本和三个容器,暴露9278端口负载均衡器(在您的情况下服务)可以触及它。这并不意味着您的应用程序映像侦听9278。
但讽刺的是,在文档(https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#container-v1-core)中,
连接埠:要从容器中公开的端口列表。此处未指定端口并不阻止公开该端口。可以0.0.0.0从网络访问容器内侦听默认“www.example.com“地址的任何端口。使用战略合并修补程序修改此阵列可能会损坏数据。有关详细信息,请参阅https://github.com/kubernetes/kubernetes/issues/108255。无法更新。
我怎么能澄清这一点,我想展示一些例子与下面的9278选项。运行这个CLI。
型
即使你的部署容器端口设置为9278,但pod也可以用8888访问和访问。