我正在尝试使用单个Service yaml在多个节点上设置对Pods的访问。Pods都有相同的标签(例如tag: app
),但分布在多个节点上,而不是在单个节点上。
据我所知,我可以设置一个服务,通过节点端口转发对Pod的访问,比如:
spec:
type: NodePort
selector:
label: app
ports:
targetPort: 5000
nodePort: 30000
其中访问节点上的端口30000会转发到pod上的端口5000。
如果我在多个节点上有pod,有没有一种方法可以让客户端访问一个endpoint,例如服务本身,从而在循环中获得任何pod?或者客户端是否需要使用特定节点的IP访问该节点上的一组pod,如< code>xx.xx.xx.xx:30000中所示?
如果你正在寻找应用程序服务的单个入口点,并且它在云基础架构中运行,则可以使用负载均衡器服务(而不是节点端口),它将为您的服务分配一个外部 IP,该 IP 可用于从外部系统访问服务。
spec:
ports:
- name: httpsPort
port: 443
protocol: TCP
targetPort: 443
selector:
label: app
type: LoadBalancer
如果在同一个集群中有多个服务需要从外部系统访问,那么可以使用Ingress。
谢谢,基鲁巴
虽然负载均衡器是一个无可否认的推荐解决方案(特别是在云环境中),但值得一提的是,NodePort还具有负载平衡功能。
您正在特定节点上访问<code>NodePort。
正如您在 NodePort
Service Specification 中读到的:
每个节点将该端口(每个节点上的相同端口号)代理到服务
中。
因此,通过访问一个特定节点上的端口30080
,您的请求不会直接发送到该节点上调度的某个随机Pod
。它被代理到Service
对象,它是一个跨越所有节点的抽象。这可能是这里的关键点,因为您的NodePort
Service与您用于访问Pod的IP节点没有任何联系。
因此,NodePort
Service能够使用简单的轮循机制算法将客户端请求路由到集群中的所有 Pod。
您可以使用下面的< code>Deployment轻松验证它:
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请求将要到哪个节点。您可能还需要稍微扩展此<code>部署</code>以确保使用所有节点:
kubectl scale deployment nginx-deployment --replicas=9
然后验证您的 Pod 是否安排在不同的节点上:
kubectl get pods -o wide
列出所有节点:
kubectl get nodes -o wide
并选择要用于访问Pod的节点的IP地址。
现在,您可以通过运行以下命令来公开< code >部署:
kubectl expose deployment nginx-deployment --type NodePort --port 80 --target-port 80
或者,如果您想自己指定端口号,例如30080
,请应用以下NodePort
服务定义,因为kubectl公开
不允许您指定确切的nodePort
值:
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
然后尝试使用先前选择的节点的IP访问通过<code>NodePort
请记住,如果您决定使用<code>节点端口)更改为<code>1-1024
我是码头工人和库伯内特斯的新手。使用的技术: < li >点网核心2.2 < li>Asp。NET Core WebAPI 2.2 < li >启用Kubernetes支持的Docker for windows(Edge) < li >代码 我将两个服务托管到两个docker容器容器1和容器2中。 下面是我的部署。yaml 当我运行命令时: 我获得的状态为 。 但是当我只配置了一个容器时,同样运行
我尝试了以下命令- ,它给出了- 此CLI仅用于开发,不用于生产 https://docs.confluent.io/current/CLI/index.html 使用confluent_current:/tmp/confluent.w1s9b10m启动zookeeper zookeeper是[UP]启动kafka kafka是[UP] 启动schema-registry schema-regis
我试图找到这个问题的答案,但在kubernetes文档或任何问答论坛中都找不到。 我有一个运行有4个节点的kubernetes集群。是否可以创建第二个集群,重用前一个集群中的一个或多个节点?或者一个节点被限制在单个kubernetes集群中? 我正在使用RKE(用于部署k8集群的牧场工具)运行实际的集群,我发现这个问题让我怀疑这种可能性。 感谢您的澄清。
尝试从同一命名空间中的另一个服务连接到一个服务。使用ClusterIP创建服务。创建服务后使用该Ip访问服务。请求有时成功,有时失败,我看到两个pod都启动并运行。以下是服务配置
我在库伯内特斯集群中运行3个节点。每个节点都有相同的Pod myApp。我使用NodePort类型创建一个服务,以便所有3个节点都可以从外部访问。服务yaml如下所示 假设3个节点的节点IP端口为: 1.192.168.18.1:30010 2.192.68.18.2:30010 3.192.18.18.3:30010 我的问题是:<br>1.如果所有请求都来自IP为(192.168.18.1:3
我是运营模式工作的新手,正在花时间弄清楚整个最终架构应该是什么样子。我的项目目前在一个库伯内特斯集群和一个带有单个pod的单个节点上运行,在非常常见的Nginx反向代理UWSGI Django应用程序中。我必须实现缩放架构。我的理解是我应该在后面使用(我托管在OVH,他们确实提供了一个内置的LoadBalancer)。然后将流量分配到我的pod。 问题1:如果我的Django应用程序侦听端口800