在 Kubernetes 中,如何通过名称在服务选择器中选择一个 Pod?

6

我想要启动一定数量的独立且非负载均衡的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等等。
然后,我希望为每个Pod创建一个服务:也就是说,将会有generator-agent-service-1, generator-agent-service-2等等。因此,我可以使用该服务来从外部访问Pod。
现在我有两个问题: 1. 在服务中,如何通过名称选择特定的Pod(而不是通过标签)?类似于下面的内容:
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 或其他方式)?

谢谢!


最简单的解决方案是在标签下添加额外的名称字段,并将名称标签用作选择器,参考下面评论中的示例。 - DT.
`apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: name: nginx1 name: nginx1 spec: containers:
  • image: nginx name: nginx1`
- DT.
2个回答

8

我认为你正在使用StatefulSet来控制Pod。

如果是这样的话,你可以使用标签statefulset.kubernetes.io/pod-name来选择服务中的Pod。

举个例子:

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

2
非常喜欢这个答案。我想知道如何查看所有这些选项。即 (statefulset.kubernetes.io/) (pod.kubernetes.io/) - Lon Kaut

4

您可以选择定义一个没有Pod选择器的服务。然后通过手动添加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>

使用以下yamls创建两个服务,注意下面的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>

2
谢谢!@D.T.,你的答案也是可行的;我还在寻找一种基于元数据而非标签进行选择的方法。非常感谢! - Srinivas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接