NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
它也属于一种特殊类型的集群服务。在上一节我们提到过如果没有标签选择器,就不会有 Endpoints 记录。但是可以创建 Endpoints 对象,在 Endpoints 对象中手动指定需要映射到的 IP 地址和端口号。 虽然 Service 服务通常都会被用来代理对于 Pod 的访问,但是也可以代理其它的后端类型,只要我们自定义 Endpoints 记录就可以了。这些情况通常包括: * 一个集群在不同场景下使用不同的数据库。比如在生产环境中使用外部数据库,而在测试环境中使用集群内的数据库; * 服务被其它命名空间或是其它集群上的服务调用; * 当迁移应用时,一些后端在集群内部运行,一些后端在集群外部运行。 需要注意的是:如果只定义一个没有标签选择器的服务,那么创建的服务在集群内有 VIP,只是没有 Endpoints 而已。 下面来看一个示例。 在`/home/shiyanlou`目录下新建`no-selector-svc.yaml`文件,并向其中写入如下内容: ~~~yaml apiVersion: v1 kind: Service metadata: name: no-selector-svc spec: ports: - protocol: TCP port: 80 # 指定 ClusterIP 对应的端口为 80 targetPort: 9376 # 指定对应 Pod 的端口为 9376 ~~~ 执行创建: ~~~bash $ kubectl create -f no-selector-svc.yaml service/no-selector-svc created # 定义的 no-selector-svc 依然是有 ClusterIP 的,为:10.100.179.62 $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 87d no-selector-svc ClusterIP 10.100.179.62 <none> 80/TCP 22s ~~~ 然后在`/home/shiyanlou`目录下新建`test-endpoints.yaml`文件,并向其中写入如下内容: ~~~yaml apiVersion: v1 kind: Endpoints metadata: name: no-selector-svc # 这里的名称一定要与需要绑定的 Service 相同 subsets: - addresses: - ip: 192.0.2.42 # Endpoints 需要映射到的 IP 地址 ports: - port: 9376 # Endpoints 映射的 IP 地址对应的端口号 ~~~ 执行创建: ~~~bash $ kubectl create -f test-endpoints.yaml endpoints/no-selector-svc created ~~~ 查看新创建好的 Endpoints: ~~~bash # 可以发现自定义的与 no-selector-svc 服务相关联的 Endpoints 映射已经建立好了 $ kubectl get endpoints NAME ENDPOINTS AGE kubernetes 10.192.0.2:6443 87d no-selector-svc 192.0.2.42:9376 24s ~~~ 在设置 Endpoints 的`subsets.addresses.ip`字段时,需要注意它们不是以下的任意一种: * 环回地址,比如:IPv4 的`127.0.0.0/8`,IPv6 的`::1/128` * 本地连接,比如:IPv4 的`169.254.0.0/16`和`224.0.0.0/24`,IPv6 的`fe80::/64` * Service 的 ClusterIP 访问没有 selector 的 Service,与有标签选择器的服务一样,依然是将请求路由到用户自定义的 Endpoints,在上面的例子中就是地址`192.0.2.42:9376`。 Endpoints 的缺点是只能指定 IP,如果想要指定网址可以使用 ExternalName 类型的 Service。