1

我只是想知道,是否可以在 Kubernetes 服务定义中引用服务而不是部署(使用服务标签而不是部署 matchLabels)?

我的意思是假设我定义了一个服务A,它公开了一个部署AD,现在我想定义另一个服务B,但是这次我希望它指向之前定义的服务而不是它的选择器引用一个部署AD服务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
4

2 回答 2

3

是的,有可能!虽然不是通过选择器。

那些你有指向 Pod AD 的服务,你有一个 IP 地址。Endpoints您可以使用该 IP 地址创建对象。然后,您可以创建一个headless service与对象同名的无选择器Endpoints

例子:

假设您的服务 IP 地址(指向 Depoyments AD 的地址)是 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,它会在那里搜索具有相同名称的 enExternalName类型服务或具有相同名称的Endpoints对象。

apiVersion: v1
kind: Service
metadata:
  name: my-headless-service
spec:
  clusterIP: None
  ports:
  - name: http
    port: 80
    targetPort: 80

解析发生在 DNS,而不是 iptables。

于 2020-01-01T16:53:26.027 回答
0

这不可能。选择器只需要选择 pod 标签。

于 2020-01-01T13:54:38.067 回答