Kubernetes网络

艺帆风顺 发布于 2025-04-02 10 次阅读


Service 存在的意义

Service引入主要是解决Pod的动态变化,提供统一访问入口:

    防止Pod失联,找到提供同一个服务的Pod(服务发现)

    定义一组Pod的访问策略(负载均衡)

编辑

Pod与Service的关联

    Service通过标签关联一组Pod

    Service为一组提供负载均衡能力

编辑

Service定义与创建

创建service

kubectl create service clusterip web --tcp=80:80

导出成yaml文件

kubectl create service clusterip web6 --tcp=80:8080 --dry-run=client -o yaml > service.yaml

编辑

然后执行

kubectl apply -f service.yaml

查看service:

kubectl get service

定义service.yaml

    apiVersion: v1kind: Servicemetadata:name: webspec:type: ClusterIP # 服务类型ports:- port: 80protocol: TCP# Service端口# 协议targetPort: 80 # 容器端口(应用程序监听端口)
    selector:app: web# 指定关联Pod的标签

    多端口Service定义

     对于某些服务,需要公开多个端口,Service也需要配置多个端口定义,通过端口名称区分

    编辑

    Service三种常用类型

    编辑

    ClusterIP

    默认, 分配一个稳定的IP地址,即VIP,只能在集群内部访问。

    编辑编辑

    编辑

    NodePort

        在每个节点上启用一个端口来暴露服务,可以在集群外部访问。也会分配一个稳定内部集群IP地址。

    访问地址:

         :

    端口范围:

         30000-32767

    编辑编辑

    NodePort

    会在每台Node上监听端口接收用户流量,在实际情况下, 对用户暴露的只会有一个IP和端口,那这么多台Node该使

    用哪台让用户访问呢?

    这时就需要前面加一个公网负载均衡器为项目提供统一访问入口了。

    编辑

      user -> 公网负载均衡器 -> service nodeport 30001 -> 分布各节点pod
      user -> 公网负载均衡器 -> service nodeport 30002 -> 分布各节点pod
      user -> 公网负载均衡器 -> service nodeport 30003 -> 分布各节点pod
      userspace

      LoadBalancer

       与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外, Kubernetes会请求底层云平台(例如阿里云、腾

      讯云、 AWS等)上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。

      编辑

      Service代理模式

      Service的底层实现主要有iptables和ipvs二种网络模式,决定了如何转发流量

      编辑

      二进制方式修改ipvs模式

        # vi kube-proxy-config.ymlmode: ipvsipvs:scheduler: "rr“
        # systemctl restart kube-proxy

        注:配置文件路径根据实际安装目录为准

        kubeadm方式修改ipvs模式

        kubectl edit configmap kube-proxy -n kube-system

        编辑

        注意:

        1、 kube-proxy配置文件以configmap方式存储

        2、如果让所有节点生效,需要重建所有节点kube-proxy pod

        编辑

        删除之后会自动拉起

        然后再node节点上查看是否启用了ipvs规则

        编辑

        流程包流程:客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod

        查看负载均衡规则

        • iptables模式
        iptables-save |grep SERVICE-NAME>
        • ipvs模式
          ipvsadm -L -nIptables 与 IPVS对比Iptables:(适合小规模)
          • 灵活,功能强大
          • 规则遍历匹配和更新,呈线性时延
          IPVS:(适合大规模)
          • 工作在内核态,有更好的性能
          • 调度算法丰富: rr, wrr, lc, wlc, ip hash,更高效

          Service DNS名称

          CoreDNS:是一个DNS服务器, Kubernetes默认采用,以Pod部署在集群中。

          CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。

          ClusterIP A记录格式

          ..svc.cluster.local

          示例: my-svc.my-namespace.svc.cluster.local

          编辑


          Ingress为弥补NodePort不足而生

          NodePort存在的不足

          • 一个端口只能一个服务使用,端口需提前规划

          • 只支持4层负载均衡

          Ingress是什么

          • Ingress: K8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法

          • Ingress Controller: 负责流量路由,根据Ingress生成具体的路由规则,并对Pod负载

          均衡

          编辑

          Ingress Controller是什么?

          Ingress管理的负载均衡器,为集群提供全局的负载均衡能力。

          使用流程:

          1. 部署Ingress Controller

          2. 创建Ingress规则

          Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。

          项目地址: https://github.com/kubernetes/ingress-nginx

          修改YAML里镜像地址为国内的: lizhenliang/ingress-nginx-controller:v1.1.0

          其他控制器: https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

          暴露Ingress Controller两种方式

          编辑

          Service NodePort暴露Ingress Controller

          编辑

          共享宿主机网络( hostNetwork:True )

          Ingress 规则配置

          创建:

          kubectl apply -f xxx.yaml

          查看:

          kubectl get ingress

          测试:本地电脑绑定hosts记录对应ingress里面配置的域名

          例: web.aliangedu.cn

          编辑

          Ingress 规则配置: HTTPS

          上传证书文件和 certs.sh脚本

          编辑

          加压后执行脚本

          配置HTTPS步骤:

          1、准备域名证书文件(来自: openssl/cfssl工具自签或者权威机构颁发)

          2、将证书文件保存到Secret

          3、 Ingress规则配置tls

          修改yaml文件

          编辑

          Ingress Controller怎么工作的?

          Ingress Controller通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段 Nginx 配置,应用到管理的Nginx服务,然后热加载生效。以此来达到Nginx负载均衡器配置及动态更新的问题。

          流程包流程:客户端 ->Ingress Controller(nginx) -> 分布在各节点Pod

          四层(传输层):基于IP和端口进行转发

          七层(应用层):基于应用层协议转发,例如HTTP:域名、URL等

          service,背后有iptables实现

          ingress,背后有ingress controller(内部是有个负载均衡技术,是什么?)实现

          kube-proxy = ingress controller

          访问流程1:

          用户(域名) ->  公网负载均衡器 80,443 -> 所有宿主机 service nodeport -> ingress controller(nginx,基于域名) -> 分布在各个节点的pod

          注: 增加service(iptables)转发,提高一点时延

          访问流程2:

          用户(域名) -> 公网负载均衡器 80,443 ->  指定宿主机 ingress controller(nginx,基于域名) -> 分布在各个节点的pod

          注:域名必须得解析到ingress controller pod所在的节点ip

          公网负载均衡器用途

          1、将内网k8s集群的service、ingress暴露到互联网

          2、提高内网k8s集群安全性

          nginx-ingress-controller 主要用于访问k8s api获取创建的ingress规则,生成nginx vhost配置并生效

          nginx 就是nginx本尊,做了一些优化和功能加强