繁体   English   中英

在 Kubernetes 中,如何在服务选择器中按名称选择 pod?

[英]In Kubernetes, how does one select a pod by name in a service selector?

我希望启动特定数量的独立且未负载平衡的 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等,然后我可以使用该服务来从外面到达吊舱。

我现在有两个问题: 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 或其他)?

谢谢!

您还可以选择定义一个没有 pod 选择器的服务。 然后通过手动添加 Endpoint 对象,手动将 Service 映射到它运行的网络地址和端口。

供您参考的示例:

创建了两个 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 选择器字段

服务1.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 手动映射端点。

端点1.yaml

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

端点2.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>

我认为您正在使用 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM