先决条件
- 您需要准备一个安装了 PorterLB 的 Kubernetes 集群。所有 Kubernetes 集群节点必须在同一个二层网络上(在同一个路由器下)。
- 您需要准备一台客户端机器,用于验证PorterLB在二层模式下是否正常工作。客户端计算机需要与 Kubernetes 集群节点位于同一网络上。
- 第 2 层模式要求您的基础架构环境允许匿名 ARP/NDP 数据包。如果 PorterLB 安装在基于云的 Kubernetes 集群中进行测试,您需要与您的云供应商确认是否允许匿名 ARP/NDP 数据包。如果不是,则不能使用二层模式。
本文档以以下设备为例:
设备名称 | IP地址 | MAC地址 | 描述 |
---|---|---|---|
master1 | 192.168.0.2 | 52:54:22:a3:9a:d9 | Kubernetes cluster master |
worker-p001 | 192.168.0.3 | 52:54:22:3a:e6:6e | Kubernetes cluster worker 1 |
worker-p002 | 192.168.0.4 | 52:54:22:37:6c:7b | Kubernetes cluster worker 2 |
i-f3fozos0 | 192.168.0.5 | 52:54:22:fa:b9:3b | Client machine |
Step 1: Enable strictARP for kube-proxy
1.使用 kubectl 安装 PorterLB
下载配置文件并修改image标签指定为自己私有仓库地址
下载配置文件
https://raw.githubusercontent.com/kubesphere/porter/master/deploy/porter.yaml
修改porter.yaml配置
image: 192.168.28.150:8001/kubesphere-install/docker.io/jettech/kube-webhook-certgen:v1.5.0
kubectl apply -f porter.yaml
运行以下命令查看 porter-manager 的状态是否为READY : 1/1和STATUS : Running。如果是,则说明 PorterLB 安装成功。
kubectl get po -n porter-system
2.使用 kubectl 删除 PorterLB
2.1.要删除 PorterLB,请登录 Kubernetes 集群并运行以下命令:
kubectl delete -f porter.yaml
在删除 PorterLB 之前,必须先删除所有使用 PorterLB 的服务。
2.2.运行以下命令查看结果。如果 porter-system 命名空间不存在,则表示已成功删除 PorterLB。
kubectl get ns
3.在第 2 层模式下使用 PorterLB
先决条件
- 您需要准备一个安装了 PorterLB 的 Kubernetes 集群。所有 Kubernetes 集群节点必须在同一个二层网络上(在同一个路由器下)。
- 您需要准备一台客户端机器,用于验证PorterLB在二层模式下是否正常工作。客户端计算机需要与 Kubernetes 集群节点位于同一网络上。
第 2 层模式要求您的基础架构环境允许匿名 ARP/NDP 数据包。如果 PorterLB 安装在基于云的 Kubernetes 集群中进行测试,您需要与您的云供应商确认是否允许匿名 ARP/NDP 数据包。如果不是,则不能使用二层模式。
4.第 1 步:为 kube-proxy 启用strictARP
二层模式下,需要为kube-proxy开启strictARP,让Kubernetes集群中的所有网卡停止响应其他网卡的ARP请求,由PorterLB处理ARP请求。
4.1.登录Kubernetes集群,运行以下命令编辑kube-proxy ConfigMap:
kubectl edit configmap kube-proxy -n kube-system
4.2.在 kube-proxy ConfigMap YAML 配置中,设置data.config.conf.ipvs.strictARP为true.
ipvs: strictARP: true
4.3.运行以下命令重启 kube-proxy:
kubectl rollout restart daemonset kube-proxy -n kube-system
5.指定用于 PorterLB 的 NIC
如果安装PorterLB的节点有多个网卡,则需要指定二层模式下PorterLB使用的网卡。如果节点只有一个网卡,可以跳过此步骤。
本例中安装PorterLB的master1节点有两个网卡(eth0 192.168.0.2和eth1 192.168.1.2),PorterLB将使用eth0 192.168.0.2。
运行以下命令注释master1以指定网卡:kubectl annotate nodes master1 layer2.porter.kubesphere.io/v1alpha1="192.168.0.2"
6.创建 Eip 对象
6.1.运行以下命令为 Eip 对象创建一个 YAML 文件:
vi porter-layer2-eip.yaml
6.2.将以下信息添加到 YAML 文件中:
apiVersion: network.kubesphere.io/v1alpha2 kind: Eip metadata: name: porter-layer2-eip spec: address: 192.168.0.91-192.168.0.100 interface: eth0 protocol: layer2
中指定的IP地址spec:address必须与Kubernetes集群节点在同一网段。
Eip YAML 配置中的字段的详细信息,请参阅使用 Eip 配置 IP 地址池。
6.3.运行以下命令以创建 Eip 对象:
kubectl apply -f porter-layer2-eip.yaml
7.创建部署
下面使用 luksa/kubia 映像创建两个 Pod 的部署。每个 Pod 将自己的 Pod 名称返回给外部请求。
7.1.运行以下命令为部署创建 YAML 文件:
vi porter-layer2.yaml
7.2.将以下信息添加到 YAML 文件中:
apiVersion: apps/v1 kind: Deployment metadata: name: porter-layer2 spec: replicas: 2 selector: matchLabels: app: porter-layer2 template: metadata: labels: app: porter-layer2 spec: containers: - image: 192.168.28.150:8001/kubesphere-install/luksa/kubia:latest name: kubia ports: - containerPort: 8080
7.3.运行以下命令以创建部署:
kubectl apply -f porter-layer2.yaml
8.创建服务
8.1.运行以下命令为服务创建 YAML 文件:
vi porter-layer2-svc.yaml
8.2.将以下信息添加到 YAML 文件中:
kind: Service apiVersion: v1 metadata: name: porter-layer2-svc annotations: lb.kubesphere.io/v1alpha1: porter protocol.porter.kubesphere.io/v1alpha1: layer2 eip.porter.kubesphere.io/v1alpha2: porter-layer2-eip spec: selector: app: porter-layer2 type: LoadBalancer ports: - name: http port: 80 targetPort: 8080 externalTrafficPolicy: Cluster
笔记
您必须设置spec:type为LoadBalancer.
- 该lb.kubesphere.io/v1alpha1: porter服务使用PorterLB注解指定。
- 该protocol.porter.kubesphere.io/v1alpha1: layer2注解指定 PorterLB 用于二层模式。
- 该eip.porter.kubesphere.io/v1alpha2: porter-layer2-eip注解指定了 PorterLB 使用的 Eip 对象。如果没有配置这个注解,PorterLB 会自动使用第一个匹配协议的可用 Eip 对象。您还可以删除此注释并添加spec:loadBalancerIP字段(例如,spec:loadBalancerIP: 192.168.0.91)以将特定 IP 地址分配给服务。
- 如果spec:externalTrafficPolicy设置为Cluster(默认值),PorterLB 会从所有 Kubernetes 集群节点中随机选择一个节点来处理 Service 请求。也可以通过 kube-proxy 访问其他节点上的 Pod。
- 如果spec:externalTrafficPolicy设置为Local,PorterLB 会在 Kubernetes 集群中随机选择一个包含 Pod 的节点来处理 Service 请求。只能访问选定节点上的 Pod。
8.3.运行以下命令来创建服务:
kubectl apply -f porter-layer2-svc.yaml
9.在第 2 层模式下验证 PorterLB
下面验证 PorterLB 是否正常运行。9.1.在Kubernetes集群中,运行以下命令获取Service的外部IP地址:
kubectl get svc porter-layer2-svc
9.2.在Kubernetes集群中,执行以下命令获取集群节点的IP地址:
kubectl get nodes -o wide
9.3.在 Kubernetes 集群中,运行以下命令检查 Pod 的节点:
kubectl get po -o wide
笔记
在这个例子中,Pod 被自动分配到不同的节点。您可以手动将 Pod 分配给不同的节点。9.4.在客户端机器上,运行以下命令来ping服务IP地址并检查IP邻居:
ping 192.168.0.91
ip neigh
- ip neigh命令输出中Service IP地址192.168.0.91的MAC地址与worker-p001 192.168.0.3的MAC地址相同。因此,PorterLB 已经将 Service IP 地址映射到 worker-p001 的 MAC 地址。
9.5.在客户端机器上,运行以下命令来访问服务:
如果spec:externalTrafficPolicy在服务 YAML 配置中设置为Cluster,则可以访问两个 Pod。curl 192.168.0.91
如果spec:externalTrafficPolicy在Service YAML配置中设置为Local,则只能到达PorterLB选择的节点上的Pod。