【问题标题】:Kubernetes API server , serving pod logsKubernetes API 服务器,提供 pod 日志
【发布时间】:2018-10-19 22:45:08
【问题描述】:

对 Kubernetes API 服务器的 REST API 请求,GET , POST , PUT 等都是请求,响应,简单易懂,例如 kubectl create <something>。我想知道当我执行kubectl logs -f <pod-name>(以及类似kubectl attach <pod>之类的操作)时API服务器如何为pod日志提供服务,它只是循环中对GET的http响应吗?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    是的,当查看logs.go 的源时,它看起来目前只是kubectl 正在使用的HTTP GET,尽管似乎需要unify and upgrade 几个命令(execport-forwardlogs 等)到 WebSockets。

    展示 Maciej 的出色建议:

    $ kubectl run test --image centos:7 \
                          -- sh -c "while true ; do echo Work ; sleep 2 ; done"
    $ kubectl get po
    NAME                    READY   STATUS    RESTARTS   AGE
    test-769f6f8c9f-2nx7m   1/1     Running   0          2m
    
    $ kubectl logs -v9  -f test-769f6f8c9f-2nx7m
    I1019 13:49:34.282007   71247 loader.go:359] Config loaded from file /Users/mhausenblas/.kube/config
    I1019 13:49:34.284698   71247 loader.go:359] Config loaded from file /Users/mhausenblas/.kube/config
    I1019 13:49:34.292620   71247 loader.go:359] Config loaded from file /Users/mhausenblas/.kube/config
    I1019 13:49:34.293136   71247 round_trippers.go:386] curl -k -v -XGET  -H "Accept: application/json, */*" -H "User-Agent: kubectl/v1.12.0 (darwin/amd64) kubernetes/0ed3388" 'https://192.168.64.13:8443/api/v1/namespaces/default/pods/test-769f6f8c9f-2nx7m'
    I1019 13:49:34.305016   71247 round_trippers.go:405] GET https://192.168.64.13:8443/api/v1/namespaces/default/pods/test-769f6f8c9f-2nx7m 200 OK in 11 milliseconds
    I1019 13:49:34.305039   71247 round_trippers.go:411] Response Headers:
    I1019 13:49:34.305047   71247 round_trippers.go:414]     Date: Fri, 19 Oct 2018 12:49:34 GMT
    I1019 13:49:34.305054   71247 round_trippers.go:414]     Content-Type: application/json
    I1019 13:49:34.305062   71247 round_trippers.go:414]     Content-Length: 2390
    I1019 13:49:34.305125   71247 request.go:942] Response Body: {"kind":"Pod","apiVersion":"v1","metadata":{"name":"test-769f6f8c9f-2nx7m","generateName":"test-769f6f8c9f-","namespace":"default","selfLink":"/api/v1/namespaces/default/pods/test-769f6f8c9f-2nx7m","uid":"0581b0fa-d39d-11e8-9827-42a64713caf8","resourceVersion":"892912","creationTimestamp":"2018-10-19T12:46:39Z","labels":{"pod-template-hash":"3259294759","run":"test"},"ownerReferences":[{"apiVersion":"apps/v1","kind":"ReplicaSet","name":"test-769f6f8c9f","uid":"057f3ad4-d39d-11e8-9827-42a64713caf8","controller":true,"blockOwnerDeletion":true}]},"spec":{"volumes":[{"name":"default-token-fbx4m","secret":{"secretName":"default-token-fbx4m","defaultMode":420}}],"containers":[{"name":"test","image":"centos:7","args":["sh","-c","while true ; do echo Work ; sleep 2 ; done"],"resources":{},"volumeMounts":[{"name":"default-token-fbx4m","readOnly":true,"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount"}],"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"IfNotPresent"}],"restartPolicy":"Always","terminationGracePeriodSeconds":30,"dnsPolicy":"ClusterFirst","serviceAccountName":"default","serviceAccount":"default","nodeName":"minikube","securityContext":{},"schedulerName":"default-scheduler","tolerations":[{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}]},"status":{"phase":"Running","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2018-10-19T12:46:39Z"},{"type":"Ready","status":"True","lastProbeTime":null,"lastTransitionTime":"2018-10-19T12:46:40Z"},{"type":"ContainersReady","status":"True","lastProbeTime":null,"lastTransitionTime":null},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2018-10-19T12:46:39Z"}],"hostIP":"192.168.64.13","podIP":"172.17.0.11","startTime":"2018-10-19T12:46:39Z","containerStatuses":[{"name":"test","state":{"running":{"startedAt":"2018-10-19T12:46:39Z"}},"lastState":{},"ready":true,"restartCount":0,"image":"centos:7","imageID":"docker-pullable://centos@sha256:67dad89757a55bfdfabec8abd0e22f8c7c12a1856514726470228063ed86593b","containerID":"docker://5c25f5fce576d68d743afc9b46a9ea66f3cd245f5075aa95def623b6c2d93256"}],"qosClass":"BestEffort"}}
    I1019 13:49:34.316531   71247 loader.go:359] Config loaded from file /Users/mhausenblas/.kube/config
    I1019 13:49:34.317000   71247 round_trippers.go:386] curl -k -v -XGET  -H "Accept: application/json, */*" -H "User-Agent: kubectl/v1.12.0 (darwin/amd64) kubernetes/0ed3388" 'https://192.168.64.13:8443/api/v1/namespaces/default/pods/test-769f6f8c9f-2nx7m/log?follow=true'
    I1019 13:49:34.339341   71247 round_trippers.go:405] GET https://192.168.64.13:8443/api/v1/namespaces/default/pods/test-769f6f8c9f-2nx7m/log?follow=true 200 OK in 22 milliseconds
    I1019 13:49:34.339380   71247 round_trippers.go:411] Response Headers:
    I1019 13:49:34.339390   71247 round_trippers.go:414]     Content-Type: text/plain
    I1019 13:49:34.339407   71247 round_trippers.go:414]     Date: Fri, 19 Oct 2018 12:49:34 GMT
    Work
    Work
    Work
    ^C
    

    【讨论】:

    【解决方案2】:

    我的建议是始终检查 kubectl 在掩护下做了什么,为此在您的命令中使用 -v=9。它将为您提供客户端和服务器之间的完整请求和响应。

    【讨论】:

      【解决方案3】:

      如果您在最高调试级别-v 9 上使用kubectl 和流选项-f 提取任何Kubernetes 对象,例如kubectl logs -f <pod-name> -v 9,您可以意识到kubectl 通过follow=true通过相应地从目标 Pod 获取日志来标记 API 请求,并流式传输到输出:

      curl -k -v -XGET -H "接受:应用程序/json,/" -H "用户代理: kubectl/v1.12.1 (linux/amd64) kubernetes/4ed3216" 'https://API_server_IP/api/v1/namespaces/default/pods/Pod-name/log?follow=true'

      您可以考虑按照以下步骤发起自己的 API 请求:

      获取令牌以进行授权:

       MY_TOKEN="$(kubectl get secret <default-secret> -o jsonpath='{$.data.token}' | base64 -d)"
      

      然后您可以直接从 API 服务器手动检索所需的数据:

      curl -k -v -H "Authorization : Bearer $MY_TOKEN" https://API_server_IP/api/v1/namespaces/default/pods
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 2020-08-13
        • 2018-07-29
        相关资源
        最近更新 更多