具有全局 IPv6 的 Kubernetes POD

发布:2024-10-18 14:35 阅读:26 点赞:0

介绍

IPv6 是互联网的未来,因为它提供了更大的地址空间、更好的安全性和改进的网络性能。Kubernetes 是一种流行的容器管理工具,也支持 IPv6。

使用 IPv4 时,Pod 需要 NAT 网关才能连接到互联网,这会使网络更加复杂且速度更慢。使用 IPv6,您可以为 Pod 提供直接全局地址,这样它们无需额外步骤即可访问互联网。

在单一云提供商中,在 Kubernetes 中启用 IPv6 很容易。但是当您尝试使用多个云提供商或裸机服务器时,情况会变得更加困难,因为每个提供商都有不同的 IPv6 前缀和子网。默认情况下,Kubernetes 只允许每个集群一个 IPv6 前缀。要为不同的 pod 使用多个前缀,您需要一个自定义解决方案。

本文将介绍如何在具有不同子网的多个云提供商之间设置具有全局 IPv6 地址的 Kubernetes。

先决条件

我们将使用Talos作为我们的 Kubernetes 发行版。Talos 是专为 Kubernetes 构建的现代操作系统。它被设计为安全、不可更改(immutable)和用户友好的。如果您不熟悉 Talos,可以访问官方网站了解更多信息。

准备环境

我希望您熟悉 Talos,并且知道如何创建 Talos 集群。
我将向您展示需要在默认 Talos 配置中进行哪些更改才能为 Pod 启用全局 IPv6 地址。

将以下配置复制并粘贴到文件中controller.yamlall.yaml

# controller.yaml
machine:
  features:
    kubernetesTalosAPIAccess:
      enabled: true
      allowedRoles:
        - os:reader
      allowedKubernetesNamespaces:
        - kube-system
cluster:
  network:
    cni:
      name: none
  controllerManager:
    extraArgs:
      node-cidr-mask-size-ipv4: "24"
      node-cidr-mask-size-ipv6: "112"
      controllers: "*,tokencleaner,-node-ipam-controller"
 
# all.yaml
machine:
  kubelet:
    extraArgs:
      cloud-provider: external
cluster:
  network:
    podSubnets: ["10.0.0.0/12","fd40:10::/96"]
    serviceSubnets: ["10.100.0.0/22","fd40:10:100::/112"]
 

使用以下命令生成 Talos 配置:

talosctl gen config --config-patch @all.yaml --config-patch-control-plane @controller.yaml --with-kubespan --with-docs=false --with-examples=false cluster-v6 https://localhost:6443
 

这些变化将:

  • 通过使用 IPv6 地址定义 podSubnets 和 serviceSubnets 来启用 IPv6。
  • 通过设置控制器选项禁用默认节点 IPAM 控制器:"*,tokencleaner,-node-ipam-controller"
  • 应用 Talos CCM 所需的设置,查看 talos 功能和 kubelet 参数。

部署集群

如何使用 Talos 映像创建 VM 超出了本文的范围。请参阅官方文档以获取指导。引导控制平面后,下一步是部署Talos CCM以及CNI plugin

Talos 控制模块

首先,我们需要部署 Talos CCM。

# Helm values talos-ccm.yaml
enabledControllers:
  - cloud-node
  - node-ipam-controller

extraArgs:
  - --allocate-node-cidrs
  - --cidr-allocator-type=CloudAllocator
  - --node-cidr-mask-size-ipv4=24
  - --node-cidr-mask-size-ipv6=80

daemonSet:
  enabled: true

tolerations:
  - effect: NoSchedule
    operator: Exists
 

使用以下命令安装 Talos CCM:

helm upgrade -i --namespace=kube-system -f talos-ccm.yaml talos-cloud-controller-manager \
        oci://ghcr.io/siderolabs/charts/talos-cloud-controller-manager
 

Talos CCM 将收集云提供商提供的节点网络信息,并从节点的 IPv6 子网中分配 CIDR 块。
这意味着您的 Pod 和节点将位于同一个 IPv6 子网中。

使用以下命令检查 pod CIDR:

kubectl get nodes -o jsonpath='{.items[*].spec.podCIDRs}'; echo
 

CNI 插件

其次,我们需要部署 CNI 插件。
我们将使用 Cilium 作为 CNI 插件。
部署 Cilium 的 Helm 值如下:

# Helm values cilium.yaml
k8sServiceHost: "localhost"
k8sServicePort: "7445"

cni:
  install: true

ipam:
  mode: "kubernetes"
k8s:
  requireIPv4PodCIDR: true
  requireIPv6PodCIDR: true

enableIPv6Masquerade: false
enableIPv4Masquerade: true

cgroup:
  autoMount:
    enabled: false
  hostRoot: /sys/fs/cgroup

securityContext:
  privileged: true
 

使用以下命令安装 cilium:

helm upgrade -i --namespace=kube-system --version=1.16.2 -f cilium.yaml cilium cilium/cilium
 

现在,您可以从任何云提供商或裸机服务器向集群添加更多节点。Talos
云控制器管理器 (CCM) 将自动收集每个新节点的网络信息,CNI 插件 (Cilium) 将处理网络路由,确保 Pod 和节点都保持在同一个 IPv6 子网中。此设置允许跨多个环境无缝扩展。

测试部署

使用以下命令创建一个 pod:

kubectl run -it --rm --restart=Never --image=ghcr.io/sergelogvinov/curl:latest curl -- sh
 

使用以下命令检查 pod IP 地址:

ip a
curl -6 icanhazip.com
 

现在您应该可以看到分配给每个 Pod 的全局 IPv6 地址。
通过此设置,您可以从集群中的另一个 Pod 甚至直接从互联网 ping 该 Pod 的 IPv6 地址,因为全局 IPv6 地址允许直接通信而无需 NAT。

ping6 <pod-ipv6-address>
 

检查节点和 pod CIDR:

kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="InternalIP")]}{.address}{"\n"}{end}' | grep ':'; echo
kubectl get nodes -o jsonpath='{range .items[*].spec}{.podCIDRs}{"\n"}{end}'; echo
 

具有 5 个节点的输出应如下所示:

2001:a:b:2875::7952
2a00:a:0:1c4::64
2a09:a:f:42f6::1
2a02:a:152:202::100
2a02:a:153:201::100

["10.0.0.0/24","2001:a:b:2875::/80"]
["10.0.11.0/24","2a00:a:0:1c4::/80"]
["10.0.4.0/24","2a09:a:f:42f6::/80"]
["10.0.13.0/24","2a02:a:152:202::100/121"]
["10.0.12.0/24","2a02:a:153:201::100/121"]
 

节点 IPv6 地址来自不同的子网,但 Pod CIDR 分配自与节点相同的子网。这确保每个节点都有自己唯一的 IPv6 子网,而每个节点上的 Pod 与节点本身共享同一个子网。

结论

我们已成功部署具有全局 IPv6 地址的 Kubernetes Pod。现在您可以直接从互联网 ping 这些 Pod,因为它们具有全局 IPv6 地址。
这些 Pod 还可以直接访问互联网,而无需 NAT 网关,从而简化网络并提高性能。

请记住对 Pod 和节点设置防火墙,以保护它们免受互联网上未经授权的访问。
确保实施适当的防火墙规则对于维护 Kubernetes 集群的安全性至关重要,尤其是在使用允许直接访问互联网的全局 IPv6 地址时。