温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - In Kubernetes, how does one select a pod by name in a service selector?
kubernetes service selector

其他 - 在Kubernetes中,如何在服务选择器中按名称选择Pod?

发布于 2020-04-04 00:28:31

我希望将特定数量的Pod旋转起来,这些Pod是独立的并且负载不平衡。(目的是使用这些来往和从某个外部端点发送和接收某些流量。)我计划执行此操作的方法是显式创建Pod(如下所示的Yaml代码段)

    apiVersion: v1
    kind: Pod
    metadata:
      name: generator-agent-pod-1
      labels:
        app: generator-agent
        version: v1
    spec:
      containers:
        ...

(在这种情况下,名称将自动生成为generator-agent-pod-1, generator-agent-pod-2,等等。)

然后,我希望为每个吊舱创建一个服务:因此,基本上,会有一个generator-agent-service-1, generator-agent-service-2,依此类推,因此我可以使用该服务从外部访问吊舱。

现在,我有两个问题:1.在服务中,如何按名称(而不是按标签)选择特定的窗格?相当于:

apiVersion: v1
kind: Service
metadata:
  name: generator-agent-service-1
  labels:
    app: agent-service
spec:
  type: NodePort
  ports:
  - port: 8085
    protocol: TCP
  selector:
    metadata.name: generator-agent-pod-1

(我想这个服务没有任何端点,所以选择器不正确。)

  1. 有没有更好的方法来解决此问题(Kubernetes或其他方式)?

谢谢!

查看更多

提问者
Srinivas
被浏览
109
DT. 2020-01-31 21:54

您还可以使用一个选项来定义不包含容器选择器的服务。然后通过手动添加Endpoint对象将服务手动映射到运行该服务的网络地址和端口。

供您参考的示例:

创建了两个类型为nginx的Pod

$ kubectl get all -o wide
NAME            READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
pod/nginx-one   1/1     Running   0          4m56s   192.168.58.199   k8s-node02   <none>           <none>
pod/nginx-two   1/1     Running   0          4m50s   192.168.85.193   k8s-node01   <none>           <none>

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/kubernetes          ClusterIP   10.96.0.1       <none>        443/TCP   29m     <none>

使用下面的Yaml创建两个服务,注意下面的Yaml上未使用Pod选择器字段

service1.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-one-service
spec:
  ports:
    - protocol: TCP
      port: 80

service2.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-two-service
spec:
  ports:
    - protocol: TCP
      port: 80


$ kubectl get svc
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes          ClusterIP   10.96.0.1       <none>        443/TCP   32m
nginx-one-service   ClusterIP   10.102.230.78   <none>        80/TCP    7m16s
nginx-two-service   ClusterIP   10.98.86.67     <none>        80/TCP    6m56s

描述服务,因为没有选择器,所以没有端点映射

ubuntu@k8s-master:~$ kubectl describe service nginx-one-service
Name:              nginx-one-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.102.230.78
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

ubuntu@k8s-master:~$ kubectl describe service nginx-two-service
Name:              nginx-two-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.98.86.67
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

现在,您可以选择使用以下Yamls手动映射终点。

endpoint1.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: nginx-one-service
subsets:
  - addresses:
      - ip: 192.168.85.193
    ports:
      - port: 80

endpoint2.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: nginx-two-service
subsets:
  - addresses:
      - ip: 192.168.85.193
    ports:
      - port: 80

现在获取创建端点

$ kubectl get endpoints
NAME                ENDPOINTS             AGE
kubernetes          131.160.188.46:6443   35m
nginx-one-service   192.168.58.199:80     5m30s
nginx-two-service   192.168.85.193:80     4m59s

并列出服务和端点应按以下方式映射

ubuntu@k8s-master:~$ kubectl describe service nginx-one-service
Name:              nginx-one-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.102.230.78
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         192.168.58.199:80
Session Affinity:  None
Events:            <none>

ubuntu@k8s-master:~$ kubectl describe service nginx-two-service
Name:              nginx-two-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.98.86.67
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         192.168.85.193:80
Session Affinity:  None
Events:            <none>