svc相当于一个代理服务,svc有多种包括:clusterIP nodeport loadbalancer Ingress
ClusterIP
ClusterIP服务是k8s默认的服务。给你一个集群内的服务,集群内的其他应用都可以访问该服务,集群外部无法访问它。
如果从Internet无法访问ClusterIP服务,那么我们可以通过kubernetes的proxy模式来访问该服务
启动kubernetes proxy模式
kubectl proxy --port=8080
使用环境:服务无法暴露到internet上。
NodePort
NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有node节点上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。
NodePort这种方式会在指定节点上开发一个端口,这个端口可以是用户指定的,也可以是随机生成的,但是它是有缺点的:
• 每个端口只能是一种服务
• 端口范围只能是 30000-32767
• 如果节点/VM 的 IP 地址发生变化,你访问的应用地址也要修改。
• nodeport只支持4层调度
• 服务多是端口会越来越多不好管理
基于以上原因,我不建议在生产环境上用这种方式暴露服务。如果你运行的服务不要求一直可用,或者对成本比较敏感,你可以使用这种方法。这样的应用的最佳例子是 demo 应用,或者某些临时应用。
LoadBalancer
何时使用这种方式?
如果你想要直接暴露服务,这就是默认方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。这个方式的最大缺点是每启动一个svc都会暴露一个 LoadBalancerIP,而且每个用到的 LoadBalancer 都需要付费,这将是非常昂贵的。
Ingress
有别于以上所有例子,Ingress 事实上不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。
你可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力。
GKE 上的默认 ingress 控制器是启动一个 HTTP(S) Load Balancer。它允许你基于路径或者子域名来路由流量到后端服务。例如,你可以将任何发往域名 foo.yourdomain.com 的流量转到 foo 服务,将路径 yourdomain.com/bar/path 的流量转到 bar 服务。
何时使用这种方式?
Ingress 可能是暴露服务的最强大方式,但同时也是最复杂的。Ingress 控制器有各种类型,包括 Google Cloud Load Balancer, Nginx,Contour,Istio,等等。它还有各种插件,比如 cert-manager,它可以为你的服务自动提供 SSL 证书。如果你想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议(典型如 HTTP),那么Ingress 就是最有用的。如果你使用本地的 GCP 集成,你只需要为一个负载均衡器付费,且由于 Ingress是“智能”的,你还可以获取各种开箱即用的特性(比如 SSL,认证,路由,等等)。