K3s 是一个轻量级的 Kubernetes 发行版,它简化了 Kubernetes 的安装和管理,同时保持了与 Kubernetes API 的兼容。在 K3s 中,服务发现与负载均衡的机制与标准的 Kubernetes 非常相似。以下是 K3s 中节点内服务发现与负载均衡的主要机制:

服务发现

  1. Kubernetes 服务 (Service)

    • Kubernetes 服务 (Service) 是一种抽象,它定义了一组逻辑上相同的 Pods 以及一个访问它们的策略。
    • 每个服务都有一个 DNS 名称,这个名称由 Kubernetes 内置的 DNS 服务器解析。
    • 当应用程序需要访问另一个服务时,可以直接使用这个 DNS 名称。
  2. Kube-DNS/CoreDNS

    • K3s 使用 CoreDNS 作为默认的 DNS 服务器,它负责解析 Kubernetes 服务的 DNS 名称。
    • CoreDNS 会根据 Kubernetes 的服务和端点信息,动态生成 DNS 记录,以便在 Pod 内部进行服务发现。

负载均衡

  1. ClusterIP 服务

    • ClusterIP 是 Kubernetes 的默认服务类型。它通过分配一个虚拟 IP 地址(ClusterIP),使服务在集群内部可达。
    • 当客户端(Pod)访问这个 ClusterIP 地址时,Kube-proxy 会根据负载均衡策略(如轮询)将流量分配到后端的 Pod。
  2. Kube-proxy

    • Kube-proxy 是 Kubernetes 集群中的一个网络代理,它维护网络规则并执行服务的负载均衡。
    • Kube-proxy 支持多种模式,如 iptables、ipvs 和用户空间模式。在 K3s 中,Kube-proxy 默认使用 iptables 模式。
    • 每当有服务或端点变化时,Kube-proxy 会更新相应的网络规则,以确保流量能够正确地分发到后端的 Pod。
  3. NodePort 服务

    • NodePort 服务在每个节点上开放一个特定的端口,并将流量转发到服务的后端 Pod。
    • 这种方式使得服务能够通过集群外部的 IP 地址和端口进行访问。
  4. LoadBalancer 服务

    • LoadBalancer 服务使用外部负载均衡器(如云提供商的负载均衡器)将流量分发到服务的后端 Pod。
    • 在 K3s 中,如果没有云提供商的负载均衡器,可以使用像 MetalLB 这样的开源解决方案来提供负载均衡功能。

示例

以下是一个简单的示例,展示如何在 K3s 中创建一个服务,并通过 ClusterIP 进行服务发现和负载均衡:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: my-app-image
          ports:
            - containerPort: 8080

在这个示例中:

  1. 定义了一个 Service,名字是 my-service,它选择标签为 app: my-app 的 Pod,并将流量从端口 80 转发到 Pod 的端口 8080。
  2. 定义了一个 Deployment,名字是 my-app,包含 3 个副本,每个副本运行 my-app-image 容器,容器监听 8080 端口。

通过这种方式,K3s 内部的 Pod 可以通过 my-service 的 DNS 名称访问该服务,Kube-proxy 会负责将流量负载均衡到 3 个副本中。

更多推荐