Kubernetes 如何在ReplicaSet/Deployment创建的POD上创建LoadBalancer服务
我正在使用ReplicaSet来管理我的播客,并尝试使用服务公开这些播客。复制集创建的pod具有随机名称Kubernetes 如何在ReplicaSet/Deployment创建的POD上创建LoadBalancer服务,kubernetes,Kubernetes,我正在使用ReplicaSet来管理我的播客,并尝试使用服务公开这些播客。复制集创建的pod具有随机名称 NAME READY STATUS RESTARTS AGE master 2/2 Running 0 20m worker-4szkz 2/2 Running 0 21m worker-hwnzt 2/2
NAME READY STATUS RESTARTS AGE
master 2/2 Running 0 20m
worker-4szkz 2/2 Running 0 21m
worker-hwnzt 2/2 Running 0 21m
我试图用服务公开这些pod,因为有些策略限制我使用hostNetwork=true
。我可以通过使用kubectl expose Pod worker-xxxxx--type=NodePort
为每个Pod创建NodePort
服务来公开它们
这显然不是一种灵活的方式。我想知道如何创建一个服务(可能是LoadBalancer类型?)来动态访问复制集中的所有副本。如果有这样一个部署,那就太完美了
谢谢你的帮助和建议
编辑:
我在我的复制集上放置了一个标签,并使用一个名为worker
的节点端口类型服务来选择该标签。但我无法在我的任何播客中ping worker
。正确的做法是什么
以下是kubectl描述服务人员的方式。当端点
显示吊舱被拾取时
Name: worker
Namespace: default
Annotations: <none>
Selector: tag=worker
Type: NodePort
IP: 10.106.45.174
Port: port1 29999/TCP
TargetPort: 29999/TCP
NodePort: port1 31934/TCP
Endpoints: 10.32.0.3:29999,10.40.0.2:29999
Port: port2 29996/TCP
TargetPort: 29996/TCP
NodePort: port2 31881/TCP
Endpoints: 10.32.0.3:29996,10.40.0.2:29996
Port: port3 30001/TCP
TargetPort: 30001/TCP
NodePort: port3 31877/TCP
Endpoints: 10.32.0.3:30001,10.40.0.2:30001
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
姓名:工人
名称空间:默认值
注释:
选择器:tag=worker
类型:节点端口
IP:10.106.45.174
端口:端口1 29999/TCP
目标端口:29999/TCP
节点端口:端口1 31934/TCP
终点:10.32.0.3:29999,10.40.0.2:29999
端口:端口2 29996/TCP
目标端口:29996/TCP
节点端口:端口2 31881/TCP
终点:10.32.0.3:29996,10.40.0.2:29996
端口:端口3 30001/TCP
目标端口:30001/TCP
节点端口:端口3 31877/TCP
终点:10.32.0.3:30001,10.40.0.2:30001
会话关联:无
外部流量策略:群集
活动:
我相信您可以通过使用部署而不是复制集(这是现在的标准方式)对此进行一些优化,也就是说,您可以进行如下部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
那么,与此匹配的服务将是:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
# This is the important part as this is what is used to route to
# the pods created by your deployment
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
我相信您可以通过使用部署而不是复制集(这是现在的标准方式)对此进行一些优化,也就是说,您可以进行如下部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
那么,与此匹配的服务将是:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
# This is the important part as this is what is used to route to
# the pods created by your deployment
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
您是否尝试将标签添加到部署中,例如行
app:worker
,并使用选择器app:worker
创建服务?该服务应该在所有带有该标签的POD前面起到负载平衡器的作用。@bserdar我用匹配的选择器创建了一个类型NodePort
服务,该服务在端点中显示工作程序POD
。但是我无法在master中ping worker
(worker
是服务名称)。你知道我做错了吗?非常感谢。该服务名称在群集中外部不可见。集群中的所有POD都应该可以看到该名称。因为它是一个节点端口,所以任何工作程序都应该打开该端口,您可以使用workernode:port访问它。如果需要在群集中外部公开该服务,则需要入口,或者需要指向所有workernode:port节点的外部负载平衡器。@bserdar抱歉,我编辑了kubectl get pods
输出。master
是k8s集群中的一个pod,因此我希望它能够通过该服务与工作pod进行通信。我添加了对服务端口转发的编辑。我没有ping到正确的端口吗?谢谢您使用的是什么kube代理模式,iptables还是IPV?如果是iptables模式,则服务不可ping,因为iptables规则与icmp流量不匹配。尝试telnet worker 29999是否尝试将标签添加到部署、某物行app:worker
,并使用选择器app:worker
创建服务?该服务应该在所有带有该标签的POD前面起到负载平衡器的作用。@bserdar我用匹配的选择器创建了一个类型NodePort
服务,该服务在端点中显示工作程序POD
。但是我无法在master中ping worker
(worker
是服务名称)。你知道我做错了吗?非常感谢。该服务名称在群集中外部不可见。集群中的所有POD都应该可以看到该名称。因为它是一个节点端口,所以任何工作程序都应该打开该端口,您可以使用workernode:port访问它。如果需要在群集中外部公开该服务,则需要入口,或者需要指向所有workernode:port节点的外部负载平衡器。@bserdar抱歉,我编辑了kubectl get pods
输出。master
是k8s集群中的一个pod,因此我希望它能够通过该服务与工作pod进行通信。我添加了对服务端口转发的编辑。我没有ping到正确的端口吗?谢谢您使用的是什么kube代理模式,iptables还是IPV?如果是iptables模式,则服务不可ping,因为iptables规则与icmp流量不匹配。试试telnet worker 29999