Spring Cloud Kubernetes ディスカバリサーバー

Spring Cloud Kubernetes Discovery Server は、アプリが Kubernetes クラスター内で利用可能なサービスに関する情報を収集するために使用できる HTTP エンドポイントを提供します。Spring Cloud Kubernetes Discovery Server は、spring-cloud-starter-kubernetes-discoveryclient を使用するアプリで使用され、スターターによって提供される DiscoveryClient 実装にデータを提供できます。

許可

Spring Cloud Discovery サーバーは、Kubernetes API サーバーを使用して Pod、サービス、エンドポイントリソースに関するデータを取得するため、これらのエンドポイントを使用するためのアクセス許可をリストし、監視し、取得する必要があります。Kubernetes でサービスアカウントを構成する方法の例については、以下のサンプル Kubernetes デプロイ YAML を参照してください。

エンドポイント

サーバーによって公開されるエンドポイントは 3 つあります。

/apps

/apps に送信された GET リクエストは、利用可能なサービスの JSON 配列を返します。各項目には、Kubernetes サービスの名前とサービスインスタンスの情報が含まれます。以下はレスポンス例です。

[
   {
      "name":"spring-cloud-kubernetes-discoveryserver",
      "serviceInstances":[
         {
            "instanceId":"836a2f25-daee-4af2-a1be-aab9ce2b938f",
            "serviceId":"spring-cloud-kubernetes-discoveryserver",
            "host":"10.244.1.6",
            "port":8761,
            "uri":"http://10.244.1.6:8761",
            "secure":false,
            "metadata":{
               "app":"spring-cloud-kubernetes-discoveryserver",
               "kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"app\":\"spring-cloud-kubernetes-discoveryserver\"},\"name\":\"spring-cloud-kubernetes-discoveryserver\",\"namespace\":\"default\"},\"spec\":{\"ports\":[{\"name\":\"http\",\"port\":80,\"targetPort\":8761}],\"selector\":{\"app\":\"spring-cloud-kubernetes-discoveryserver\"},\"type\":\"ClusterIP\"}}\n",
               "http":"8761"
            },
            "namespace":"default",
            "scheme":"http"
         }
      ]
   },
   {
      "name":"kubernetes",
      "serviceInstances":[
         {
            "instanceId":"1234",
            "serviceId":"kubernetes",
            "host":"172.18.0.3",
            "port":6443,
            "uri":"http://172.18.0.3:6443",
            "secure":false,
            "metadata":{
               "provider":"kubernetes",
               "component":"apiserver",
               "https":"6443"
            },
            "namespace":"default",
            "scheme":"http"
         }
      ]
   }
]

/apps/{name}

/apps/{name} への GET リクエストを使用して、特定のサービスのすべてのインスタンスのインスタンスデータを取得できます。以下は、GET リクエストが /apps/kubernetes に対して行われたときのサンプルレスポンスです。

[
     {
        "instanceId":"1234",
        "serviceId":"kubernetes",
        "host":"172.18.0.3",
        "port":6443,
        "uri":"http://172.18.0.3:6443",
        "secure":false,
        "metadata":{
           "provider":"kubernetes",
           "component":"apiserver",
           "https":"6443"
        },
        "namespace":"default",
        "scheme":"http"
     }
]

/app/{name}/{instanceid}

/app/{name}/{instanceid} に対して行われた GET リクエストは、特定のサービスの特定のインスタンスのインスタンスデータを返します。以下は、GET リクエストが /app/kubernetes/1234 に対して行われたときのサンプルレスポンスです。

 {
    "instanceId":"1234",
    "serviceId":"kubernetes",
    "host":"172.18.0.3",
    "port":6443,
    "uri":"http://172.18.0.3:6443",
    "secure":false,
    "metadata":{
       "provider":"kubernetes",
       "component":"apiserver",
       "https":"6443"
    },
    "namespace":"default",
    "scheme":"http"
 }

デプロイ YAML

Spring Cloud Discovery Server のイメージは Docker Hub (英語) でホストされています。ただし、検出サーバーの動作をカスタマイズする必要がある場合、またはイメージを自分で構築したい場合は、GitHub のソースコード (英語) から独自のイメージを簡単に構築して使用できます。

以下は、Kubernetes Discovery Server を Kubernetes にデプロイするために使用できるサンプルデプロイ YAML です。

---
apiVersion: v1
kind: List
items:
  - apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: spring-cloud-kubernetes-discoveryserver
      name: spring-cloud-kubernetes-discoveryserver
    spec:
      ports:
        - name: http
          port: 80
          targetPort: 8761
      selector:
        app: spring-cloud-kubernetes-discoveryserver
      type: ClusterIP
  - apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app: spring-cloud-kubernetes-discoveryserver
      name: spring-cloud-kubernetes-discoveryserver
  - apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      labels:
        app: spring-cloud-kubernetes-discoveryserver
      name: spring-cloud-kubernetes-discoveryserver:view
    roleRef:
      kind: Role
      apiGroup: rbac.authorization.k8s.io
      name: namespace-reader
    subjects:
      - kind: ServiceAccount
        name: spring-cloud-kubernetes-discoveryserver
  - apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: namespace-reader
    rules:
      - apiGroups: ["", "extensions", "apps"]
        resources: ["pods", "services", "endpoints"]
        verbs: ["get", "list", "watch"]
  - apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-kubernetes-discoveryserver-deployment
    spec:
      selector:
        matchLabels:
          app: spring-cloud-kubernetes-discoveryserver
      template:
        metadata:
          labels:
            app: spring-cloud-kubernetes-discoveryserver
        spec:
          serviceAccountName: spring-cloud-kubernetes-discoveryserver
          containers:
          - name: spring-cloud-kubernetes-discoveryserver
            image: springcloud/spring-cloud-kubernetes-discoveryserver:3.1.0
            imagePullPolicy: IfNotPresent
            readinessProbe:
              httpGet:
                port: 8761
                path: /actuator/health/readiness
            livenessProbe:
              httpGet:
                port: 8761
                path: /actuator/health/liveness
            ports:
            - containerPort: 8761