本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
NodePorts、LoadBalancers、Ingress有什么区别呢,它们都是将外部流量引入集群的不同实现方式。
ClusterIP(集群内部IP)
ClusterIP 服务是默认的 Kubernetes 服务。它为您提供集群内的服务,集群内的其他应用程序可以访问该服务。没有外部访问。
ClusterIP 服务的 YAML 如下所示:
kind: Service
metadata:
name: my-internal-service
spec:
selector:
app: my-app
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
如果您无法从 Internet 访问 ClusterIP 服务,我为什么要谈论它?事实证明,您可以使用 Kubernetes 代理访问它!
启动 Kubernetes proxy 模式:
$ kubectl proxy --port=8080
要访问我们上面定义的服务,你可以使用如下地址:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
NodePort(节点端口)
NodePort 服务是将外部流量直接发送到您的服务的最原始方式。NodePort,顾名思义,在所有节点(VM)上打开一个特定的端口,发送到这个端口的任何流量都会转发到服务。 NodePort 服务的 YAML 如下所示:
NodePort 服务的 YAML 如下所示:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
selector:
app: my-app
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30036
protocol: TCP
基本上,NodePort 服务与普通的ClusterIP服务有两个不同之处。首先,类型是NodePort。还有一个称为 nodePort的附加端口,用于指定要在节点上打开的端口。如果您不指定此端口,它将选择一个随机端口。大多数时候你应该让 Kubernetes 选择端口。
这种方法有很多缺点:
- 每个端口只能有一项服务
- 您只能使用端口30000–32767
- 如果您的节点/虚拟机IP地址发生变化,您需要处理。
Ingress(入口)
Ingress 实际上不是一种服务。相反,它位于多个服务的前面,充当“智能路由器”或集群的入口点。
您可以使用 Ingress 做很多不同的事情,并且有许多类型的 Ingress 控制器具有不同的功能。
默认的入口控制器将为您启动一个HTTP(S)负载均衡器(HTTP(S)负载均衡是一种基于代理的第7层负载均衡器,可让您在单个外部 IP 地址后面运行和扩缩服务)。这将使您可以对后端服务进行基于路径和基于子域的路由。
例如,您可以将 foo.yourdomain.com 上的所有内容发送到 foo 服务,并将yourdomain.com/bar/ 路径下的所有内容发送到 bar 服务。
Ingress 对象的 YAML 文件类似如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
- host: mydomain.com
http:
paths:
- path: /bar/*
backend:
serviceName: bar
servicePort: 8080
Ingress 是基于七层网络负载均衡的,七层网络负载均衡和四层网络负载均衡的区别请参考这篇文章: # 四层、七层网络负载的区别?