转发端口时出现以下错误。有人可以帮忙吗?
mjafary$ sudo kubectl port-forward sa-frontend 88:82
Forwarding from 127.0.0.1:88 -> 82
Forwarding from [::1]:88 -> 82
错误日志:
Handling connection for 88
Handling connection for 88
E1214 01:25:48.704335 51463 portforward.go:331] an error occurred forwarding 88 -> 82: error forwarding port 82 to pod a017a46573bbc065902b600f0767d3b366c5dcfe6782c3c31d2652b4c2b76941, uid : exit status 1: 2018/12/14 08:25:48 socat[19382] E connect(5, AF=2 127.0.0.1:82, 16): Connection refused
这是吊舱的描述。我的期望是,当我在浏览器中命中localhost:88时,请求应转发到jafary / sentiment-analysis-frontend容器,并且应加载应用程序页面
mjafary$ kubectl describe pods sa-frontend
Name: sa-frontend
Namespace: default
Node: minikube/192.168.64.2
Start Time: Fri, 14 Dec 2018 00:51:28 -0700
Labels: app=sa-frontend
Annotations: <none>
Status: Running
IP: 172.17.0.23
Containers:
sa-frontend:
Container ID: docker://a87e614545e617be104061e88493b337d71d07109b0244b2b40002b2f5230967
Image: jafary/sentiment-analysis-frontend
Image ID: docker-pullable://jafary/sentiment-analysis-frontend@sha256:5ac784b51eb5507e88d8e2c11e5e064060871464e2c6d467c5b61692577aeeb1
Port: 82/TCP
Host Port: 0/TCP
State: Running
Started: Fri, 14 Dec 2018 00:51:30 -0700
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-mc5cn (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-mc5cn:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-mc5cn
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>
答案 0 :(得分:9)
拒绝连接的原因是,没有进程在端口82上侦听。用于创建nginx映像的dockerfile公开了端口80,并且在pod规范中,您还公开了端口82。但是,nginx配置为在端口80上监听。
这意味着您的Pod有两个公开的端口:80和82。但是,nginx应用程序正在主动侦听端口80,因此只有对端口80的请求才起作用。
要使用82端口进行设置,您需要更改nginx配置文件,使其监听端口82而不是80端口。您可以通过创建自己的Docker映像并在映像中内置更改来实现此目的,或者您可以使用configMap将默认的配置文件替换为所需的设置
答案 1 :(得分:3)
正如@Patric W 所说,连接被拒绝,因为没有进程侦听端口 82。该端口尚未公开。
现在,要获取 pod 正在侦听的端口,您可以运行命令
注意:务必将<>中的任何值更改为实际值。
kubectl get po -n <namespace>
中的pods名称kubectl get pod <pod-name> -n <namespace> --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
现在使用上面生成的公开端口来运行带有命令的端口转发
kubectl port-forward pod/<pod-name> <local-port>:<exposed-port>
其中 local-port
是从浏览器访问容器的端口 ..localhost:<local-port>
而 exposed-port
是容器侦听的端口。通常使用 Dockerfile 中的 EXPOSE
命令定义
获取更多信息here