暴露服务的三种方式

  • NodePort
    将服务的类型设置成NodePort-每个集群节点都会在节点上打 开 一
    个端口, 对于NodePort服务, 每个集群节点在节点本身(因此得名叫
    NodePort)上打开一个端口,并将在该端口上接收到的流量重定向到基础服务。
    该服务仅在内部集群 IP 和端口上才可访间, 但也可通过所有节点上的专用端
    口访问。
  • LoadBalane
    将服务的类型设置成LoadBalance, NodePort类型的一 种扩展,这使得
    服务可以通过一个专用的负载均衡器来访问, 这是由Kubernetes中正在运行
    云基础设施提供的(例如AWS提供)。 负载均衡器将流量重定向到跨所有节点的节点端口。
    客户端通过负载均衡器的 IP 连接到服务。
  • Ingress
    创建一 个Ingress资源, 这是一 个完全不同的机制, 通过一 个IP地址公开多
    个服务,就是一个网关入口,和springcloud的网关zuul、gateway类似。后面详细总结这个
    ————————————————
    版权声明:以上内容为CSDN博主「新林。」的原创文章

NodePort

在k8s上可以给Service设置成NodePort类型,这样的话可以让Kubernetes在其所有主机节点上开放一
个端口给外部访问(所有节点上都使用相同的端口号), 并将传入的连接转发给作为Service服务对象的
pod。这样我们的pod就可以被外部请求访问到

在这里插入图片描述

这里对外提供访问的是真实主机和端口号,下图和上图端口对应上你就会发现各自的关系
在这里插入图片描述

注:
spec.ports.nodePort这个参数是指Node节点对外开放访问的端口号,如果不指定,则Kubernetes会随机选择一个端口号

1.kubia为指定的service对象名称
2.- -port指定集群内部访问的端口
3.- -target-port指定容器内跑服务的端口
4.- -type=NodePort 指定类型 集群外部访问
5.–dry-run表示测试不在k8s运行(不会具体执行该命令)
6.-o yaml 生成yaml格式
7.最后面的 “> deploy.yaml” 表示将生成yaml内容输出到deploy.yaml文件

NodePort 会在每个节点上开启端口,服务越多端口号对外暴露的就越多,不但会造成安全风险而且难以维护,所以生产环境不建议这么使用

LoadBalane

LoadBalane是上面通过NodePort暴露外部访问的一个优化,增加了一个负载均衡器,上面的NodePort是所有节点都开放一个端口,直接给外部访问,并没有Node节点的负载均衡。LoadBalane则是在上面的基础上增加了一层,只提供一个公网ip给外部访问,外部访问这个ip再负载均衡分发给Node节点的Pod
在这里插入图片描述

注: 在云提供商上运行的Kubernetes集群通常支持从云基础架构自动提供负载平衡器。 所有需要做的就是设置服务的类型为Load
Badancer而不是NodePort。 负载均衡器拥有自己独一无二的可公开访问的 IP 地址,
并将所有连接重定向到服务。可以通过负载均衡器的 IP 地址访问服务。如果Kubemetes在不支持Load
Badancer服务的环境中运行, 则不会调配负载平衡器, 但该服务仍将表现得像 一 个NodePort服 务。
这是因为LoadBadancer服务是NodePod服务的扩展。需要云厂商提供基础服务

Ingress

采用 NodePort 方式暴露服务面临问题是,服务一旦多起来,NodePort 在每个节点上开启的端口会及其庞大,而且难以维护;如果采用LoadBalane,每个服务都得开放一个公网IP,也会很庞大。这时候Ingress暴露服务就是一种很合适的方案。可以通过一个Ingress暴露多个服务类似于nginx的功能。
在这里插入图片描述
这里我们创建了一个ingres并把不动的域名地址指向不同的service服务,而每个service服务又绑定了不同的pod。如此我们只需要一个机器入口,根据不同的域名反向解析到不同的service从而提供不通的pod服务。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-http
  namespace: dev
spec:
  rules:
  - host: nginx.itheima.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80
  - host: tomcat.itheima.com
    http:
      paths:
      - path: /
        backend:
          serviceName: tomcat-service
          servicePort: 8080

详细ingress实操请参考
我都博文Ingress

内容参考

遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
部分原文链接:https://blog.csdn.net/qq_21187515/article/details/112363072

Logo

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

更多推荐