kubernetes 如何使用kubectl检查pod正在侦听哪个端口而不查看dockerFile?

rwqw0loc  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(6)|浏览(242)

我有一个pod正在运行,并希望端口转发,这样我就可以从内部网络访问该pod。我不知道它正在监听哪个端口,但还没有服务。
我这样描述吊舱:

$ kubectl describe pod queue-l7wck 
Name:         queue-l7wck
Namespace:    default
Priority:     0
Node:         minikube/192.168.64.3
Start Time:   Wed, 18 Dec 2019 05:13:56 +0200
Labels:       app=work-queue
              chapter=jobs
              component=queue
Annotations:  <none>
Status:       Running
IP:           172.17.0.2
IPs:
  IP:           172.17.0.2
Controlled By:  ReplicaSet/queue
Containers:
  queue:
    Container ID:   docker://13780475170fa2c0d8e616ba1a3b1554d31f404cc0a597877e790cbf01838e63
    Image:          gcr.io/kuar-demo/kuard-amd64:blue
    Image ID:       docker-pullable://gcr.io/kuar-demo/kuard-amd64@sha256:1ecc9fb2c871302fdb57a25e0c076311b7b352b0a9246d442940ca8fb4efe229
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 18 Dec 2019 05:14:02 +0200
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-mbn5b (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-mbn5b:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mbn5b
    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:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/queue-l7wck to minikube
  Normal  Pulling    31h        kubelet, minikube  Pulling image "gcr.io/kuar-demo/kuard-amd64:blue"
  Normal  Pulled     31h        kubelet, minikube  Successfully pulled image "gcr.io/kuar-demo/kuard-amd64:blue"
  Normal  Created    31h        kubelet, minikube  Created container queue
  Normal  Started    31h        kubelet, minikube  Started container queue

即使JSON也没有什么:

$ kubectl get pods queue-l7wck -o json
{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "creationTimestamp": "2019-12-18T03:13:56Z",
        "generateName": "queue-",
        "labels": {
            "app": "work-queue",
            "chapter": "jobs",
            "component": "queue"
        },
        "name": "queue-l7wck",
        "namespace": "default",
        "ownerReferences": [
            {
                "apiVersion": "apps/v1",
                "blockOwnerDeletion": true,
                "controller": true,
                "kind": "ReplicaSet",
                "name": "queue",
                "uid": "a9ec07f7-07a3-4462-9ac4-a72226f54556"
            }
        ],
        "resourceVersion": "375402",
        "selfLink": "/api/v1/namespaces/default/pods/queue-l7wck",
        "uid": "af43027d-8377-4227-b366-bcd4940b8709"
    },
    "spec": {
        "containers": [
            {
                "image": "gcr.io/kuar-demo/kuard-amd64:blue",
                "imagePullPolicy": "Always",
                "name": "queue",
                "resources": {},
                "terminationMessagePath": "/dev/termination-log",
                "terminationMessagePolicy": "File",
                "volumeMounts": [
                    {
                        "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
                        "name": "default-token-mbn5b",
                        "readOnly": true
                    }
                ]
            }
        ],
        "dnsPolicy": "ClusterFirst",
        "enableServiceLinks": true,
        "nodeName": "minikube",
        "priority": 0,
        "restartPolicy": "Always",
        "schedulerName": "default-scheduler",
        "securityContext": {},
        "serviceAccount": "default",
        "serviceAccountName": "default",
        "terminationGracePeriodSeconds": 30,
        "tolerations": [
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/not-ready",
                "operator": "Exists",
                "tolerationSeconds": 300
            },
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/unreachable",
                "operator": "Exists",
                "tolerationSeconds": 300
            }
        ],
        "volumes": [
            {
                "name": "default-token-mbn5b",
                "secret": {
                    "defaultMode": 420,
                    "secretName": "default-token-mbn5b"
                }
            }
        ]
    },
    "status": {
        "conditions": [
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2019-12-18T03:13:56Z",
                "status": "True",
                "type": "Initialized"
            },
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2019-12-18T03:14:02Z",
                "status": "True",
                "type": "Ready"
            },
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2019-12-18T03:14:02Z",
                "status": "True",
                "type": "ContainersReady"
            },
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2019-12-18T03:13:56Z",
                "status": "True",
                "type": "PodScheduled"
            }
        ],
        "containerStatuses": [
            {
                "containerID": "docker://13780475170fa2c0d8e616ba1a3b1554d31f404cc0a597877e790cbf01838e63",
                "image": "gcr.io/kuar-demo/kuard-amd64:blue",
                "imageID": "docker-pullable://gcr.io/kuar-demo/kuard-amd64@sha256:1ecc9fb2c871302fdb57a25e0c076311b7b352b0a9246d442940ca8fb4efe229",
                "lastState": {},
                "name": "queue",
                "ready": true,
                "restartCount": 0,
                "started": true,
                "state": {
                    "running": {
                        "startedAt": "2019-12-18T03:14:02Z"
                    }
                }
            }
        ],
        "hostIP": "192.168.64.3",
        "phase": "Running",
        "podIP": "172.17.0.2",
        "podIPs": [
            {
                "ip": "172.17.0.2"
            }
        ],
        "qosClass": "BestEffort",
        "startTime": "2019-12-18T03:13:56Z"
    }
}

如何使用kubectl检查pod正在侦听哪个端口?

更新

如果我ssh进入pod并按照评论中的建议运行netstat -tulpn,我会得到:

$ kubectl exec -it queue-pfmq2 -- sh
~ $ netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::8080                 :::*                    LISTEN      1/kuard

但这种方法并不使用kubectl

5kgi1eie

5kgi1eie1#

您 的 容器 映像 在 构建 期间 使用 Dockerfile 中 的 EXPOSE 命令 打开 了 一 个 端口 ( 在 您 的 情况 下 看 起来 像 端口 8080 ) 。 由于 暴露 的 端口 被 烘焙 到 映像 中 , k8s 不 需要 采取 步骤 来 打开 它 , 因此 k8s 不会 跟踪 这个 打开 的 端口 。
由于 k8s 不 负责 打开 端口 , 因此 您 将 无法 使用 kubectl 或 检查 pod YAML 找到 侦听 端口

20jt8wwn

20jt8wwn2#

尝试组合使用kubectl和Linux命令,以获取容器侦听的端口

kubectl exec <pod name here> -- netstat -tulpn

此外,如果需要,您可以使用grep将此结果传送到管道,以缩小查找范围,例如

kubectl exec <pod name here> -- netstat -tulpn | grep "search string"

注意:只有当您的容器的基本映像支持netstat命令时,它才起作用。并且根据您的Update部分,它似乎也支持。上面的解决方案只是巧妙地使用了您在两个部分中使用的命令,首先在交互模式下使用exec容器,其次在容器中使用-it列出侦听端口。

i7uq4tfw

i7uq4tfw3#

一个答案建议在容器内运行netstat,这只在netstat是容器映像的一部分时有效。
或者,您可以在容器的网络名称空间中执行netstat的主机上运行它。
在主机上获取容器的进程ID(这是在容器内运行的应用程序),然后更改为容器的网络名称空间(在主机上运行为root):

host# PS1='container# ' nsenter -t <PID> -n

修改PS1环境变量用于在容器的网络名称空间中显示不同的提示。
获取容器中的侦听端口:

container# netstat -na
....
container# exit
ljsrvy3e

ljsrvy3e4#

如果创建图像的人添加了正确的Openshift标签,那么您可以使用以下命令(不幸的是,您的图像没有标签):

skopeo inspect docker://image-url:tag | grep expose-service

例如:

skopeo inspect docker://quay.io/redhattraining/loadtest:v1.0 | grep expose-service

输出:

"io.openshift.expose-services": "8080:http"

因此,8080是图像显示的端口
希望这对你有帮助

gkn4icbw

gkn4icbw5#

kubectl获取单元PODNAME --template ='{{(索引(索引.规格.容器0).端口0).容器端口}}{{"\n”}}'

wfauudbj

wfauudbj6#

通常情况下,一个容器可以运行curl,所以你可以用curl来检查一个端口是否打开。

for port in 8080 50000 443 8443;do curl -I - connect-timeout 1 127.0.0.1:$port;done

可以使用sh来运行此命令。

相关问题