[英]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
(这个服务没有得到任何端点,所以我想选择器是不正确的。)
谢谢!
您还可以选择定义一个没有 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.