Spring Cloud Kubernetes Discovery Server
Spring Cloud Kubernetes Discovery Server 提供了 HTTP 端点,应用程序可以使用这些端点来收集有关 Kubernetes 集群中可用服务的详细信息。使用 spring-cloud-starter-kubernetes-discoveryclient
的应用程序可以使用 Spring Cloud Kubernetes Discovery Server 向该 starter 提供的 DiscoveryClient
实现提供数据。
The Spring Cloud Kubernetes Discovery Server provides HTTP endpoints apps can use to gather information
about services available within a Kubernetes cluster. The Spring Cloud Kubernetes Discovery Server
can be used by apps using the spring-cloud-starter-kubernetes-discoveryclient
to provide data to
the DiscoveryClient
implementation provided by that starter.
Permissions
Spring Cloud Discovery 服务器使用 Kubernetes API 服务器获取有关 Pod、服务和端点资源的数据,因此它需要列示、监视和获取权限才能使用这些端点。有关如何配置 Kubernetes 上的服务帐户的示例,请参见以下示例 Kubernetes 部署 YAML。
The Spring Cloud Discovery server uses the Kubernetes API server to get data about Pod, Service and Endpoint resources, so it needs list, watch, and get permissions to use those endpoints. See the below sample Kubernetes deployment YAML for an example of how to configure the Service Account on Kubernetes.
Endpoints
服务器公开了三个端点。
There are three endpoints exposed by the server.
/apps
发送到 /apps
的 GET
请求将返回一个 JSON 数组,其中包含可用服务。每项都包含 Kubernetes 服务名称和服务实例信息。以下是示例响应。
A GET
request sent to /apps
will return a JSON array of available services. Each item contains
the name of the Kubernetes service and service instance information. Below is a sample response.
[
{
"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
请求,可以获取给定服务的所有实例的实例数据。下面展示了向 /apps/kubernetes
发出 GET
请求时的示例响应。
A GET
request to /apps/{name}
can be used to get instance data for all instances of a given
service. Below is a sample response when a GET
request is made to /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
请求,将会返回给定服务的特定实例的实例数据。下面展示了向 /app/kubernetes/1234
发出 GET
请求时的示例响应。
A GET
request made to /app/{name}/{instanceid}
will return the instance data for a specific
instance of a given service. Below is a sample response when a GET
request is made to /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"
}
Deployment YAML
Spring Cloud Discovery Server 的镜像托管在 Docker Hub 上。但是,如果您需要自定义发现服务器行为或希望自己构建该映像,那么您可以轻松地从 source code on GitHub 构建自己的映像并使用该映像。
An image of the Spring Cloud Discovery Server is hosted on Docker Hub. However, if you need to customize the discovery server behavior or prefer to build the image yourself you can easily build your own image from the source code on GitHub and use that.
下面是一个示例部署 YAML,您可以使用它将 Kubernetes Discovery Server 部署到 Kubernetes 中。
Below is a sample deployment YAML you can use to deploy the Kubernetes Discovery Server to Kubernetes.
---
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