openSUSE Kubic 的私有和隔离注册表

2019年11月15日 | Thorsten Kukuk | 无许可

简介

有时会出现无法直接访问互联网的情况(代理/离线/隔离)。即使在这些设置中,也可以使用 openSUSE Kubic 和本地私有注册表来部署和使用 Kubernetes。

在这篇博文中,我将解释如何设置一个本地服务器,作为私有注册表,提供部署 Kubernetes 与 openSUSE Kubic 所需的所有容器镜像。

安装

操作系统

作为托管所需服务的操作系统,我们使用 openSUSE MicroOS,需要使用 MicroOS Container Host 系统角色进行安装。

需要安装以下其他软件包:

  • container-registry-systemd
  • mirror-registry
  • skopeo,以及 openSUSE Tumbleweed 提供的最新同步补丁
  • reg(可选,用于测试和调试)
# transactional-update pkg install mirror-registry skopeo container-registry-systemd reg
# systemctl reboot

重启后,工具可用,我们可以开始设置注册表。

注册表设置

有一个脚本可以设置在容器中运行的本地私有注册表。默认情况下,任何人都可以从中列出和拉取镜像,但只有管理员才能推送新镜像。

# setup-container-registry

管理员帐户没有默认密码,这意味着需要设置一个才能将容器同步到此注册表。密码必须是 bcrypt(blowfish)哈希

# htpasswd -nB admin

修改管理员帐户的密码条目并设置新的哈希值

# nano /etc/registry/auth_config.yml

此外,可以调整 ACL 规则。

启动注册表的容器

# systemctl start container-registry
# systemctl start registry-auth_server

现在您的注册表正在运行,应该可以工作。可以使用以下命令进行验证:

# reg ls localhost
Repositories for localhost
REPO                TAGS

证书

默认情况下,setup-container-registry 将创建自签名证书,这些证书有效期为 1.5 年,并存储在 /etc/registry/certs 中。可以使用官方证书替换它们。

如果使用自签名证书,则需要在所有应访问注册表的机器上安装公共 CA 证书。将 /etc/registry/certs/ContainerRegistryCA.crt 复制到 /etc/pki/trust/anchors/,并在每台机器上运行 update-ca-certificates

容器镜像列表

将使用工具 mirror-registry 来创建需要镜像的容器列表。它将分析远程注册表,并创建一个 YAML 文件,其中包含所有容器和匹配正则表达式的标签,以使用 skopeo 同步到私有注册表。

此工具可以在任何架构上运行,目标平台可以作为参数指定。与此相反,skopeo 需要在目标架构上运行。否则,如果源存储库中存在多架构容器镜像,它将失败或同步错误的容器镜像。

以下所有容器镜像 registry.opensuse.org/kubic/ 都是必需的。 此外,镜像所有官方 openSUSE 容器镜像,从 registry.opensuse.org/opensuse/ 也有帮助。否则,像 toolbox 这样的工具将无法工作。

创建容器镜像列表的命令是:

# mirror-registry --out kubic-full.yaml registry.opensuse.org "(^kubic|^opensuse/([^/]+)$)"

此命令将镜像所需容器镜像的所有版本的所有构建。但大多数情况下,镜像每个版本的最新构建就足够了

# mirror-registry --out kubic-small.yaml --minimize registry.opensuse.org "(^kubic|^opensuse/([^/]+)$)"

kubic-small.yaml 现在可以进一步调整。例如,如果使用 weave 作为 POD 网络,则 flannel 和 cilium 容器不需要镜像,可以从列表中删除。

私有注册表

从一台可以访问源注册表和内部私有注册表的宿主机,现在可以使用 skopeo 同步容器镜像

# skopeo sync --scoped --src yaml --dest docker --dest-creds admin:password kubic-small.yaml registry.local

--scoped 选项会将内部注册表名称前缀到当前的外部存储库名称,因此存储库将为 registry.opensuse.org/...,拉取命令为 podman pull registry.local/registry.opensuse.org/...,以避免与内部注册表的命名空间冲突或通过镜像其他注册表。

可以使用以下命令验证结果:

# reg ls registry.local

skopeo 需要足够新的补丁来添加 sync 选项。这些补丁已经包含在 openSUSE Tumbleweed、openSUSE MicroOS 和 openSUSE Kubic 中,但不包含在 SUSE Linux Enterprise Server 15 中。

隔离/离线注册表

如果没有任何一台宿主机可以访问两个注册表,外部和内部注册表,则需要将容器镜像复制到磁盘,然后将磁盘传输到内部网络。

将容器镜像复制到外部磁盘

# skopeo sync --scoped --src yaml --dest dir kubic-small.yaml /media/external-disk

将外部磁盘带到内部注册表机器并导入容器镜像

# skopeo sync --scoped --src dir --dest docker --dest-creds admin:password /media/external-disk localhost

验证结果

# reg ls registry.local

节点配置

在私有注册表运行并包含所有容器镜像后,cri-o 和 podman 需要了解此注册表并从中拉取镜像。

这两个工具共享相同的配置文件:/etc/containers/registries.conf

默认配置文件使用 v1 语法,但需要 v2。可以在 此处 找到文档。一个可以在每个 kubernetes 节点上部署的工作配置模板如下所示:

[[registry]]
prefix = "registry.opensuse.org/kubic"
location = "registry.local/registry.opensuse.org/kubic"
insecure = false
blocked = false

[[registry]]
prefix = "registry.opensuse.org/opensuse"
location = "registry.local/registry.opensuse.org/opensuse"
insecure = false
blocked = false
  • insecure: truefalse。默认情况下,从注册表检索镜像时需要 TLS。如果 insecure 设置为 true,则允许未加密的 HTTP 以及使用不受信任证书的 TLS 连接。
  • blocked : truefalse。如果为 true,则禁止拉取名称匹配的镜像。

更新配置文件后,如果 cri-o 正在运行,则需要在该节点上重新启动 cri-o

# systemctl status crio
* crio.service - Open Container Initiative Daemon
   Loaded: loaded (/usr/lib/systemd/system/crio.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-11-02 18:09:23 UTC; 8min ago
[...]
# systemctl stop crio
# systemctl start crio

现在您可以部署 kubernetes!

配置文件

以下配置文件定义了注册表和身份验证服务器的行为

  • /etc/registry/config.yml - 注册表配置文件
  • /etc/registry/auth_config.yml - 身份验证服务器配置文件
  • /etc/sysconfig/container-registry - 两个容器的配置文件

类别: 博客

标签

分享这篇文章