【问题标题】:linkerd Top feature only shows /healthz requestslinkerd 顶部功能仅显示 /healthz 请求
【发布时间】:2022-10-08 04:34:26
【问题描述】:

正在做实验室 7.2。服务网格和入口控制器来自 Linux Foundation 的 Kubernetes 开发人员课程,我面临一个问题 - 顶部功能仅显示 /healthz 请求。

它也应该显示 / 请求。但没有。真的很想解决它,但我什至不知道如何解决它。

更多细节

按照我的课程说明:

  1. 部署在两个 GCE 虚拟机上的 k8s 集群
  2. 链接器
  3. nginx 入口控制器
  4. 一个简单的 LoadBalancer 服务关闭httpd图片。实际上,这是一个 NodePort 服务,因为从未配置过 LoadBalancer。名字是第二个应用程序
  5. 一个简单的入口对象路由到 secondapp 服务。

    我不知道哪些信息对解决问题有用。以下是我能想到的一些:

    设置

    Linkerd 版本

    student@master:~$ linkerd version
    Client version: stable-2.11.1
    Server version: stable-2.11.1
    student@master:~$
    

    nginx入口控制器版本

    student@master:~$ helm list
    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
    myingress       default         1               2022-09-28 02:09:35.031108611 +0000 UTC deployed        ingress-nginx-4.2.5     1.3.1
    student@master:~$
    

    服务清单

    student@master:~$ k get svc
    NAME                                           TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
    kubernetes                                     ClusterIP      10.96.0.1        <none>        443/TCP                      7d4h
    myingress-ingress-nginx-controller             LoadBalancer   10.106.67.139    <pending>     80:32144/TCP,443:32610/TCP   62m
    myingress-ingress-nginx-controller-admission   ClusterIP      10.107.109.117   <none>        443/TCP                      62m
    nginx                                          ClusterIP      10.105.88.244    <none>        443/TCP                      3h42m
    registry                                       ClusterIP      10.110.129.139   <none>        5000/TCP                     3h42m
    secondapp                                      LoadBalancer   10.105.64.242    <pending>     80:32000/TCP                 111m
    student@master:~$
    

    验证入口控制器是否为 linkerd 所知

    student@master:~$ k get ds myingress-ingress-nginx-controller -o json | jq .spec.template.metadata.annotations
    {
      "linkerd.io/inject": "ingress"
    }
    student@master:~$
    

    第二个应用程序 pod

    apiVersion: v1
    kind: Pod
    metadata:
      name: secondapp
      labels:
        example: second
    spec:
      containers:
        - name: webserver
          image: httpd
        - name: busy
          image: busybox
          command:
            - sleep
            - "3600"
    

    第二个app服务

    student@master:~$ k get svc secondapp -o yaml
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: "2022-09-28T01:21:00Z"
      name: secondapp
      namespace: default
      resourceVersion: "433221"
      uid: 9266f000-5582-4796-ba73-02375f56ce2b
    spec:
      allocateLoadBalancerNodePorts: true
      clusterIP: 10.105.64.242
      clusterIPs:
      - 10.105.64.242
      externalTrafficPolicy: Cluster
      internalTrafficPolicy: Cluster
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - nodePort: 32000
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        example: second
      sessionAffinity: None
      type: LoadBalancer
    status:
      loadBalancer: {}
    student@master:~$
    

    入口对象

    student@master:~$ k get ingress
    NAME           CLASS    HOSTS             ADDRESS   PORTS   AGE
    ingress-test   <none>   www.example.com             80      65m
    student@master:~$ k get ingress ingress-test -o yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
      creationTimestamp: "2022-09-28T02:20:03Z"
      generation: 1
      name: ingress-test
      namespace: default
      resourceVersion: "438934"
      uid: 1952a816-a3f3-42a4-b842-deb56053b168
    spec:
      rules:
      - host: www.example.com
        http:
          paths:
          - backend:
              service:
                name: secondapp
                port:
                  number: 80
            path: /
            pathType: ImplementationSpecific
    status:
      loadBalancer: {}
    student@master:~$
    

    测试

    第二个应用程序

    student@master:~$ curl "$(curl ifconfig.io):$(k get svc secondapp '--template={{(index .spec.ports 0).nodePort}}')"
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100    15  100    15    0     0    340      0 --:--:-- --:--:-- --:--:--   348
    <html><body><h1>It works!</h1></body></html>
    student@master:~$
    

    通过入口控制器

    student@master:~$ url="$(curl ifconfig.io):$(k get svc myingress-ingress-nginx-controller '--template={{(index .spec.ports 0).nodePort}}')"
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100    15  100    15    0     0    319      0 --:--:-- --:--:-- --:--:--   319
    student@master:~$ curl -H "Host: www.example.com" $url
    <html><body><h1>It works!</h1></body></html>
    student@master:~$
    

    并且没有 Host 标头:

    student@master:~$ curl $url
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>
    student@master:~$
    

    最后是 linkerd 仪表板顶部快照:

    GET / 请求在哪里?

    编辑 1

    因此,在 linkerd slack 上,有人建议查看 https://linkerd.io/2.12/tasks/using-ingress/#nginx,这让我更仔细地检查了我的 pod。事实证明,其中一个 nginx-ingress pod 无法启动,这显然是由于 linkerd 注入造成的。请注意:

    在链接器之前

    student@master:~$ k get pod
    NAME                                       READY   STATUS    RESTARTS      AGE
    myingress-ingress-nginx-controller-gbmbg   1/1     Running   0             19m
    myingress-ingress-nginx-controller-qtdhw   1/1     Running   0             3m6s
    secondapp                                  2/2     Running   4 (13m ago)   12h
    student@master:~$
    

    链接后

    student@master:~$ k get ds myingress-ingress-nginx-controller -o yaml | linkerd inject --ingress - | k apply -f -
    
    daemonset "myingress-ingress-nginx-controller" injected
    
    daemonset.apps/myingress-ingress-nginx-controller configured
    student@master:~$
    

    并检查豆荚:

    student@master:~$ k get pod
    NAME                                       READY   STATUS    RESTARTS        AGE
    myingress-ingress-nginx-controller-gbmbg   1/1     Running   0               40m
    myingress-ingress-nginx-controller-xhj5m   1/2     Running   8 (5m59s ago)   17m
    secondapp                                  2/2     Running   4 (34m ago)     12h
    student@master:~$
    
    student@master:~$ k describe pod myingress-ingress-nginx-controller-xhj5m |tail
      Normal   Created            19m                   kubelet            Created container linkerd-proxy
      Normal   Started            19m                   kubelet            Started container linkerd-proxy
      Normal   Pulled             18m (x2 over 19m)     kubelet            Container image "registry.k8s.io/ingress-nginx/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974" already present on machine
      Normal   Created            18m (x2 over 19m)     kubelet            Created container controller
      Normal   Started            18m (x2 over 19m)     kubelet            Started container controller
      Warning  FailedPreStopHook  18m                   kubelet            Exec lifecycle hook ([/wait-shutdown]) for Container "controller" in Pod "myingress-ingress-nginx-controller-xhj5m_default(93dd0189-091f-4c56-a197-33991932d66d)" failed - error: command '/wait-shutdown' exited with 137: , message: ""
      Warning  Unhealthy          18m (x6 over 19m)     kubelet            Readiness probe failed: HTTP probe failed with statuscode: 502
      Normal   Killing            18m                   kubelet            Container controller failed liveness probe, will be restarted
      Warning  Unhealthy          14m (x30 over 19m)    kubelet            Liveness probe failed: HTTP probe failed with statuscode: 502
      Warning  BackOff            4m29s (x41 over 14m)  kubelet            Back-off restarting failed container
    student@master:~$
    

    我将处理我在 linkerd slack 上获得的链接,并用任何新发现更新这篇文章。

【问题讨论】:

  • 您可以避免使用这些文档中显示的 --ingress 标志(并在入口资源中设置 nginx.ingress.kubernetes.io/service-upstream: "true" 注释)。这应该够了吧。

标签: kubernetes linkerd


【解决方案1】:

该解决方案由 Axenow 用户在 linkerd2 slack 论坛上提供。问题是 ingress-nginx 无法与其提供入口功能的服务共享命名空间。在我的例子中,它们都在默认命名空间中。

引用 Axenow:

当你部署 nginx 时,默认情况下它会直接向 pod 发送流量。 要修复它,您必须进行以下配置: https://linkerd.io/2.12/tasks/using-ingress/#nginx

详细来说,必须更新下载的 ingress-nginx helm 图表的values.yaml 文件,以确保以下内容为真:

controller:
  replicaCount: 2
  service:
    externalTrafficPolicy: Cluster
  podAnnotations:
    linkerd.io/inject: enabled

并将控制器安装在专用命名空间中:

helm upgrade --install --create-namespace --namespace ingress-nginx -f values.yaml ingress-nginx  ingress-nginx/ingress-nginx

(当然已经卸载了以前的安装)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多