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