K8s三种常用service类型及Ingress域名

ClusterIP(集群内部使用)

Services 通过使用 labels 直接指向 pods,而不是指向 deployments 或者 replicasets。这种设计的灵活性极高,因为创建 pods 的方式有很多,而 Service 不需要关心 pods 通过哪种方式创建。service 不像 pod 会调度到特定的 node 上,可以假定service 仅在整个集群的内存中生效。集群中的所有 pod 都能通过 http://1.1.10.1:3000 或者 http://service-python:3000 访问到 python pod 的 443 端口。service-python 这个 ClusterIP 类型的 service 将基于随机或者轮询方式分发请求。这就是 ClusterIP 类型的 service 要做的事情,它能够让集群中的 pod 通过一个名字或者 IP 达到可用性。

apiVersion: v1
kind: Service
metadata:
    name: service-python
spec:
    ports:
    - port: 3000
      protocol: TCP
      targetPort: 443
    selector:
      run: pod-python
    type: ClusterIP

ClusterIP

运行命令 kubectl get svc,结果如下:
ClusterIP

NodePort(对外暴露应用)

现在我们想让 ClusterIP 类型的 service 在集群外部也能够使用,所以将其转换成 NodePort 类型的 service。

apiVersion: v1
kind: Service
metadata:
  name: service-python
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 443
    nodePort: 30080
  selector:
    run: pod-python
  type: NodePort

通过 node-2 的外部请求

运行命令 kubectl get svc,结果展示了相同的 cluster ip,但类型显示不一样了,而且多了个额外的 NodePort 端口。

NodePort

LoadBalancer(对外暴露应用,该功能得公有云支持才能使用)

当我们想通过一个 IP 地址将请求分发到所有 node 节点的外部 IP 地址时,可以使用 LoadBalancer 类型的 service。因此,它是构建于 NodePort 类型的 service 之上。

LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: service-python
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 443
    nodePort: 30080
  selector:
    run: pod-python
  type: LoadBalance

LoadBalancer类型的 service 所要做的就是创建一个 NodePort 类型的 service,然后发消息给部署 Kubernetes 集群的云服务提供商,请求其为所有 node 节点的外部 IP 地址以及设定的 NodePort 端口配置负载均衡。如果云服务提供商不支持这类请求消息的处理,任何事情都不会发生,LoadBalancer 类型的 service 就会和 NodePort 类型一样了。

运行命令 kubectl get svc,结果仅多展示了一个 EXTERNAL-IP 字段以及不同的类型。
LoadBalancer

LoadBalancer 类型的 service 同样会在所有 node 节点内外 IP 地址上开放 30080 端口。在集群内部,它和 ClusterIP 类型的 service 作用一样。

port targetPort nodePort说明

port:暴露给k8s集群内部服务访问的端口

targrtport:容器自身暴露的端口

nodeport:暴露给k8s集群外部流量访问的端口

Ingress域名

Ingress为弥补NodePort不足而生,NodePort一个端口只能一个服务使用,所有节点都会启用该端口监听,需提前规划,并且NodePort只支持4层负载均衡。

Pod与Ingress的关系:通过service相关联,通过Ingress Controller实现Pod的负载均衡,支持TCP/UDP4层和HTTP7层代理。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐