如何通过 kubectl 代理访问 Kubernetes 服务?

25

我想通过kubectl代理服务器访问我的Grafana Kubernetes服务,但由于某种原因,尽管我可以使其他服务正常工作,但它却无法工作。鉴于以下服务定义,为什么无法在http://localhost:8001/api/v1/proxy/namespaces/monitoring/services/grafana上使用?

grafana-service.yaml

apiVersion: v1
kind: Service
metadata:
  namespace: monitoring
  name: grafana
  labels:
    app: grafana
spec:
  type: NodePort
  ports:
  - name: web
    port: 3000
    protocol: TCP
    nodePort: 30902
  selector:
    app: grafana

grafana-deployment.yaml

的翻译是

grafana部署文件.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: monitoring
  name: grafana
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:4.1.1
        env:
        - name: GF_AUTH_BASIC_ENABLED
          value: "true"
        - name: GF_AUTH_ANONYMOUS_ENABLED
          value: "true"
        - name: GF_SECURITY_ADMIN_USER
          valueFrom:
            secretKeyRef:
              name: grafana-credentials
              key: user
        - name: GF_SECURITY_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              name: grafana-credentials
              key: password
        volumeMounts:
        - name: grafana-storage
          mountPath: /var/grafana-storage
        ports:
        - name: web
          containerPort: 3000
        resources:
          requests:
            memory: 100Mi
            cpu: 100m
          limits:
            memory: 200Mi
            cpu: 200m
      - name: grafana-watcher
        image: quay.io/coreos/grafana-watcher:v0.0.5
        args:
          - '--watch-dir=/var/grafana-dashboards'
          - '--grafana-url=http://localhost:3000'
        env:
        - name: GRAFANA_USER
          valueFrom:
            secretKeyRef:
              name: grafana-credentials
              key: user
        - name: GRAFANA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: grafana-credentials
              key: password
        resources:
          requests:
            memory: "16Mi"
            cpu: "50m"
          limits:
            memory: "32Mi"
            cpu: "100m"
        volumeMounts:
        - name: grafana-dashboards
          mountPath: /var/grafana-dashboards
      volumes:
      - name: grafana-storage
        emptyDir: {}
      - name: grafana-dashboards
        configMap:
          name: grafana-dashboards

当我访问上述URL时,出现的错误是"no endpoints available for service "grafana"",错误代码为503。

5个回答

25

更新的文档链接为https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster-services/#manually-constructing-apiserver-proxy-urls - undefined

15

正如Michael所说,你的标签或命名空间可能不匹配。此外,请记住,即使您修复了端点,您想要的网址 (http://localhost:8001/api/v1/proxy/namespaces/monitoring/services/grafana) 也可能无法正确工作。

根据您的root_url和/或static_root_path grafana配置设置,在尝试登录时,您可能会发现grafana试图POST到http://localhost:8001/login并收到404错误。

请尝试使用kubectl port-forward代替:

kubectl -n monitoring port-forward [grafana-pod-name] 3000

然后通过http://localhost:3000/访问grafana。

https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/


15

6
我不知道为什么,在AKS上无法使用这个模式,必须按照以下模式进行操作(代理在末尾): http://localhost:8001/api/v1/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/proxy/ - Nicolas Albert
4
那是因为服务端点已更新。https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.14/#get-connect-proxy-service-v1-core - Praveen Tiwari

2

可能有几个因素导致此问题。

  1. 该服务希望找到一个或多个支持端点,这些端点是通过标签上匹配规则发现的。如果标签不对齐,则服务将找不到端点,服务执行的网络网关功能会导致503错误。

  2. POD声明的端口和容器内的进程与服务期望的 --target-port 不对齐。

以上两种情况中的任何一种都可能导致错误。让我们仔细看一下。

首先,kubectl describe 服务:

$ kubectl describe svc grafana01-grafana-3000
Name:           grafana01-grafana-3000
Namespace:      default
Labels:         app=grafana01-grafana
            chart=grafana-0.3.7
            component=grafana
            heritage=Tiller
            release=grafana01
Annotations:        <none>
Selector:       app=grafana01-grafana,component=grafana,release=grafana01
Type:           NodePort
IP:         10.0.0.197
Port:           <unset> 3000/TCP
NodePort:       <unset> 30905/TCP
Endpoints:      10.1.45.69:3000
Session Affinity:   None
Events:         <none>

请注意,我的Grafana服务只列出了1个端点(可能会有多个)。你的例子中上面的错误表明你在这里不会有列出端点。
Endpoints:      10.1.45.69:3000

让我们接下来看一下选择器。在上面的例子中,您可以看到我在我的服务上有3个选择器标签:
Selector:       app=grafana01-grafana,component=grafana,release=grafana01

接下来,我将使用kubectl describe命令描述我的Pod:

$ kubectl describe pod grafana
Name:       grafana01-grafana-1843344063-vp30d
Namespace:  default
Node:       10.10.25.220/10.10.25.220
Start Time: Fri, 14 Jul 2017 03:25:11 +0000
Labels:     app=grafana01-grafana
        component=grafana
        pod-template-hash=1843344063
        release=grafana01
...

请注意,pod上的标签对齐正确,因此我的服务会查找提供由service负载平衡的endpointspods。请验证您的环境中是否存在此链的断开。
如果您发现标签是正确的,但您在pod内的container中运行的grafana进程运行在与您预期不同的端口上,那么仍可能存在问题。
$ kubectl describe pod grafana
Name:       grafana01-grafana-1843344063-vp30d
...
Containers:
  grafana:
    Container ID:   docker://69f11b7828c01c5c3b395c008d88e8640c5606f4d865107bf4b433628cc36c76
    Image:      grafana/grafana:latest
    Image ID:       docker-pullable://grafana/grafana@sha256:11690015c430f2b08955e28c0e8ce7ce1c5883edfc521b68f3fb288e85578d26
    Port:       3000/TCP
    State:      Running
      Started:      Fri, 14 Jul 2017 03:25:26 +0000

如果由于某些原因,容器下的port列出了不同的值,则该服务实际上是针对无效端点进行负载均衡。

例如,如果它列出了端口80: Port: 80/TCP 或者是一个空值 Port:

那么即使您的标签选择器正确,该服务也永远找不到来自pod的有效响应,并将从轮换中删除该端点。

我怀疑您的问题是上述第一个问题(标签选择器不匹配)。

如果标签选择器和端口都对齐,则您可能会遇到节点之间MTU设置的问题。在某些情况下,如果您的网络层(mtucalico等)使用的MTU大于支持网络的MTU,则您将永远无法从端点获得有效响应。通常,这种潜在的最后一个问题会表现为超时而不是503。


1
您的部署可能没有标签app:grafana,或者在另一个命名空间中。您能否也发布部署定义?

嘿,抱歉我回复你的速度很慢,但是我现在已经发布了部署清单!在此期间我必须集中精力处理其他事情。 - aknuds1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接