我有一个带有主节点和另外两个节点的Kubernetes集群:
sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 4h v1.10.2
kubernetes-node1 Ready <none> 4h v1.10.2
kubernetes-node2 Ready <none> 34m v1.10.2
它们中的每一个都在VirtualBox Ubuntu VM上运行,可从来宾计算机访问:
kubernetes-master (192.168.56.3)
kubernetes-node1 (192.168.56.4)
kubernetes-node2 (192.168.56.6)
我部署了一个带有两个副本的nginx服务器,每个kubernetes-node-x有一个pod:
sudo kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-64ff85b579-5k5zh 1/1 Running 0 8s 192.168.129.71 kubernetes-node1
nginx-deployment-64ff85b579-b9zcz 1/1 Running 0 8s 192.168.22.66 kubernetes-node2
接下来,我将nginx-deployment的服务公开为NodePort,以便从集群外部访问它:
sudo kubectl expose deployment/nginx-deployment --type=NodePort
sudo kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h
nginx-deployment NodePort 10.96.194.15 <none> 80:32446/TCP 2m
sudo kubectl describe service nginx-deployment
Name: nginx-deployment
Namespace: default
Labels: app=nginx
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP: 10.96.194.15
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32446/TCP
Endpoints: 192.168.129.72:80,192.168.22.67:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
我可以直接使用节点IP
访问节点中的每个podkubernetes-node1 http://192.168.56.4:32446/
kubernetes-node2 http://192.168.56.6:32446/
但是,我认为K8s提供了某种外部集群ip,它可以平衡来自外部的节点请求。那是什么IP ??
答案 0 :(得分:3)
但是,我认为K8s提供了某种外部集群ip,它可以平衡来自外部的节点请求。那是什么IP ??
群集IP是群集内部的。不暴露在外面,用于整个集群之间的互通。
事实上,你有LoadBanacer类型的服务可以做你需要的技巧,只有它依赖于云提供商或minikube / docker边缘才能正常工作。
我可以直接使用节点IP
访问节点中的每个pod
作为旁注,为了在裸机上执行此操作并执行ssl等,您需要提供自己的入口。比如说,将一个nginx放在特定节点上,然后引用你想要暴露的所有适当服务(请注意服务的fqdn)作为可以在多个节点上运行的上游,并且根据需要使用自己的nginx多个nginx - 你不要需要处理的确切细节,因为k8s运行节目。这样,您就有一个节点(入口nginx)具有已知的IP地址,该IP地址处理传入流量并将其重定向到可以跨任何节点运行的k8内的服务。我厌倦了ascii艺术,但会尝试一下:
(outside) -> ingress (nginx) +--> my-service FQDN (running accross nodes):
[node-0] | [node-1]: my-service-pod-01 with nginx-01
| [node 2]: my-service-pod-02 with nginx-02
| ...
+--> my-second-service FQDN
| [node-1]: my-second-service-pod with apache?
...
在上面的草图中,您在节点0(已知IP)上有nginx入口,它接受外部流量,然后处理我的服务(在两个节点上的两个pod上运行)和my-second-service(单个pod)作为上游。您只需要在服务上公开FQDN即可使用,而无需担心特定节点的IP细节。您可以在文档中找到更多信息:https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/
为什么服务负载没有平衡服务中使用过的pod?
--nodeport-addresses
的官方文档(https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport),您可以更改节点代理行为。事实证明,循环法是旧的kube-proxy行为,显然新的应该是随机的。最后,要从浏览器中排除连接和会话问题,您是否也尝试过匿名会话?你有本地缓存的dns吗? 还有其他东西,我从node1中删除了pod,当调用node1时,它没有使用节点2中的pod。
and each Node will proxy that port (the same port number on every Node) into your Service
。但如果那是你的情况,那么可能是LB或Ingress,甚至是具有外部地址的ClusterIP(见下文)可以为你做到这一点。如果服务是内部的(ClusterIP)...是否对节点中的任何pod进行负载均衡
绝对是肯定的。还有一件事,你可以使用这种行为来暴露“负载均衡”。标准&#39;中的行为端口范围,而不是NodePort的30k +。以下是我们用于入口控制器的服务清单的摘录。
apiVersion: v1
kind: Service
metadata:
namespace: ns-my-namespace
name: svc-nginx-ingress-example
labels:
name: nginx-ingress-example
role: frontend-example
application: nginx-example
spec:
selector:
name: nginx-ingress-example
role: frontend-example
application: nginx-example
ports:
- protocol: TCP
name: http-port
port: 80
targetPort: 80
- protocol: TCP
name: ssl-port
port: 443
targetPort: 443
externalIPs:
- 123.123.123.123
请注意,在上面的示例中,使用externalIPs
公开的虚构123.123.123.123表示我们的一个工作节点的IP地址。在svc-nginx-ingress-example
服务中运行的Pod根本不需要在此节点上,但是当指定端口上的ip被命中时,它们仍然可以将流量路由到它们(并在pod上进行负载均衡)。