web-dev-qa-db-ja.com

kubectlプロキシ経由でこのKubernetesサービスにアクセスするにはどうすればよいですか?

kubectl proxy server を介して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

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にアクセスするときに表示されるエラーは、 "サービス" grafana "で使用可能なエンドポイントがありません"、エラーコード503です。

11
aknuds1

問題は、Grafanaのポートの名前がwebであり、その結果、:webをkubectlプロキシURLに追加する必要があることです- http:// localhost:8001/api/v1/proxy/namespaces/monitoring/services/grafana:web

別の方法は、代わりにGrafanaポートに名前を付けないことです。サービスのkubectlプロキシURLに:webを追加する必要がないためです。 http:// localhost:8001/api/v1/proxy/namespaces/monitoring/services/grafana:web 。簡単なのでこのオプションを最後に使いました。

6
aknuds1

マイケルが言うように、おそらくあなたのラベルまたは名前空間が一致していません。ただし、それに加えて、エンドポイントを修正する場合でも、目的のURL( http:// localhost:8001/api/v1/proxy/namespaces/monitoring/services/grafana )正しく動作しない可能性があります。

Root_urlおよび/またはstatic_root_path grafana構成設定に応じて、ログインしようとするとPOST to 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/

9
Stefan R

展開には、ラベルアプリgrafanaがないか、別のネームスペースにある可能性があります。展開定義も投稿できますか?

1
oe18

この問題を引き起こしている可能性のある要因がいくつかあります。

  1. サービスは、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次に私のポッド:

$ 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のラベルが正しく整列していることに注意してください。したがって、私のサービスは、podsによって負荷分散されるendpointsを提供するserviceを見つけます。チェーンのこの部分が環境で壊れていないことを確認します。

ラベルが正しいことがわかった場合でも、container内のpod内で実行されている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がリストされている場合:ポート:80/TCPまたは空の値であった場合ポート:

ラベルセレクターが正しい場合でも、サービスはポッドからの有効な応答を見つけられず、エンドポイントをローテーションから削除します。

上記の最初の問題(ラベルセレクターの不一致)が問題であると思われます。

ラベルセレクタとポートの両方が揃っている場合、ノード間のMTU設定に問題がある可能性があります。場合によっては、ネットワーク層(calicoなど)で使用されるMTUがサポートネットワークのMTUよりも大きい場合、エンドポイントから有効な応答が得られないことがあります。通常、この最後の潜在的な問題は、503ではなくタイムアウトとして現れます。

1
Michael Elder