K3s 是一个轻量级的 Kubernetes 发行版,它简化了 Kubernetes 的安装和管理,同时保持了与 Kubernetes API 的兼容。在 K3s 中,服务发现与负载均衡的机制与标准的 Kubernetes 非常相似。以下是 K3s 中节点内服务发现与负载均衡的主要机制:
服务发现
-
Kubernetes 服务 (Service)
- Kubernetes 服务 (Service) 是一种抽象,它定义了一组逻辑上相同的 Pods 以及一个访问它们的策略。
- 每个服务都有一个 DNS 名称,这个名称由 Kubernetes 内置的 DNS 服务器解析。
- 当应用程序需要访问另一个服务时,可以直接使用这个 DNS 名称。
-
Kube-DNS/CoreDNS
- K3s 使用 CoreDNS 作为默认的 DNS 服务器,它负责解析 Kubernetes 服务的 DNS 名称。
- CoreDNS 会根据 Kubernetes 的服务和端点信息,动态生成 DNS 记录,以便在 Pod 内部进行服务发现。
负载均衡
-
ClusterIP 服务
- ClusterIP 是 Kubernetes 的默认服务类型。它通过分配一个虚拟 IP 地址(ClusterIP),使服务在集群内部可达。
- 当客户端(Pod)访问这个 ClusterIP 地址时,Kube-proxy 会根据负载均衡策略(如轮询)将流量分配到后端的 Pod。
-
Kube-proxy
- Kube-proxy 是 Kubernetes 集群中的一个网络代理,它维护网络规则并执行服务的负载均衡。
- Kube-proxy 支持多种模式,如 iptables、ipvs 和用户空间模式。在 K3s 中,Kube-proxy 默认使用 iptables 模式。
- 每当有服务或端点变化时,Kube-proxy 会更新相应的网络规则,以确保流量能够正确地分发到后端的 Pod。
-
NodePort 服务
- NodePort 服务在每个节点上开放一个特定的端口,并将流量转发到服务的后端 Pod。
- 这种方式使得服务能够通过集群外部的 IP 地址和端口进行访问。
-
LoadBalancer 服务
- LoadBalancer 服务使用外部负载均衡器(如云提供商的负载均衡器)将流量分发到服务的后端 Pod。
- 在 K3s 中,如果没有云提供商的负载均衡器,可以使用像 MetalLB 这样的开源解决方案来提供负载均衡功能。
示例
以下是一个简单的示例,展示如何在 K3s 中创建一个服务,并通过 ClusterIP 进行服务发现和负载均衡:
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 8080type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-appimage: my-app-imageports:- containerPort: 8080
在这个示例中:
- 定义了一个
Service
,名字是my-service
,它选择标签为app: my-app
的 Pod,并将流量从端口 80 转发到 Pod 的端口 8080。 - 定义了一个
Deployment
,名字是my-app
,包含 3 个副本,每个副本运行my-app-image
容器,容器监听 8080 端口。
通过这种方式,K3s 内部的 Pod 可以通过 my-service
的 DNS 名称访问该服务,Kube-proxy 会负责将流量负载均衡到 3 个副本中。