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 free 和 Cilium 文档 - 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
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 上联系我们