如何为 DigitalOcean 静态路由 Operator 设置故障转移

0 股票
0
0
0
0

介绍

静态路由操作符的主要目的是为 Kubernetes 环境中的网络流量提供更大的灵活性和控制力。它允许您微调路由配置,以满足应用程序需求并优化网络性能。它以 DaemonSet 的形式部署,因此会在 DigitalOcean 管理的 Kubernetes 集群的每个节点上运行。.

在本教程中,您将学习如何根据 CRD 规范管理每个工作节点的路由表,并设置故障转移网关。.

本教程的主要目标是展示如何根据 CRD 规范管理每个工作节点的路由表,并设置故障转移网关。.

先决条件
  • 您拥有访问权限的由 DigitalOcean 管理的 Kubernetes 集群。.
  • 已在本地计算机上安装 Kubectl CLI(配置为指向 DigitalOcean 管理的 Kubernetes 集群)
  • NAT GW Droplets(2 个或更高版本)的配置和实施详见此处。.
  • 创建一个针对网关 Droplet 的故障检测系统,该系统需根据用户需求量身定制,确保检测结果清晰准确,并将误报率降至最低。可以使用 Prometheus 或 Nagios 等监控服务,在 Droplet 中设置健康检查端点,或使用 Alertmanager 等告警工具进行通知。为此,您可以从我们的应用市场购买监控堆栈。.

下图为架构图:

部署 Kubernetes 静态路由操作符

使用 kubectl 将最新版本的静态路由操作符部署到 DigitalOcean 管理的 Kubernetes 集群:

kubectl apply -f https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/releases/v1/k8s-staticroute-operator-v1.0.0.yaml
检查操作员舱是否已启动并运行:

我们来检查一下操作员 pod 是否已启动并运行。.

“bash kubectl get staticroutes -o wide -n staticroutes

The output looks similar to the below:
```bash
[secondary_label Output]
NAME AGE DESTINATIONS GATEWAY
static-route-ifconfig.me 119s ["XX.XX.XX.XX"] XX.XX.XX.XX
static-route-ipinfo.io 111s ["XX.XX.XX.XX"] XX.XX.XX.XX

现在我们来检查操作员报告,应该不会报告任何异常情况:

kubectl logs -f ds/k8s-staticroute-operator -n static-routes

您应该看到以下输出:

Output
Found 2 pods, using pod/k8s-staticroute-operator-498vv
[2023-05-15 14:12:32,282] kopf._core.reactor.r [DEBUG ] Starting Kopf 1.35.6.
[2023-05-15 14:12:32,282] kopf._core.engines.a [INFO ] Initial authentication has been initiated.
[2023-05-15 14:12:32,283] kopf.activities.auth [DEBUG ] Activity 'login_via_pykube' is invoked.
[2023-05-15 14:12:32,285] kopf.activities.auth [DEBUG ] Pykube is configured in cluster with service account.
[2023-05-15 14:12:32,286] kopf.activities.auth [INFO ] Activity 'login_via_pykube' succeeded.
[2023-05-15 14:12:32,286] kopf.activities.auth [DEBUG ] Activity 'login_via_client' is invoked.
[2023-05-15 14:12:32,287] kopf.activities.auth [DEBUG ] Client is configured in cluster with service account.
[2023-05-15 14:12:32,288] kopf.activities.auth [INFO ] Activity 'login_via_client' succeeded.
[2023-05-15 14:12:32,288] kopf._core.engines.a [INFO ] Initial authentication has finished.
[2023-05-15 14:12:32,328] kopf._cogs.clients.w [DEBUG ] Starting the watch-stream for customresourcedefinitions.v1.apiextensions.k8s.io cluster-wide.
[2023-05-15 14:12:32,330] kopf._cogs.clients.w [DEBUG ] Starting the watch-stream for staticroutes.v1.networking.digitalocean.com cluster-wide.

为减轻网关故障的影响,建议准备一个备用网关,以便在必要时进行故障转移。虽然运营商目前不支持真正的高可用性 (HA),但执行故障转移有助于最大限度地减少服务中断时间。.

假设您有一个指定的目标 IP 地址 34.160.111.145,它代表活动网关或主网关,其 IP 地址为 10.116.0.4,负责转发流量。此信息存储在 primary.yaml 文件中。.

apiVersion: networking.digitalocean.com/v1
kind: StaticRoute
metadata:
name: primary
spec:
destinations: 
- "34.160.111.145"
gateway: "10.116.0.4"

此外,您还将拥有一个备用或辅助网关,其 IP 地址为 10.116.0.12,用于处理来自同一目标 IP 地址的流量。secondary.yaml 文件中的 StaticRoute 定义与主网关的定义完全相同,只是网关 IP 地址(和对象名称)有所不同。这些信息存储在 secondary.yaml 文件中。.

apiVersion: networking.digitalocean.com/v1
kind: StaticRoute
metadata:
name: secondary
spec:
destinations: 
- "34.160.111.145"
gateway: "10.116.0.12"

实际的故障过程包括以下步骤:

  • 检测到 IP 地址为 10.116.0.5 的活动网关已关闭。.
  • 删除当前活动的静态路由。.
  • 应用现成的静态路由。.

删除活动静态路由

现在让我们删除当前活动的静态路由。.

kubectl delete -f primary.yaml

等待 30-60 秒,以便每个运算符实例有足够的时间处理对象删除操作。也就是说,响应操作后,需要从所有节点中删除该路径。.

应用备用静态路由

让我们启用辅助静态路由。.

 kubectl apply -f secondary.yaml

操作员必须选择新的备用静态路由,并插入相应的路由表条目。之后,故障转移即完成。.

设置测试

每个 CRD 实例都会创建一条静态路由,指向两个报告您公网 IP 地址的网站:ifconfig.me/ip 和 ipinfo.io/ip。典型的静态路由定义如下所示:

apiVersion: networking.digitalocean.com/v1
kind: StaticRoute
metadata:
name: static-route-ifconfig.me
spec:
destinations: 
- "34.160.111.145"
gateway: "10.116.0.5"

要测试这些设置,请从示例位置下载示例清单:

ifconfig.me 和 ipinfo.io 的示例-

curl -O https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/examples/static-route-ifconfig.me.yaml
curl -O https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/examples/static-route-ipinfo.io.yaml

下载清单文件后,将每个清单文件替换为 <>。然后,使用 kubectl 应用每个清单文件:

kubectl apply -f static-route-ifconfig.me.yaml
kubectl apply -f static-route-ipinfo.io.yaml

最后,检查 curl-test pod 是否对每条路由的 NAT 网关公网 IP 地址做出响应:

kubectl exec -it curl-test -- curl ifconfig.me/ip
kubectl exec -it curl-test -- curl ipinfo.io/ip

在故障转移测试期间,您应该使用相同的测试。在主网关服务器故障转移期间,结果应为 NAT 网关提供主服务器的公网 IP 地址;在备用服务器故障转移期间,结果应提供备用服务器 NAT 网关的公网 IP 地址。.

故障排除

您应该检查 StaticRoute 对象:如果发生错误,首先在规则适用的每个节点的静态路由事件中查找错误。.

kubectl get StaticRoute <static-route-name> -o yaml

查看日志:要深入查找错误,您可以查看静态路由操作日志。.

kubectl logs -f ds/k8s-staticroute-operator -n static-routes

擦除

要移除该操作符及其相关资源,请运行以下 kubectl 命令(请确保使用与安装期间相同的版本):

kubectl delete -f deploy https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/releases/v1/k8s-staticroute-operator-v1.0.0.yaml

输出结果类似:

customresourcedefinition.apiextensions.k8s.io "staticroutes.networking.digitalocean.com" deleted
serviceaccount "k8s-staticroute-operator" deleted
clusterrole.rbac.authorization.k8s.io "k8s-staticroute-operator" deleted
clusterrolebinding.rbac.authorization.k8s.io "k8s-staticroute-operator" deleted
daemonset.apps "k8s-staticroute-operator" deleted

现在,如果您测试相同的 curl 命令,您将获得工作节点的 IP 地址作为输出:

kubectl exec -it curl-test -- curl ifconfig.me/ip
kubectl exec -it curl-test -- curl ipinfo.io/ip 

现在检查工作节点的公网 IP 地址:

kubectl get nodes -o wide

结果

即使无法完全支持真正的高可用性 (HA),实施故障转移功能也是减少网关故障影响的推荐方法。.

通过配备备用网关以便在需要时进行故障转移,企业可以显著缩短服务中断时间。.

部署备用网关至关重要,它能确保在发生故障时实现平稳过渡。虽然具体实施方案可能因需求而异,但优先考虑故障应对措施有助于维持可靠、不间断的服务交付。.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

您可能也喜欢