离线部署 Openshift Container Platform 4.3 - 1: 准备离线资源

本系列文章记录了 Openshift Container Platform (OCP) 4.3.5 离线部署的过程. 离线资源包括安装镜像, 所有样例 Image Stream, OperatorHub 下的 RedHat Operators. 虽然这是一个实验系列, 我会尽可能的按照生产实践来进行.

实验环境

跳板机

可以同时访问内外网, 同时具备科学上网的能力, 用来执行安装任务和离线材料准备

私有镜像库

离线镜像会保存到私有镜像库中, 以供 OCP 安装和运行时使用, 要求支持 version 2 schema 2 (manifest list). 我这里选择的是 Quay 3

  • Nexus 目前还不支持 manifest list: NEXUS-18546
  • Harbor 目前还不支持 manifest list: 6522

关于镜像的获取

发现很多人误以为必须联系红帽销售, 签单之后才可以试用 OCP4, 实际上并不是这样. 注册一个开发者账号 后就可以获得 quay.io, registry.redhat.io 的 pull secret 来进行测试实验了.

准备离线安装介质

获取目前的版本信息

目前最新的 OCP 版本是 4.3.5. 从这里下载 oc 客户端

解压出来的二进制文件放到跳板机 PATH 下. 先看一下当前 4.3.5 的版本信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
oc adm release info quay.io/openshift-release-dev/ocp-release:4.3.5-x86_64

Name: 4.3.5
Digest: sha256:64320fbf95d968fc6b9863581a92d373bc75f563a13ae1c727af37450579f61a
Created: 2020-03-06T12:05:47Z
OS/Arch: linux/amd64
Manifests: 366

Pull From: quay.io/openshift-release-dev/ocp-release@sha256:64320fbf95d968fc6b9863581a92d373bc75f563a13ae1c727af37450579f61a

Release Metadata:
Version: 4.3.5
Upgrades: 4.2.21, 4.2.22, 4.3.0, 4.3.1, 4.3.2, 4.3.3
Metadata:
description:
Metadata:
url: https://access.redhat.com/errata/RHBA-2020:0676

Component Versions:
Kubernetes 1.16.2
...

下载安装镜像

实验环境中的 quay 在内网 https://quay.svc.vopsdev.com 提供服务. 事先创建好 namespace/organization: openshift-release-dev 用来存放安装镜像仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export OCP_RELEASE=4.3.5
export ARCH=x86_64
export LOCAL_REGISTRY='quay.svc.vopsdev.com'
export LOCAL_REPOSITORY='openshift-release-dev/ocp-v4.0-art-dev'
export UPSTREAM_REPO='openshift-release-dev'
export RELEASE_NAME="ocp-release"
# 将你从红帽获取的 pull secret 以及你的私有镜像库的 secret 加入到 pull-secret.json 中
export LOCAL_SECRET_JSON="pull-secret.json"

# 如果你需要科学上网
export HTTP_PROXY=...
export HTTPS_PROXY=...
export NO_PROXY="quay.svc.vopsdev.com"

# 这样 release 镜像以及安装需要的镜像会都同步到 quay.svc.vopsdev.com/openshift-release-dev/ocp-v4.0-art-dev 下了
oc adm release mirror -a ${LOCAL_SECRET_JSON} --from=quay.io/${UPSTREAM_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCH} --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE} --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}

oc adm release mirror 命令完成后会输出下面类似的信息, 保存下来, 将来会用在 install-config.yaml 文件中

1
2
3
4
5
6
7
imageContentSources:
- mirrors:
- quay.svc.vopsdev.com/openshift-release-dev/ocp-v4.0-art-dev
source: quay.io/openshift-release-dev/ocp-release
- mirrors:
- quay.svc.vopsdev.com/openshift-release-dev/ocp-v4.0-art-dev
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev

提取安装程序

1
oc adm release extract -a ${LOCAL_SECRET_JSON} --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}"

会产生 openshift-install 二进制程序 (不要直接从 https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.3.5 下载, 后面会有 sha256 匹配不上的问题)

准备 Image Stream 样例镜像

准备一个镜像列表, 然后使用 oc image mirror将镜像同步到私有仓库中

1
2
3
4
cat sample-images.txt | while read line; do
target=$(echo $line | sed 's/registry.redhat.io/quay.svc.vopsdev.com/')
oc image mirror -a ${LOCAL_SECRET_JSON} $line $target
done

完整的镜像列表如何获取? 如果之前装过 OCP 4.3.5, 把 openshift-cluster-samples-operator 项目下 cluster-samples-operator pod 的 /opt/openshift 目录同步出来, 简单 grep 一下就都有了.

完整列表参考这里

准备 OperatorHub 离线资源

首先构建 RedHat Operators 的 catalog image, 保存为 quay.svc.vopsdev.com/devinfra/redhat-operators:v1.

1
oc adm catalog build --appregistry-endpoint https://quay.io/cnr --appregistry-org redhat-operators --to=quay.svc.vopsdev.com/devinfra/redhat-operators:v1

这个 catalog image 相当于 RedHat Operators 的一个目录, 通过 catalog image 可以找到 RedHat Operators 的所有镜像. 而且 catalog image 使用 sha256 digest 来引用镜像, 能够确保应用有稳定可重复的部署.

然后使用 catalog image 同步 RedHat Operators 的所有镜像到私有仓库. 按照官方文档的做法是

1
oc adm catalog mirror quay.svc.vopsdev.com/devinfra/redhat-operators:v1 quay.svc.vopsdev.com

这个命令结束后会产生 redhat-operators-manifests 目录, 下面有两个文件: mapping.txt 和 imageContentSourcePolicy.yaml.

然而这么做目前还有问题 1800674: 同步出来的镜像 manifest digest 不对, 导致后面离线安装 operator 时会报镜像无法获取的错误. 暂时可以使用上面 bugzilla 链接里给出的临时解决方案: skopeo copy --all

1
2
3
4
5
6
7
8
9
10
cat redhat-operators-manifests/mapping.txt | while read line; do
origin=$(echo $line | cut -d= -f1)
target=$(echo $line | cut -d= -f2)
if [[ "$origin" =~ "sha256" ]]; then
tag=$(echo $origin | cut -d: -f2 | cut -c -8)
skopeo copy --all docker://$origin docker://$target:$tag
else
skopeo copy --all docker://$origin docker://$target
fi
done