• k8s的服务Service暴露应用


    k8s的服务Service暴露应用

    Kubernetes(k8s)是一个开源的容器编排系统,用于自动化应用部署、扩展和管理。在k8s中,Service是管理Pod访问的关键组件,它允许你定义如何访问运行在集群中的Pod。本文将详细介绍Service的概念、原理以及如何使用Service来暴露你的应用。

    Service概念

    在k8s中,Service是一种定义了一组Pod的抽象方式,这些Pod提供相同的功能。Service通过标签选择器来识别属于它的Pod,并定义了一个稳定的IP地址和端口号,这使得外部客户端可以访问这些Pod,而不需要知道它们的具体位置或数量。

    Service的类型主要有以下几种:

    • ClusterIP(默认):Service只在集群内部可见,不对外暴露。
    • NodePort:除了ClusterIP外,每个节点都会开放一个端口,可以通过:访问服务。
    • LoadBalancer:在支持的云环境中,可以自动创建一个负载均衡器,并将流量路由到Service的Pod。
    • ExternalName:通过返回CNAME和它的值,可以将Service映射到externalname字段的内容。

    Service原理

    1. 代理和查找
      Service通过代理的方式工作。当创建一个Service时,k8s会创建一个对应的代理,通常是iptables或者ipvs规则,来路由流量到正确的后端Pod。客户端请求Service的IP地址和端口时,代理会将请求转发到一个可用的Pod上。

    2. 标签选择器
      Service使用标签选择器来选择哪些Pod属于这个Service。这允许动态地添加或移除Pod,而不需要修改Service的配置。

    3. 端点切片
      当Pod被选中作为Service的一部分时,k8s会在一个内部的端点切片中记录这些Pod的IP地址。Service代理会使用这个端点切片来决定将流量路由到哪个Pod。

    4. 会话保持和负载均衡
      Service还提供了会话保持的选项,确保来自同一客户端的请求被路由到同一个Pod。此外,Service默认使用简单的轮询负载均衡策略来分配请求到后端的Pod。

    5. DNS解析
      在集群内部,Service还拥有一个DNS名称,格式为..svc.cluster.local。这使得应用可以通过DNS名称来访问Service,而不需要硬编码IP地址。

    使用Service

    下面是一个简单的Service YAML配置文件示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: MyApp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这个例子中,我们定义了一个名为my-service的Service,它将流量路由到带有标签app: MyApp的Pod上。Service监听80端口,并将流量转发到目标Pod的9376端口。

    要创建Service,可以使用kubectl apply -f service.yaml命令,其中service.yaml是保存上述配置的文件。

    暴露Service给外部客户端

    如果你想要让外部客户端能够访问你的Service,你可以使用NodePort或LoadBalancer类型的Service。

    NodePort示例

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nodeport-service
    spec:
      type: NodePort
      selector:
        app: MyApp
      ports:
        - protocol: TCP
          port: 80
          nodePort: 30080
          targetPort: 9376
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这个例子中,我们定义了一个NodePort类型的Service,它将流量通过节点的30080端口路由到Pod的9376端口。

    LoadBalancer示例

    对于LoadBalancer类型的Service,通常需要特定的云提供商支持。以下是LoadBalancer类型的Service配置示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-loadbalancer-service
    spec:
      type: LoadBalancer
      selector:
        app: MyApp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这个例子中,我们定义了一个LoadBalancer类型的Service,它将流量通过云提供商创建的负载均衡器路由到Pod的9376端口。

    总结

    Kubernetes Service是一个强大的资源对象,提供了一种简单的方式来暴露和管理对Pod的访问。通过理解Service的原理和使用方式,开发人员和运维人员可以更有效地在k8s环境中部署和管理应用,确保应用的高可用性和可扩展性。

  • 相关阅读:
    剑指 Offer 37. 序列化二叉树
    大厂面试官眼中的好简历到底长啥样
    Cookie 和 Session
    【Mysql】查询mysql的版本
    新需求:实现一个自动运维部署工具
    SSO系统设计框架搭建
    一文带你了解.NET能做什么?
    IDEA中添加servlet模板
    初识Cpp之 一、基础知识
    c++|引用
  • 原文地址:https://blog.csdn.net/qiaomuv/article/details/136817816