跳到主要内容
版本:v2.0.4

Helm Charts

下面会解释如何在 Kubernetes 集群内部署 Dragonfly。 Dragonfly 部署具体模块包括 4 部分: scheduler 和 seed peer 会作为 StatefulSets 部署, dfdaemon 会作为 DaemonSets 部署, manager 会作为 Deployments 部署。

依赖条件

  • Kubernetes cluster 1.20+
  • Helm v3.8.0+

Helm Chart 运行时配置

当使用 Helm Chart 运行时配置时,可以忽略 运行时配置 章节。 因为 Helm Chart 安装时会自动帮助改变 Docker、Containerd 等配置, 无需再手动配置。

1. Docker

不推荐在 docker 环境中使用蜻蜓:1. 拉镜像没有 fallback 机制,2. 在未来的 Kubernetes 中已经废弃。 因为当前 Kubernetes 里的 daemonset 并不支持 Surging Rolling Update 策略, 一旦旧的 dfdaemon pod 被删除后,新的 dfdaemon 就再也拉取不了了。 如果无法更换容器运行时的话,那在升级蜻蜓的时候,请从下面两种方案选择比较适合的: 选项 1:先手动拉取新的 dfdaemon 镜像,或者使用 ImagePullJob 去自动拉取。 选项 2:保持蜻蜓的镜像中心和通用的镜像中心不一样,同时将蜻蜓镜像中心相关的 host 加入 containerRuntime.docker.skipHosts

Dragonfly Helm 支持自动更改 docker 配置。

情况 1:【推荐的】支持指定仓库

定制 values.yaml 文件:

containerRuntime:
docker:
enable: true
# -- Inject domains into /etc/hosts to force redirect traffic to dfdaemon.
# Caution: This feature need dfdaemon to implement SNI Proxy,
# confirm image tag is greater than v2.0.0.
# When use certs and inject hosts in docker, no necessary to restart docker daemon.
injectHosts: true
registryDomains:
- 'harbor.example.com'
- 'harbor.example.net'

此配置允许 docker 通过 Dragonfly 拉取 harbor.example.comharbor.example.net 域名镜像。 使用上述配置部署 Dragonfly 时,无需重新启动 docker。

优点:

  • 支持 dfdaemon 自身平滑升级

这种模式下,当删除 dfdaemon pod 的时候,preStop 钩子将会清理已经注入到 /etc/hosts 下的所有主机信息,所有流量将会走原来的镜像中心。

限制:

  • 只支持指定域名。

情况 2: 支持任意仓库

定制 values.yaml 文件:

containerRuntime:
docker:
enable: true
# -- Restart docker daemon to redirect traffic to dfdaemon
# When containerRuntime.docker.restart=true,
# containerRuntime.docker.injectHosts and
# containerRuntime.registry.domains is ignored.
# If did not want restart docker daemon,
# keep containerRuntime.docker.restart=false and
# containerRuntime.docker.injectHosts=true.
restart: true

此配置允许 Dragonfly 拦截所有 docker 流量。 使用上述配置部署 Dragonfly 时,dfdaemon 将重新启动 docker。

限制:

  • 必须开启 docker 的 live-restore 功能
  • 需要重启 docker daemon

2. Containerd

Containerd 的配置有两个版本,字段复杂。有很多情况需要考虑:

情况 1: V2 版本使用配置文件

配置文件路径是 /etc/containerd/config.toml:

[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"

这种情况很简单,并可以启用多个镜像仓库支持。

定制 values.yaml 文件:

containerRuntime:
containerd:
enable: true

情况 2: V2 版本不使用配置文件

  • 选项 1 - 允许 Charts 注入 config_path 并重新启动 containerd。

此选项启用多个镜像仓库支持。

警告: 如果 config.toml 中已经有许多其他镜像仓库配置,则不应使用此选项,或使用 config_path 迁移您的配置。

定制 values.yaml 文件:

containerRuntime:
containerd:
enable: true
injectConfigPath: true
  • 选项 2 - 只使用一个镜像仓库 dfdaemon.config.proxy.registryMirror.url

定制 values.yaml 文件:

containerRuntime:
containerd:
enable: true

情况 3: V1 版本

对于 V1 版本 config.toml,仅支持 dfdaemon.config.proxy.registryMirror.url 镜像仓库。

定制 values.yaml 文件:

containerRuntime:
containerd:
enable: true

3. [WIP] CRI-O

请勿使用,开发中。

Dragonfly helm 自动支持配置 CRI-O。

定制 values.yaml 文件:

containerRuntime:
crio:
# -- Enable CRI-O support
# Inject drop-in mirror config into /etc/containers/registries.conf.d.
enable: true
# Registries full urls
registries:
- 'https://ghcr.io'
- 'https://quay.io'
- 'https://harbor.example.com:8443'

准备 Kubernetes 集群

如果没有可用的 Kubernetes 集群进行测试,推荐使用 minikube。只需运行minikube start

安装 Dragonfly

默认配置安装

helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
helm install --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly

自定义配置安装

创建 values.yaml 配置文件。建议使用外部 redis 和 mysql 代替容器启动。

该示例使用外部 mysql 和 redis。参考配置文档

mysql:
enable: false

externalMysql:
migrate: true
host: mysql-host
username: dragonfly
password: dragonfly
database: manager
port: 3306

redis:
enable: false

externalRedis:
host: redis-host
password: dragonfly
port: 6379

使用配置文件 values.yaml 安装 Dragonfly。

helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
helm install --create-namespace --namespace dragonfly-system \
dragonfly dragonfly/dragonfly -f values.yaml

安装 Drgonfly 使用已经部署的 manager

创建 values.yaml 配置文件。需要配置 scheduler 和 seed peer 关联的对应集群的 id。

示例是使用外部的 manager 和 redis。参考配置文档

scheduler:
config:
manager:
schedulerClusterID: 1

seedPeer:
config:
scheduler:
manager:
seedPeer:
clusterID: 1

manager:
enable: false

externalManager:
enable: true
host: 'dragonfly-manager.dragonfly-system.svc.cluster.local'
restPort: 8080
grpcPort: 65003

redis:
enable: false

externalRedis:
host: redis-host
password: dragonfly
port: 6379

mysql:
enable: false

等待部署成功

等待所有的服务运行成功。

kubectl -n dragonfly-system wait --for=condition=ready --all --timeout=10m pod

Manager 控制台

控制台页面会在 dragonfly-manager.dragonfly-system.svc.cluster.local:8080 展示。

需要绑定 Ingress 可以参考 Helm Charts 配置选项, 或者手动自行创建 Ingress。

控制台功能预览参考文档 console preview

运行时配置

以 Containerd 和 CRI 为例,更多运行时文档

例子为单镜像仓库配置,多镜像仓库配置参考文档

私有仓库:

# explicitly use v2 config format, if already v2, skip the "version = 2"
version = 2
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.example.com"]
endpoint = ["http://127.0.0.1:65001", "https://harbor.example.com"]

dockerhub 官方仓库:

# explicitly use v2 config format, if already v2, skip the "version = 2"
version = 2
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["http://127.0.0.1:65001", "https://index.docker.io"]

增加配置到 /etc/containerd/config.toml 文件并重启 Containerd。

systemctl restart containerd

使用 Dragonfly

以上步骤执行完毕,可以使用 crictl 命令拉取镜像:

crictl harbor.example.com/library/alpine:latest
crictl pull docker.io/library/alpine:latest

拉取镜像后可以在 dfdaemon 查询日志:

# find pods
kubectl -n dragonfly-system get pod -l component=dfdaemon
# find logs
pod_name=dfdaemon-xxxxx
kubectl -n dragonfly-system exec -it ${pod_name} -- grep "peer task done" /var/log/dragonfly/daemon/core.log

日志输出例子:

{
"level": "info",
"ts": "2021-06-28 06:02:30.924",
"caller": "peer/peertask_stream_callback.go:77",
"msg": "stream peer task done, cost: 2838ms",
"peer": "172.17.0.9-1-ed7a32ae-3f18-4095-9f54-6ccfc248b16e",
"task": "3c658c488fd0868847fab30976c2a079d8fd63df148fb3b53fd1a418015723d7",
"component": "streamPeerTask"
}