Kubernetes 服务 select 或用于 select 另一个服务而不是部署?
Kubernetes service selector used to select another service and not deployment?
我只想知道,是否可以在 Kubernetes 服务定义中引用服务而不是部署(使用服务标签而不是部署匹配标签)?
我的意思是假设我定义了一个服务 A,它公开了一个部署 A-D,现在我想定义另一个服务 B,但这次我希望它指向之前定义的服务,而不是它的选择器引用部署 A-D,即服务A?这在 Kubernetes 中甚至可能吗?例如,请参见下面的场景
**Deployment A-D**
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
**ServiceA**
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx-1
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
**ServiceB**
apiVersion: v1
kind: Service
metadata:
name: my-nginx-wrapper-service
labels:
run: my-nginx-2
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx-1 //service label instead of deployment
更新:
headless service
apiVersion: v1
kind: Service
metadata:
name: access-service
annotations:
getambassador.io/config: |
---
apiVersion: ambassador/v1
kind: Mapping
name: productreadservice-mapping
prefix: /Apps/ProductReadService/.*
prefix_regex: true
rewrite: ""
service: access-service:80
spec:
clusterIP: None
ports:
- name: http
port: 80
targetPort: 8082
endpoint object
apiVersion: v1
kind: Endpoints
metadata:
name: access-service
subsets:
- addresses:
- ip: ip of the service i wish to access
ports:
- port: 8082
protocol: TCP
这是不可能的。 select 或仅需要 select pod 标签。
是的,有可能!不过不是通过选择器。
如果你有指向 pods A-D 的服务,你就有一个 IP 地址。您可以使用该 IP 地址创建一个 Endpoints
对象。然后,您可以创建一个 headless service
不带选择器的对象,其名称与 Endpoints
对象相同。
示例:
假设您的服务 IP 地址(指向 Depoyments A-D 的那个)是 10.0.0.10。创建 Endpoints
对象:
apiVersion: v1
kind: Endpoints
metadata:
name: my-headless-service
subsets:
- addresses:
- ip: 10.0.0.10
ports:
- port: 80
protocol: TCP
现在,创建与 Endpoints
对象同名的无头服务。请注意,它没有标签选择器,因此它没有选择任何后端。发生这种情况时,请求将发送到 DNS,它将在那里搜索具有相同名称的 en ExternalName
类型服务或具有相同名称的 Endpoints
对象。
apiVersion: v1
kind: Service
metadata:
name: my-headless-service
spec:
clusterIP: None
ports:
- name: http
port: 80
targetPort: 80
解析发生在 DNS,而不是 iptables。
我只想知道,是否可以在 Kubernetes 服务定义中引用服务而不是部署(使用服务标签而不是部署匹配标签)?
我的意思是假设我定义了一个服务 A,它公开了一个部署 A-D,现在我想定义另一个服务 B,但这次我希望它指向之前定义的服务,而不是它的选择器引用部署 A-D,即服务A?这在 Kubernetes 中甚至可能吗?例如,请参见下面的场景
**Deployment A-D**
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
**ServiceA**
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx-1
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
**ServiceB**
apiVersion: v1
kind: Service
metadata:
name: my-nginx-wrapper-service
labels:
run: my-nginx-2
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx-1 //service label instead of deployment
更新:
headless service
apiVersion: v1
kind: Service
metadata:
name: access-service
annotations:
getambassador.io/config: |
---
apiVersion: ambassador/v1
kind: Mapping
name: productreadservice-mapping
prefix: /Apps/ProductReadService/.*
prefix_regex: true
rewrite: ""
service: access-service:80
spec:
clusterIP: None
ports:
- name: http
port: 80
targetPort: 8082
endpoint object
apiVersion: v1
kind: Endpoints
metadata:
name: access-service
subsets:
- addresses:
- ip: ip of the service i wish to access
ports:
- port: 8082
protocol: TCP
这是不可能的。 select 或仅需要 select pod 标签。
是的,有可能!不过不是通过选择器。
如果你有指向 pods A-D 的服务,你就有一个 IP 地址。您可以使用该 IP 地址创建一个 Endpoints
对象。然后,您可以创建一个 headless service
不带选择器的对象,其名称与 Endpoints
对象相同。
示例:
假设您的服务 IP 地址(指向 Depoyments A-D 的那个)是 10.0.0.10。创建 Endpoints
对象:
apiVersion: v1
kind: Endpoints
metadata:
name: my-headless-service
subsets:
- addresses:
- ip: 10.0.0.10
ports:
- port: 80
protocol: TCP
现在,创建与 Endpoints
对象同名的无头服务。请注意,它没有标签选择器,因此它没有选择任何后端。发生这种情况时,请求将发送到 DNS,它将在那里搜索具有相同名称的 en ExternalName
类型服务或具有相同名称的 Endpoints
对象。
apiVersion: v1
kind: Service
metadata:
name: my-headless-service
spec:
clusterIP: None
ports:
- name: http
port: 80
targetPort: 80
解析发生在 DNS,而不是 iptables。