cod*_*ent 3 virtualbox nginx kubernetes kubernetes-service
我有一个带有主节点和其他两个节点的 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
Run Code Online (Sandbox Code Playgroud)
它们每个都在 VirtualBox Ubuntu VM 上运行,可以从来宾计算机访问:
kubernetes-master (192.168.56.3)
kubernetes-node1 (192.168.56.4)
kubernetes-node2 (192.168.56.6)
Run Code Online (Sandbox Code Playgroud)
我部署了一个带有两个副本的 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
Run Code Online (Sandbox Code Playgroud)
接下来,我将 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>
Run Code Online (Sandbox Code Playgroud)
我可以使用节点 IP 直接访问节点中的每个 pod
kubernetes-node1 http://192.168.56.4:32446/
kubernetes-node2 http://192.168.56.6:32446/
Run Code Online (Sandbox Code Playgroud)
但是,我认为 K8s 提供了某种外部集群 IP 来平衡外部对节点的请求。那个IP是什么??
但是,我认为 K8s 提供了某种外部集群 IP 来平衡外部对节点的请求。那个IP是什么??
集群 IP 是集群内部的。不暴露于外部,用于跨集群互通。
事实上,您拥有 LoadBanacer 类型的服务,可以完成您需要的这种技巧,只是它依赖于云提供商或 minikube/docker Edge 才能正常工作。
我可以使用节点 IP 直接访问节点中的每个 pod
作为旁注,为了在裸机上执行此操作并执行 ssl 或类似操作,您需要配置自己的入口。比如说,将一个 nginx 放在特定节点上,然后引用您想要公开的所有适当服务(注意服务的 fqdn)作为上游,这些服务可以在多个节点上运行,并根据需要拥有尽可能多的 nginx - 您不需要处理具体细节,因为 k8s 负责运行。这样一来,您就有一个具有已知 IP 地址的节点点(入口 nginx),该节点可以处理传入流量并将其重定向到 k8s 内可以跨任何节点运行的服务。我对 ascii art 很烂,但会尝试一下:
(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?
...
Run Code Online (Sandbox Code Playgroud)
在上面的草图中,您在节点 0(已知 IP)上有 nginx 入口,它接受外部流量,然后将 my-service(在两个节点上的两个 pod 上运行)和 my-second-service(单个 pod)作为上游处理。您只需在服务上公开 FQDN 即可实现此功能,而无需担心特定节点的 IP 详细信息。您可以在文档中找到更多信息:https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/
为什么服务不平衡服务中已用 Pod 的负载?
--nodeport-addresses您可以更改节点代理行为。事实证明,循环是旧的 kube 代理行为,显然新的行为应该是随机的。最后,为了排除浏览器中的连接和会话问题,您是否也从匿名会话中尝试过此操作?您可能在本地缓存了 dns 吗?另外,我杀死了节点 1 中的 pod,并且在调用节点 1 时它没有使用节点 2 中的 pod。
and each Node will proxy that port (the same port number on every Node) into your Service。但如果这是您的情况,那么可能 LB 或 Ingress,甚至具有外部地址的 ClusterIP(见下文)也可以为您解决问题。如果服务是内部的(ClusterIP)...它是否对节点中的任何 Pod 进行负载平衡
绝对是的。另一件事是,您可以使用此行为在“标准”端口范围(而不是 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
Run Code Online (Sandbox Code Playgroud)
请注意,在上面的示例中,虚拟的 123.123.123.123 公开externalIPs表示我们的工作节点之一的 IP 地址。在服务中运行的 Podsvc-nginx-ingress-example根本不需要在此节点上,但当该 IP 在指定端口上命中时,它们仍然会将流量路由到它们(并在 Pod 之间进行负载平衡)。
| 归档时间: |
|
| 查看次数: |
3090 次 |
| 最近记录: |