在kubernetes中,如何使用单个服务设置对多个节点的访问?
我正在尝试使用单个服务yaml在多个节点上设置对POD的访问。这些pod都有相同的标签(比如,在kubernetes中,如何使用单个服务设置对多个节点的访问?,kubernetes,kubernetes-service,kubernetes-networking,Kubernetes,Kubernetes Service,Kubernetes Networking,我正在尝试使用单个服务yaml在多个节点上设置对POD的访问。这些pod都有相同的标签(比如,label:app),但分布在多个节点上,而不是单个节点上 据我所知,我可以设置一个服务,通过节点端口转发对Pod的访问,如: spec: type: NodePort selector: label: app ports: targetPort: 5000 nodePort: 30000 其中,访问节点上的端口30000将转发到pod上的端口5000 如果我在
label:app
),但分布在多个节点上,而不是单个节点上
据我所知,我可以设置一个服务,通过节点端口转发对Pod的访问,如:
spec:
type: NodePort
selector:
label: app
ports:
targetPort: 5000
nodePort: 30000
其中,访问节点上的端口30000将转发到pod上的端口5000
如果我在多个节点上有pod,客户端是否有办法访问单个端点(例如服务本身),以循环方式获取任何pod?或者客户端是否需要使用特定节点的IP访问该节点上的一组POD,如
xx.xx.xx.xx:30000
?如果您正在寻找应用程序服务的单一入口点,并且它正在云基础设施中运行,那么您可以使用该服务(而不是节点端口)它将为您的服务分配一个外部IP,该IP可用于从外部系统访问您的服务
spec:
ports:
- name: httpsPort
port: 443
protocol: TCP
targetPort: 443
selector:
label: app
type: LoadBalancer
如果您在同一集群中有多个服务,需要从外部系统访问这些服务,则可以使用
谢谢
Kiruba如果您正在寻找应用程序服务的单一入口点,并且它正在云基础设施中运行,那么您可以使用服务(而不是节点端口),它将为您的服务分配一个外部IP,该IP可用于从外部系统访问您的服务
spec:
ports:
- name: httpsPort
port: 443
protocol: TCP
targetPort: 443
selector:
label: app
type: LoadBalancer
如果您在同一集群中有多个服务,需要从外部系统访问这些服务,则可以使用
谢谢
尽管Kiruba是一个无可否认的推荐解决方案(尤其是在云环境中),但值得一提的是,它还具有负载平衡功能
在特定节点上访问NodePort
服务并不意味着您只能通过这种方式访问该特定节点上已调度的pod
正如您在NodePort
服务中所看到的:
每个节点代理该端口(每个节点上的端口号相同)
进入您的服务
因此,通过访问某个特定节点上的端口30080
,您的请求不会直接发送到该节点上计划的某个随机Pod
。它被代理到服务
对象,该对象是跨所有节点的抽象。这可能是这里的关键点,因为您的NodePort
服务没有以任何方式绑定到您用来访问pod的IP节点
因此,NodePort
服务能够使用简单的循环算法将客户端请求路由到集群中的所有pod
您可以使用以下部署
轻松验证它:
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:
initContainers:
- name: init-myservice
image: nginx:1.14.2
command: ['sh', '-c', "echo $MY_NODE_NAME > /usr/share/nginx/html/index.html"]
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- mountPath: /usr/share/nginx/html
name: cache-volume
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
这将允许您测试http请求将发送到哪个节点。您可能还需要在此部署中稍微扩展一点,以确保使用所有节点:
kubectl scale deployment nginx-deployment --replicas=9
然后验证是否已在不同的节点上调度POD:
kubectl get pods -o wide
列出所有节点:
kubectl get nodes -o wide
并选择要用于访问播客的节点的IP地址
现在,您可以通过运行以下命令公开部署
:
kubectl expose deployment nginx-deployment --type NodePort --port 80 --target-port 80
或者,如果您想自己指定端口号,如30080
,请应用以下NodePort
服务定义,因为kubectl expose
不允许您指定确切的NodePort
值:
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
然后尝试使用先前选择的节点的IP通过NodePort
服务访问您的公开播客。您可能需要尝试普通模式和私有/匿名模式,甚至不同的浏览器(简单的刷新可能无法工作),但最终您将看到不同的请求落在不同节点上的POD上
请记住,如果您决定使用节点端口
,您将无法使用已知端口。实际上,这甚至可能是可行的,因为您可以使用--service node port range
选项将配置中的默认端口范围(30000-32767
)更改为类似1-1024
,但不建议使用此选项,因为它可能会导致一些意外问题。尽管是不可否认的推荐解决方案(特别是在云环境中),值得一提的是,它还具有负载平衡功能
在特定节点上访问NodePort
服务并不意味着您只能通过这种方式访问该特定节点上已调度的pod
正如您在NodePort
服务中所看到的:
每个节点代理该端口(每个节点上的端口号相同)
进入您的服务
因此,通过访问某个特定节点上的端口30080
,您的请求不会直接发送到该节点上调度的某个随机Pod
。它被代理到服务
对象,该对象是跨所有节点的抽象。这可能是关键点,因为节点端口
服务没有绑定以任何方式连接到用于访问播客的IP节点
因此,NodePort
服务能够使用简单的循环算法将客户端请求路由到集群中的所有pod
您可以使用以下部署
轻松验证它:
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:
initContainers:
- name: init-myservice
image: nginx:1.14.2
command: ['sh', '-c', "echo $MY_NODE_NAME > /usr/share/nginx/html/index.html"]
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- mountPath: /usr/share/nginx/html
name: cache-volume
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
这将允许您测试http请求将要发送到哪个节点。您可能还需要在此部署中稍微扩展一点,以确保使用所有节点:
kubectl scale deployment nginx-deployment --replicas=9
然后验证是否已在不同的节点上调度POD:
kubectl get pods -o wide
列出所有节点:
kubectl get nodes -o wide
并选择要用于访问播客的节点的IP地址
现在,您可以通过运行以下命令公开部署
:
kubectl expose deployment nginx-deployment --type NodePort --port 80 --target-port 80
或者,如果您想自己指定端口号,如30080
,请应用以下命令<