我希望将特定数量的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
(我想这个服务没有任何端点,所以选择器不正确。)
谢谢!
您还可以使用一个选项来定义不包含容器选择器的服务。然后通过手动添加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>
谢谢!@DT,您的答案当然也有效;我还在寻找是否有一种方法可以基于标签以外的元数据进行选择。非常感激!!