Openshift 4.4 静态 IP 离线安装系列:准备离线资源

本系列文章描述了离线环境下以UPI(UserProvisionedInfrastructure)模式安装OpenshiftContainerPlatform(OCP)4.4.5的步骤,我的环境是VMwareESXI虚拟化,也适用于其他方式提供的虚拟机或物理主机。离线资源包括安装镜像、所有样例ImageStream和OperatorHub中的所有RedHatOperators。

本系列采用静态IP的方式安装OCP集群,如果你可以随意分配网络,建议采用DHCP的方式。

1.离线环境

单独准备一台节点用来执行安装任务和离线资源准备,这台节点最好具备魔法上网的能力,以便可以同时访问内外网,我们称这台节点为基础节点。

除此之外还需要部署一个私有镜像仓库,以供OCP安装和运行时使用,要求支持version2schema2(manifestlist),我这里选择的是。镜像仓库需要部署在另外一台节点,因为需要用到443端口,与后面的负载均衡端口冲突。

2.准备离线安装介质获取版本信息

目前最新的OCP版本是4.4.5,可以从这里下载客户端:

解压出来的二进制文件放到基础节点的$PATH下,看下版本信息:

→/openshift-release-dev/ocp-release:4.4.5-x86_64Name:4.4.5Digest:sha256:4a461dc23a9d323c8bd7a8631bed078a9e5eec690ce073f78b645c83fb4cdf74Created:2020-05-21T16:03:01ZOS/Arch:linux/amd64Manifests:412PullFrom:/openshift-release-dev/ocp-release@sha256:4a461dc23a9d323c8bd7a8631bed078a9e5eec690ce073f78b645c83fb4cdf74ReleaseMetadata:Version:4.4.5Upgrades:4.3.18,4.3.19,4.3.21,4.3.22,4.4.2,4.4.3,4.4.4Metadata:description:Metadata:url:
创建内部镜像仓库

内部镜像仓库用于存放部署OCP集群所需的镜像,仓库本身使用Quay部署。Quay包含了几个核心组件:

数据库:主要存放镜像仓库的元数据(非镜像存储)

Redis:存放构建日志和Quay的向导

Quay:作为镜像仓库

Clair:提供镜像扫描功能

首先修改镜像仓库节点的主机名:

$

接着安装podman:

$yuminstall-ypodman

先创建一个Pod,用来共享NetworkNamespace:

→podmanpodcreate--namequay-p443:8443

安装Mysql数据库:

$mkdir-p/data/quay/lib/mysql$chmod777/data/quay/lib/mysql$exportMYSQL_CONTAINER_NAME=quay-mysql$exportMYSQL_DATABASE=enterpriseregistrydb$exportMYSQL_PASSWORD=PASSWD$exportMYSQL_USER=quayuser$exportMYSQL_ROOT_PASSWORD=PASSWD$podmanrun\--detach\--restart=always\--envMYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\--envMYSQL_USER=${MYSQL_USER}\--envMYSQL_PASSWORD=${MYSQL_PASSWORD}\--envMYSQL_DATABASE=${MYSQL_DATABASE}\--name${MYSQL_CONTAINER_NAME}\--privileged=true\--podquay\-v/data/quay/lib/mysql:/var/lib/mysql/data:Z\/rhscl/mysql-57-rhel7

安装Redis:

$mkdir-p/data/quay/lib/redis$chmod777/data/quay/lib/redis$podmanrun-d--restart=always\--podquay\--privileged=true\--namequay-redis\-v/data/quay/lib/redis:/var/lib/redis/data:Z\/rhscl/redis-32-rhel7

获取RedHatQuayv3镜像的访问权:

$podmanlogin-u="redhat+quay"-p="O81WSHRSJR14UAZBK54GQHJS0P1V4CLWAJV1X2C4SD7KO59CQ9N3RE12612XU1HR"

参考:

配置Quay:

$podmanrun--privileged=true\--namequay-config\--podquay\--add-hostmysql:127.0.0.1\--add-hostredis:127.0.0.1\--add-hostclair:127.0.0.1\-/redhat/quay:

这一步会启动一个配置Quay的进程,打开浏览器访问:,用户名/密码为:`quayconfig/`:


选择新建配置,然后设置数据库:


设置超级管理员:


下一个界面要设置两个地方,一个是Serverconfiguration的ServerHostname,另一个是RedisHostname,SSL不用设置,后面直接通过命令行配置:




配置检查通过后,就可以保存下载下来:


最后会导出一个,将其上传到Quay所在的服务器,解压到配置文件目录:

$mkdir-p/data/quay/config$mkdir-p/data/quay/storage$/data/quay/config/$cd/data/quay/config/$

生成自签名证书:

把下载的txt文件转出json格式,如果没有jq命令,通过epel源安装$cat./|$yuminstallepel-release$yuminstalljq

JSON内容如下:

{"auths":{"":{"auth":"b3BlbnNo","email":"you@"},"":{"auth":"b3BlbnNo","email":"you@"},"":{"auth":"NTE3Njg5Nj","email":"you@"},"":{"auth":"NTE3Njg5Nj","email":"you@"}}}

把本地仓库的用户密码转换成base64编码:

$echo-n'admin:password'|base64-w0cm9vdDpwYXNzd29yZA==

然后在里面加一段本地仓库的权限。第一行仓库域名和端口,第二行是上面的base64,第三行随便填个邮箱:

"auths":{"":{"auth":"cm9vdDpwYXNzd29yZA==","email":"you@"},

设置环境变量:

$exportOCP_RELEASE="4.4.5-x86_64"$exportLOCAL_REGISTRY=''$exportLOCAL_REPOSITORY='ocp4/openshift4'$exportPRODUCT_REPO='openshift-release-dev'$exportLOCAL_SECRET_JSON='/root/'$exportRELEASE_NAME="ocp-release"

OCP_RELEASE:OCP版本,可以在这个页面查看。如果版本不对,下面执行ocadm时会提示imagedoesnotexist。

LOCAL_REGISTRY:本地仓库的域名和端口。

LOCAL_REPOSITORY:镜像存储库名称,使用ocp4/openshift4。

PRODUCT_REPO和RELEASE_NAME都不需要改,这些都是一些版本特征,保持不变即可。

LOCAL_SECRET_JSON:密钥路径,就是上面的存放路径。

在Quay中创建一个组织(Organization)ocp4用来存放同步过来的镜像。

最后一步就是同步镜像,这一步的动作就是把quay官方仓库中的镜像同步到本地仓库,如果失败了可以重新执行命令,整体内容大概5G。

$ocadm-a${LOCAL_SECRET_JSON}releasemirror\--from=/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}\--to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}\--to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}

ocadmreleasemirror命令执行完成后会输出下面类似的信息,保存下来,将来会用在文件中:

imageContentSources:-mirrors:-/ocp4/openshift4source:/openshift-release-dev/ocp-release-mirrors:-/ocp4/openshift4source:/openshift-release-dev/

本地镜像仓库缓存好镜像之后,通过tag/list接口查看所有tag,如果能列出来一堆就说明是正常的:

$curl-s-XGET-H"Authorization:Bearertoken"|jq.{"has_additional":true,"page":1,"tags":[{"name":"4.4.5-cluster-kube-scheduler-operator","reversion":false,"start_ts":1590821178,"image_id":"a778898a93d4fc5413abea38aa604d14d7efbd99ee1ea75d2d1bea3c27a05859","last_modified":"Sat,30May202006:46:18-0000","manifest_digest":"sha256:887eda5ce495f1a33c5adbba8772064d3a8b78192162e4c75bd84763c5a1fb01","docker_image_id":"a778898a93d4fc5413abea38aa604d14d7efbd99ee1ea75d2d1bea3c27a05859","is_manifest_list":false,"size":103582366},{"name":"4.4.5-kube-rbac-proxy","reversion":false,"start_ts":1590821178,"image_id":"f1714cda6028bd7998fbba1eb79348f33b9ed9ccb0a69388da2eb0aefc222f85","last_modified":"Sat,30May202006:46:18-0000","manifest_digest":"sha256:f6351c3aa750fea93050673f66c5ddaaf9e1db241c7ebe31f555e011b20d8c30","docker_image_id":"f1714cda6028bd7998fbba1eb79348f33b9ed9ccb0a69388da2eb0aefc222f85","is_manifest_list":false,"size":102366055},{"name":"4.4.5-cluster-kube-controller-manager-operator","reversion":false,"start_ts":1590821178,"image_id":"bc7e19d35ec08c1a93058db1705998da2f8bbe5cdbb7f3f5974e6176e2f79eb6","last_modified":"Sat,30May202006:46:18-0000","manifest_digest":"sha256:0aa16b4ff32fbb9bc7b32aa1bf6441a19a1deb775fb203f21bb8792ff1a26c2e","docker_image_id":"bc7e19d35ec08c1a93058db1705998da2f8bbe5cdbb7f3f5974e6176e2f79eb6","is_manifest_list":false,"size":104264263},{"name":"4.4.5-baremetal-operator","reversion":false,"start_ts":1590821178,"image_id":"6ec90c0fb53125801d41b37f8f28c4679e49ce19427f7848803a2bc397e4c23b","last_modified":"Sat,30May202006:46:18-0000","manifest_digest":"sha256:a77ff02f349d96567da8e06018ad0dfbfb5fef6600a9a216ade15fadc574f4b4","docker_image_id":"6ec90c0fb53125801d41b37f8f28c4679e49ce19427f7848803a2bc397e4c23b","is_manifest_list":false,"size":110117444},{"name":"4.4.5-cluster-etcd-operator","reversion":false,"start_ts":1590821178,"image_id":"d0cf3539496e075954e53fce5ed56445ae87f9f32cfb41e9352a23af4aa04d69","last_modified":"Sat,30May202006:46:18-0000","manifest_digest":"sha256:9f7a02df3a5d91326d95e444e2e249f8205632ae986d6dccc7f007ec65c8af77","docker_image_id":"d0cf3539496e075954e53fce5ed56445ae87f9f32cfb41e9352a23af4aa04d69","is_manifest_list":false,"size":103890103},{"name":"4.4.5-openshift-apiserver","reversion":false,"start_ts":1590821177,"image_id":"eba5a051dcbab534228728c7295d31edc0323c7930fa44b40059cf8d22948363","last_modified":"Sat,30May202006:46:17-0000","manifest_digest":"sha256:8fd79797e6e0e9337fc9689863c3817540a003685a6dfc2a55ecb77059967cef","docker_image_id":"eba5a051dcbab534228728c7295d31edc0323c7930fa44b40059cf8d22948363","is_manifest_list":false,"size":109243025},{"name":"4.4.5-kube-client-agent","reversion":false,"start_ts":1590821177,"image_id":"fc1fdfb96e9cd250024094b15efa79344c955c7d0c93253df312ffdae02b5524","last_modified":"Sat,30May202006:46:17-0000","manifest_digest":"sha256:8eb481214103d8e0b5fe982ffd682f838b969c8ff7d4f3ed4f83d4a444fb841b","docker_image_id":"fc1fdfb96e9cd250024094b15efa79344c955c7d0c93253df312ffdae02b5524","is_manifest_list":false,"size":99721802},{"name":"4.4.5-kube-proxy","reversion":false,"start_ts":1590821177,"image_id":"d2577f4816cb81444ef3b441bf9769904c602cd6626982c2fd8ebba162fd0c08","last_modified":"Sat,30May202006:46:17-0000","manifest_digest":"sha256:886ae5bd5777773c7ef2fc76f1100cc8f592653ce46f73b816de80a20a113769","docker_image_id":"d2577f4816cb81444ef3b441bf9769904c602cd6626982c2fd8ebba162fd0c08","is_manifest_list":false,"size":103473573},}

这里需要创建一个OAuthaccesstoken来访问Quay的API,创建过程如下:

浏览器登录RedHatQuay,选择一个组织(Organization),例如ocp4。

在左侧导航中选择Applications图标。

选择CreateNewApplication,输入Application的名字然后回车。

选择你新创建的Application,在左侧导航栏中选择GenerateToken。

保管好生成的token。

Quay的API文档可以参考这里:AppixA:RedHatQuayApplicationProgrammingInterface(API)。

Quay中也能看到所有的镜像:


提取openshift-install命令

为了保证安装版本一致性,需要从镜像库中提取openshift-install二进制文件,不能直接从,不然后面会有sha256匹配不上的问题。

#这一步需要用到上面的export变量$ocadmreleaseextract\-a${LOCAL_SECRET_JSON}\--command=openshift-install\"${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}"

如果提示error:imagedosenotexist,说明拉取的镜像不全,或者版本不对。

把文件移动到$PATH并确认版本:

$chmod+xopenshift-install$mvopenshift-install/usr/local/bin/$/ocp4/openshift4@sha256:4a461dc23a9d323c8bd7a8631bed078a9e5eec690ce073f78b645c83fb4cdf74
3.准备ImageStream样例镜像

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

|whilereadline;dotarget=$(echo$line|sed's///')ocimagemirror-a${LOCAL_SECRET_JSON}$line$targetdone

如果之前装过,把openshift-cluster-samples-operator项目下cluster-samples-operatorPod的/opt/openshift目录同步出来,简单grep一下就都有了完整的镜像列表。

完整列表参考这里。

同步过程中如果遇到报错,可根据报错信息到Quay中创建相应的Organization,不用中断任务。这里给出一个参考,需要创建以下的Organization:

rhscljboss-datavirt-63scale-amp213scale-amp223scale-amp233scale-amp243scale-amp253scale-amp26jboss-eap-6devtoolsopenshift3rhpam-7rhdm-7jboss-amq-6jboss-datagrid-7jboss-datagrid-6jboss-webserver-3amq-broker-7jboss-webserver-5redhat-sso-7openjdkredhat-openjdk-18fuse7dotnet
4.准备OperatorHub离线资源

首先在Quay中创建一个devinfra项目,然后构建RedHatOperators的catalogimage,保存为/devinfra/redhat-operators:v1。

$ocadmcatalogbuild\-a${LOCAL_SECRET_JSON}\--appregistry-point\--from=/openshift4/ose-operator-registry:\--appregistry-orgredhat-operators\--to=/devinfra/redhat-operators:v1

这个catalogimage相当于RedHatOperators的一个目录,通过catalogimage可以找到RedHatOperators的所有镜像。而且catalogimage使用sha256digest来引用镜像,能够确保应用有稳定可重复的部署。

然后使用catalogimage同步RedHatOperators的所有镜像到私有仓库:

$ocadmcatalogmirror\-a${LOCAL_SECRET_JSON}\/devinfra/redhat-operators:v1\

如果执行过程中遇到projectnotfound之类的错误,可根据报错信息到Quay中创建相应的项目,不用中断任务。

这里还会遇到一个bug,执行到最后会有如下的报错信息:

I040908:04:48.34211011331:231]wrotedatabaseto/tmp/db-225652515/:04:48.34741711331:258]:couldn'tparseimageformirroring(),skippingmirror:invalidreferenceformatI040908:04:48.38581611331:329]wrotemirroringmanifeststoredhat-operators-manifests

先来看看有哪些Operators:

$sqlite3/tmp/db-225652515/'select*fromrelated_image'|grep'^|'

随便挑一个Operator,查看其ClusterServiceVersion的字段内容:

$cat/tmp/cache-943388495/manifests-698804708/3scale-operator/3scale-operator-9re7jpyl/0.5.0/3:replaces:3:-name:apicast-gateway-rhel8image:/3scale-amp2/apicast-gateway-rhel8@sha256:21be62a6557846337dc0cf764be63442718fab03b95c198a301363886a9e74f9-name:back-rhel7image:/3scale-amp2/back-rhel7@sha256:ea8a31345d3c2a56b02998b019db2e17f61eeaa26790a07962d5e3b66032d8e5-name:system-rhel7image:/3scale-amp2/system-rhel7@sha256:93819c324831353bb8f7cb6e9910694b88609c3a20d4c1b9a22d9c2bbfbad16f-name:zync-rhel7image:/3scale-amp2/zync-rhel7@sha256:f4d5c1fdebe306f4e891ddfc4d3045a622d2f01db21ecfc9397cab25c9baa91a-name:memcached-rhel7image:/3scale-amp2/memcached-rhel7@sha256:ff5f3d2d131631d5db8985a5855ff4607e91f0aa86d07dafdcec4f7da13c9e05-name:redis-32-rhel7value:/rhscl/redis-32-rhel7@sha256:a9bdf52384a222635efc0284db47d12fbde8c3d0fcb66517ba8eefad1d4e9dc9-name:mysql-57-rhel7value:/rhscl/mysql-57-rhel7@sha256:9a781abe7581cc141e14a7e404ec34125b3e89c008b14f4e7b41e094fd3049fe-name:postgresql-10-rhel7value:/rhscl/postgresql-10-rhel7@sha256:de3ab628b403dc5eed986a7f392c34687bddafee7bdfccfd65cecf137ade3dfd

可以看到relatedImages列表中有些条目的键是value而不是image,这就是问题所在!那些没有image的条目在反序列化时会将image的值当成空字符串"":

$sqlite3/tmp/db-225652515/'select*fromrelated_imagewhereoperatorbundle_name="3"'/3scale-amp2/zync-rhel7@sha256:f4d5c1fdebe306f4e891ddfc4d3045a622d2f01db21ecfc9397cab25c9baa91a|3/3scale-amp2/memcached-rhel7@sha256:ff5f3d2d131631d5db8985a5855ff4607e91f0aa86d07dafdcec4f7da13c9e05|3|3/3scale-amp2/apicast-gateway-rhel8@sha256:21be62a6557846337dc0cf764be63442718fab03b95c198a301363886a9e74f9|3/3scale-amp2/back-rhel7@sha256:ea8a31345d3c2a56b02998b019db2e17f61eeaa26790a07962d5e3b66032d8e5|3/3scale-amp2/3scale-rhel7-operator@sha256:2ba16314ee046b3c3814fe4e356b728da6853743bd72f8651e1a338e8bbf4f81|3/3scale-amp2/system-rhel7@sha256:93819c324831353bb8f7cb6e9910694b88609c3a20d4c1b9a22d9c2bbfbad16f|3

从上面的输出可以看到键为value的那几个条目都反序列化失败了,具体的讨论参考:bundlevalidateshouldvalidatethattherearenoemptyrelatedImages。

这里给出一个临时解决方案,先打开另外一个窗口,然后回到原来的窗口执行命令:

$ocadmcatalogmirror\-a${LOCAL_SECRET_JSON}\/devinfra/redhat-operators:v1\

然后迅速切到下一个窗口,查找最新的manifest缓存目录:

$ls-l/tmp/cache-*/

根据日期判断最新的缓存目录,假设是/tmp/cache-320634009,然后将所有的value替换为image:

$sed-i"s/value:registry/image:registry/g"$(egrep-rl"value:registry"/tmp/cache-320634009/)

同步完成后会产生redhat-operators-manifests目录,下面有两个文件:

:定义了一个ImageContentSourcePolicy对象,该对象可以配置节点将其对官方Operatormanifests中镜像的引用改为对本地镜像仓库中镜像的引用。

:包含了所有的源镜像在本地镜像仓库中的映射位置。ocimagemirror命令可以引用该文件进一步修改镜像配置。

然而目前这么做还是有问题1800674:同步出来的镜像manifestdigest不对,导致后面离线安装Operator时会报镜像无法获取的错误。

暂时可以使用上面bugzilla链接里给出的临时解决方案,先安装skopeo:

$yuminstall-ygolanggpgme-devellibassuan-develbtrfs-progs-develdevice-mapper-devel$gitclone$cdskopeo$makebinary-local$mvskopeo/usr/local/bin/

从中解码、和的用户名密码,然后通过下面的命令认证:

$__$__$__

最后同步镜像的manifestdigest:

catredhat-operators-manifests/|whilereadline;doorigin=$(echo$line|cut-d=-f1)target=$(echo$line|cut-d=-f2)if[["$origin"=~"sha256"]];thentag=$(echo$origin|cut-d:-f2|cut-c-8)skopeocopy--alldocker://$origindocker://$target:$tagelseskopeocopy--alldocker://$origindocker://$targetfidone

不得不说,OCP的安装真是个浩大的工程,这洋洋洒洒的一大篇也只是准备了离线资源,这只是安装的一小步,还有很长的步骤要写,心理素质不过关的同学切勿随意模仿。

5.参考资料

离线部署:准备离线资源

我精心整理的Kubernetes知识图谱的下载地址,可以私信回复我“图谱”获得!

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐