跳至内容

Cilium

Cilium CNI 使用称为 BPF 的 Linux 内核技术,该技术使 Linux 内核中强大的安全可见性和控制逻辑的动态插入成为可能。

在新集群上安装 Cilium

要使用 Cilium,请在集群规范中指定以下内容。

  networking:
    cilium: {}

以下命令使用 Cilium 设置集群。

export ZONES=mylistofzones
kops create cluster \
  --zones $ZONES \
  --networking cilium\
  --yes \
  --name cilium.example.com

配置 Cilium

使用 etcd 进行代理状态同步

Beta 默认
kOps 1.18 kOps 1.26

默认情况下,Cilium 将使用 CRD 来同步代理状态。这可能会在大型集群上导致性能问题。从 kOps 1.18 开始,kOps 可以使用专用于 cilium 代理状态同步的 etcd-manager 管理 etcd 集群。 Cilium 文档 包含有关何时必须启用此功能的建议。

对于新集群,您可以使用 cilium-etcd 网络提供程序

export ZONES=mylistofzones
kops create cluster \
  --zones $ZONES \
  --networking cilium-etcd \
  --yes \
  --name cilium.example.com

对于现有集群,请将以下内容添加到 spec.etcdClusters 中:确保 instanceGroup 与其他 etcd 集群匹配。您还应该启用自动压缩。

  - etcdMembers:
    - instanceGroup: master-az-1a
      name: a
    - instanceGroup: master-az-1b
      name: b
    - instanceGroup: master-az-1c
      name: c
    manager:
      env:
      - name: ETCD_AUTO_COMPACTION_MODE
        value: revision
      - name: ETCD_AUTO_COMPACTION_RETENTION
        value: "2500"
    name: cilium

重要的是,您需要对整个集群执行滚动更新,以便所有节点都可以连接到新的 etcd 集群。

kops update cluster
kops update cluster --yes
kops rolling-update cluster --force --yes

然后启用 etcd 作为 kvstore

  networking:
    cilium:
      etcdManaged: true

启用 BPF NodePort

从 kOps 1.19 开始,如果 kubernetes 版本为 1.12 或更高版本,则默认情况下会为新集群启用 BPF NodePort。从 kOps 1.18 开始,它可以安全地启用。

在此模式下,集群在没有 kube-proxy 的情况下完全正常工作,Cilium 使用 BPF 代替 kube-proxy 的 NodePort 实现。在 Cilium 文档 - kubeproxy freeCilium 文档 - NodePort 中了解更多信息

请注意,您需要使用至少具有 Linux 4.19.57 的 AMI 才能使此功能正常工作。

还要注意,虽然在现有集群上启用此功能是安全的,但禁用此功能具有破坏性,需要您运行 kops rolling-upgrade cluster --cloudonly

  kubeProxy:
    enabled: false
  networking:
    cilium:
      enableNodePort: true

如果您正在迁移现有集群,则需要在滚动更新集群之前手动滚动更新 cilium DaemonSet

kops update cluster
kops update cluster --yes
kubectl rollout restart ds/cilium -n kube-system
kops rolling-update cluster --yes

启用 Cilium ENI IPAM(仅 IPv4)

Beta 默认
kOps 1.18 kOps 1.26

您可以让 Cilium 配置 AWS 托管地址并将它们直接附加到 Pod,就像 AWS VPC 一样。查看 Cilium 文档以了解更多信息

通过设置 --networking=cilium-eni(从 kOps 1.26 开始)或在集群规范中指定以下内容来启用此功能

  networking:
    cilium:
      ipam: eni

在 1.22 之前的 kOps 版本中,当使用 ENI IPAM 时,您还需要在 Cilium 中显式禁用伪装。

  networking:
    cilium:
      disableMasquerade: true
      ipam: eni

请注意,由于 Cilium 运算符是与 EC2 API 交互以配置和附加 ENI 的实体,因此在使用此 IPAM 时,我们强制它在主节点上运行。

还要注意,此功能只在默认的 kOps AMI 上进行了测试。

在 Cilium 中启用加密(仅 IPv4)

IPsec
介绍 最低 K8s 版本
kOps 1.19 k8s 1.17

从 kOps 1.19 开始,可以为 IPv4 集群中的 Cilium 代理启用加密。为了启用加密,您必须首先使用以下命令生成预共享密钥

cat <<EOF | kops create secret ciliumpassword -f -
keys: $(echo "3 rfc4106(gcm(aes)) $(echo $(dd if=/dev/urandom count=20 bs=1 2> /dev/null| xxd -p -c 64)) 128")
EOF
以上命令将为 cilium 创建一个专用秘密,并将其存储在 kOps 秘密存储中。秘密创建后,可以通过在 spec.networking.cilium 中将 enableEncryption 选项设置为 true 来启用加密
  networking:
    cilium:
      enableEncryption: true

WireGuard
介绍 最低 K8s 版本
kOps 1.22 k8s 1.17

Cilium 可以使用 wireguard 协议进行透明加密。请务必熟悉 限制

  networking:
    cilium:
      enableEncryption: true
      enableL7Proxy: false
      encryptionType: wireguard

Cilium 中的资源

介绍 最低 K8s 版本
kOps 1.21 k8s 1.20

从 kOps 1.20 开始,可以选择为 Cilium 代理和运算符设置您自己的值。例如

  networking:
    cilium:
      cpuRequest: "25m"
      memoryRequest: "128Mi"

Hubble

介绍 最低 K8s 版本
kOps 1.20.1 k8s 1.20

Hubble 是 Cilium 的可观察性层,可用于获取对 Kubernetes 集群的网络和安全层的集群范围可见性。查看 Hubble 文档 以了解更多信息。

可以通过将以下内容添加到规范中来启用 Hubble

  networking:
    cilium:
      hubble:
        enabled: true

这将启用 Cilium 代理中的 Hubble 以及安装 hubble-relay。kOps 还将在 Cilium 代理和中继之间配置 mTLS。请注意,由于 Hubble UI 不支持 TLS,因此中继未配置为侦听安全端口。

必须单独安装 Hubble UI。

Hubble UI

Hubble UI 在 Hubble 可观察性层之上提供了一个仪表板。它允许直接在浏览器中查看服务地图和 TCP 流量。

当 Cilium 由 kOps 安装和管理时,不应使用 Cilium cli,因为它生成的配置与 kOps 管理的配置冲突(证书管理方式不同)。因此,部署 Hubble UI 可能很棘手。

幸运的是,最新版本的 Cilium Helm 图表允许单独安装 Hubble UI。查看 Cilium Helm 图表文档 中的“Helm(独立安装)”选项卡。

基本上,它需要禁用图表中的所有组件(它们已经由 kOps 管理),除了 Hubble UI,并将 hubble.ui.standalone.enabled 设置为 true

最小命令行安装应该如下所示

helm upgrade --install --namespace kube-system --repo https://helm.cilium.io cilium cilium --version 1.11.1 --values - <<EOF
agent: false

operator:
  enabled: false

cni:
  install: false

hubble:
  enabled: false

  relay:
    enabled: false

  ui:
    # enable Hubble UI
    enabled: true

    standalone:
      # enable Hubble UI standalone deployment
      enabled: true

    # ...
EOF

请注意,可以通过配置 hubble.ui.ingress 部分来为 Hubble UI 创建一个入口资源。查看 Cilium Helm 图表文档 以了解更多信息。

获取帮助

如果在部署 Cilium 时遇到问题,请在 Github 上发布问题

对于 Cilium 网络策略的支持,您可以在 Slack 或 Github 上联系我们