Openshift 4.4 静态 IP 离线安装系列(一):准备离线资源
本系列文章描述了离线环境下以 UPI
(User Provisioned Infrastructure) 模式安装 Openshift Container Platform
(OCP) 4.4.5 的步骤,我的环境是 VMware ESXI
虚拟化,也适用于其他方式提供的虚拟机或物理主机。离线资源包括安装镜像、所有样例 Image Stream
和 OperatorHub
中的所有 RedHat Operators。
本系列采用静态 IP 的方式安装 OCP
集群,如果你可以随意分配网络,建议采用 DHCP
的方式。
1. 离线环境
单独准备一台节点用来执行安装任务和离线资源准备,这台节点最好具备魔法上网的能力,以便可以同时访问内外网。我们称这台节点为基础节点。
需要部署一个私有镜像仓库,以供 OCP 安装和运行时使用,要求支持 version 2 schema 2 (manifest list),我这里选择的是 Harbor 2.0
。
很多人误以为必须联系 Red Hat 销售,签单之后才能使用 OCP4,其实不然,注册一个开发者账号[1]后就可以获得
quay.io
和registry.redhat.io
的拉取密钥了。
2. 准备离线安装介质
获取版本信息
目前最新的 OCP 版本是 4.4.5,可以从这里下载客户端:
https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest-4.4/[2]
解压出来的二进制文件放到基础节点的 $PATH
下,看下版本信息:
创建内部镜像仓库
内部镜像仓库用于存放部署 OCP 集群所需的镜像,仓库本身使用 Harbor
部署,目前最为流行的私有镜像仓库便是 CNCF 的毕业生之一的 Harbor(中文含义:港口)。
首先修改基础节点的主机名:
$ hostnamectl set-hostname bastion.openshift4.example.com
所有节点主机名都要采用三级域名格式,如
master1.aa.bb.com
。
Docker 安装步骤就不写了,略过。接着安装 docker-compose
:
$ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
下载 Harbor 离线安装包并解压:
$ wget https://github.com/goharbor/harbor/releases/download/v2.0.0/harbor-offline-installer-v2.0.0.tgz
$ tar -xvf harbor-offline-installer-v2.0.0.tgz -C /opt/
生成自签名证书:
$ mkdir /opt/harbor/certs
$ cd /opt/harbor/certs# 生成私钥
$ openssl genrsa -out server.key 1024
根据私钥生成证书申请文件 csr
:
$ openssl req -new -key server.key -out server.csr
这里根据命令行向导来进行信息输入:
Common Name 可以输入:*.yourdomain.com
,这种方式可以生成通配符域名证书。
使用私钥对证书申请进行签名从而生成证书
$ openssl req -new -key server.key -out server.csr
这样就生成了有效期为 10 年的证书文件,对于自己内网服务使用足够。
证书搞定了之后,就可以接着配置 Harbor 了。打开 /opt/harbor/harbor.yml
文件,修改 hostname 域名、https 证书等配置信息,具体如下:
# Configuration file of Harbor
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: bastion.openshift4.example.com
# http related config
http:# port for http, default is 80. If https enabled, this port will redirect to https portport: 8080
# https related config
https:# https port for harbor, default is 443port: 8443# The path of cert and key files for nginxcertificate: /opt/harbor/certs/server.crtprivate_key: /opt/harbor/certs/server.key
我这里把所有需要的基础服务都部署在同一个节点上,后面安装 OCP 时需要用到负载均衡器的
443
和80
端口,所以这里 Harbor 使用了非标准端口。如果你资源充足,可以将 Harbor 部署在不同的节点上。
接着执行下面的命令进行安装:
$ ./install.sh --with-clair
以上安装命令同时安装了 Clair 服务,一个用户镜像漏洞静态分析的工具。如果不需要,可以省略该选项。
安装成功后,将自签名的证书复制到默认信任证书路径:
$ cp /opt/harbor/certs/server.crt /etc/pki/ca-trust/source/anchors/
$ update-ca-trust extract
或者将其复制到 docker 的信任证书路径:
$ mkdir -p /etc/docker/certs.d/bastion.openshift4.example.com:8443
$ cp /opt/harbor/certs/server.crt /etc/docker/certs.d/bastion.openshift4.example.com:8443/
$ systemctl restart docker
现在可以通过 docker login
命令来测试仓库的连通性,看到如下字样即表示安装成功(也可以通过浏览器访问 Web UI):
???? → docker login bastion.openshift4.example.com:8443
Username: admin
Password: Harbor12345Login Succeeded
下载镜像文件
准备拉取镜像权限认证文件。从 Red Hat OpenShift Cluster Manager
站点的 Pull Secret 页面[3]下载 registry.redhat.io
的 pull secret
。
# 把下载的 txt 文件转出 json 格式,如果没有 jq 命令,通过 epel 源安装
$ cat ./pull-secret.txt | jq . > pull-secret.json$ yum install epel-release
$ yum install jq
JSON 内容如下:
{"auths": {"cloud.openshift.com": {"auth": "b3BlbnNo...","email": "you@example.com"},"quay.io": {"auth": "b3BlbnNo...","email": "you@example.com"},"registry.connect.redhat.com": {"auth": "NTE3Njg5Nj...","email": "you@example.com"},"registry.redhat.io": {"auth": "NTE3Njg5Nj...","email": "you@example.com"}}
}
把本地仓库的用户密码转换成 base64
编码:
$ echo -n 'root:password' | base64 -w0
cm9vdDpwYXNzd29yZA==
然后在 pull-secret.json
里面加一段本地仓库的权限。第一行仓库域名和端口,第二行是上面的 base64
,第三行随便填个邮箱:
"auths": {
..."registry.example.com:5000": {"auth": "cm9vdDpwYXNzd29yZA==","email": "you@example.com"},
...
设置环境变量:
$ export OCP_RELEASE="4.4.5-x86_64"
$ export LOCAL_REGISTRY='bastion.openshift4.example.com:8443'
$ export LOCAL_REPOSITORY='ocp4/openshift4'
$ export PRODUCT_REPO='openshift-release-dev'
$ export LOCAL_SECRET_JSON='/root/pull-secret.json'
$ export RELEASE_NAME="ocp-release"
OCP_RELEASE : OCP 版本,可以在这个页面[4]查看。如果版本不对,下面执行
oc adm
时会提示image does not exist
。LOCAL_REGISTRY : 本地仓库的域名和端口。
LOCAL_REPOSITORY : 镜像存储库名称,使用 ocp4/openshift4。
PRODUCT_REPO
和RELEASE_NAME
都不需要改,这些都是一些版本特征,保持不变即可。LOCAL_SECRET_JSON : 密钥路径,就是上面
pull-secret.json
的存放路径。
在 Harbor 中创建一个项目 ocp4
用来存放同步过来的镜像:
最后一步就是同步镜像,这一步的动作就是把 quay
官方仓库中的镜像,同步到本地仓库,如果失败了可以重新执行命令,整体内容大概 5G
。
$ oc adm -a ${LOCAL_SECRET_JSON} release mirror \--from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE} \--to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \--to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}
oc adm release mirror
命令执行完成后会输出下面类似的信息,保存下来,将来会用在 install-config.yaml
文件中:
imageContentSources:
- mirrors:- bastion.openshift4.example.com:8443/ocp4/openshift4source: quay.io/openshift-release-dev/ocp-release
- mirrors:- bastion.openshift4.example.com:8443/ocp4/openshift4source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
本地镜像仓库缓存好镜像之后,通过 tag/list
接口查看所有 tag,如果能列出来一堆就说明是正常的:
$ curl -s -u admin:Harbor12345 -k https://bastion.openshift4.example.com:8443/v2/ocp4/openshift4/tags/list|jq .{"name": "ocp4/openshift4","tags": ["4.4.5-aws-machine-controllers","4.4.5-azure-machine-controllers","4.4.5-baremetal-installer","4.4.5-baremetal-machine-controllers","4.4.5-baremetal-operator","4.4.5-baremetal-runtimecfg","4.4.5-cli","4.4.5-cli-artifacts","4.4.5-cloud-credential-operator","4.4.5-cluster-authentication-operator","4.4.5-cluster-autoscaler","4.4.5-cluster-autoscaler-operator","4.4.5-cluster-bootstrap","4.4.5-cluster-config-operator","4.4.5-cluster-csi-snapshot-controller-operator","4.4.5-cluster-dns-operator","4.4.5-cluster-etcd-operator","4.4.5-cluster-image-registry-operator","4.4.5-cluster-ingress-operator","4.4.5-cluster-kube-apiserver-operator","4.4.5-cluster-kube-controller-manager-operator","4.4.5-cluster-kube-scheduler-operator","4.4.5-cluster-kube-storage-version-migrator-operator","4.4.5-cluster-machine-approver","4.4.5-cluster-monitoring-operator","4.4.5-cluster-network-operator","4.4.5-cluster-node-tuned","4.4.5-cluster-node-tuning-operator","4.4.5-cluster-openshift-apiserver-operator","4.4.5-cluster-openshift-controller-manager-operator","4.4.5-cluster-policy-controller","4.4.5-cluster-samples-operator","4.4.5-cluster-storage-operator","4.4.5-cluster-svcat-apiserver-operator","4.4.5-cluster-svcat-controller-manager-operator","4.4.5-cluster-update-keys","4.4.5-cluster-version-operator","4.4.5-configmap-reloader","4.4.5-console","4.4.5-console-operator","4.4.5-container-networking-plugins","4.4.5-coredns","4.4.5-csi-snapshot-controller","4.4.5-deployer","4.4.5-docker-builder","4.4.5-docker-registry","4.4.5-etcd","4.4.5-gcp-machine-controllers","4.4.5-grafana","4.4.5-haproxy-router","4.4.5-hyperkube","4.4.5-insights-operator","4.4.5-installer","4.4.5-installer-artifacts","4.4.5-ironic","4.4.5-ironic-hardware-inventory-recorder","4.4.5-ironic-inspector","4.4.5-ironic-ipa-downloader","4.4.5-ironic-machine-os-downloader","4.4.5-ironic-static-ip-manager","4.4.5-jenkins","4.4.5-jenkins-agent-maven","4.4.5-jenkins-agent-nodejs","4.4.5-k8s-prometheus-adapter","4.4.5-keepalived-ipfailover","4.4.5-kube-client-agent","4.4.5-kube-etcd-signer-server","4.4.5-kube-proxy","4.4.5-kube-rbac-proxy","4.4.5-kube-state-metrics","4.4.5-kube-storage-version-migrator","4.4.5-kuryr-cni","4.4.5-kuryr-controller","4.4.5-libvirt-machine-controllers","4.4.5-local-storage-static-provisioner","4.4.5-machine-api-operator","4.4.5-machine-config-operator","4.4.5-machine-os-content","4.4.5-mdns-publisher","4.4.5-multus-admission-controller","4.4.5-multus-cni","4.4.5-multus-route-override-cni","4.4.5-multus-whereabouts-ipam-cni","4.4.5-must-gather","4.4.5-oauth-proxy","4.4.5-oauth-server","4.4.5-openshift-apiserver","4.4.5-openshift-controller-manager","4.4.5-openshift-state-metrics","4.4.5-openstack-machine-controllers","4.4.5-operator-lifecycle-manager","4.4.5-operator-marketplace","4.4.5-operator-registry","4.4.5-ovirt-machine-controllers","4.4.5-ovn-kubernetes","4.4.5-pod","4.4.5-prom-label-proxy","4.4.5-prometheus","4.4.5-prometheus-alertmanager","4.4.5-prometheus-config-reloader","4.4.5-prometheus-node-exporter","4.4.5-prometheus-operator","4.4.5-sdn","4.4.5-service-ca-operator","4.4.5-service-catalog","4.4.5-telemeter","4.4.5-tests","4.4.5-thanos","4.4.5-x86_64"]
}
Harbor 中也能看到所有的镜像:
提取 openshift-install 命令
为了保证安装版本一致性,需要从镜像库中提取 openshift-install
二进制文件,不能直接从 https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.4.5 下载,不然后面会有 sha256
匹配不上的问题。
# 这一步需要用到上面的 export 变量
$ oc adm release extract \-a ${LOCAL_SECRET_JSON} \--command=openshift-install \"${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}"
如果提示 error: image dose not exist
,说明拉取的镜像不全,或者版本不对。
把文件移动到 $PATH
并确认版本:
$ chmod +x openshift-install
$ mv openshift-install /usr/local/bin/$ openshift-install version
openshift-install 4.4.5
built from commit 15eac3785998a5bc250c9f72101a4a9cb767e494
release image bastion.openshift4.example.com:8443/ocp4/openshift4@sha256:4a461dc23a9d323c8bd7a8631bed078a9e5eec690ce073f78b645c83fb4cdf74
3. 准备 Image Stream 样例镜像
准备一个镜像列表,然后使用 oc image mirror
将镜像同步到私有仓库中:
cat sample-images.txt | while read line; dotarget=$(echo $line | sed 's/registry.redhat.io/bastion.openshift4.example.com:8443/')oc image mirror -a ${LOCAL_SECRET_JSON} $line $target
done
如果之前装过 OCP 4.4.5,把 openshift-cluster-samples-operator
项目下 cluster-samples-operator
Pod 的 /opt/openshift
目录同步出来,简单 grep 一下就都有了完整的镜像列表。
完整列表参考这里[5]。
4. 准备 OperatorHub 离线资源
首先在 Harbor 中创建一个 devinfra
项目,然后构建 RedHat Operators 的 catalog image
, 保存为 bastion.openshift4.example.com:8443/devinfra/redhat-operators:v1
。
$ oc adm catalog build \-a ${LOCAL_SECRET_JSON} \--appregistry-endpoint https://quay.io/cnr \--from=registry.redhat.io/openshift4/ose-operator-registry:v4.4 \--appregistry-org redhat-operators \--to=bastion.openshift4.example.com:8443/devinfra/redhat-operators:v1
这个 catalog image 相当于 RedHat Operators
的一个目录,通过 catalog image
可以找到 RedHat Operators
的所有镜像。而且 catalog image 使用 sha256 digest
来引用镜像,能够确保应用有稳定可重复的部署。
然后使用 catalog image 同步 RedHat Operators
的所有镜像到私有仓库:
$ oc adm catalog mirror \-a ${LOCAL_SECRET_JSON} \bastion.openshift4.example.com:8443/devinfra/redhat-operators:v1 \bastion.openshift4.example.com:8443
如果执行过程中遇到 project not found
之类的错误,可根据报错信息到 Harbor 中创建相应的项目,不用中断任务。
这个命令结束后会产生 redhat-operators-manifests
目录,下面有两个文件:
imageContentSourcePolicy.yaml : 定义了一个
ImageContentSourcePolicy
对象,该对象可以配置节点将其对官方 Operator manifests 中镜像的引用改为对本地镜像仓库中镜像的引用。mapping.txt : 包含了所有的源镜像在本地镜像仓库中的映射位置。
oc image mirror
命令可以引用该文件进一步修改镜像配置。
然而目前这么做还是有问题 1800674[6]: 同步出来的镜像 manifest digest
不对,导致后面离线安装 Operator 时会报镜像无法获取的错误。
暂时可以使用上面 bugzilla 链接里给出的临时解决方案,先安装 skopeo:
$ yum install -y golang gpgme-devel libassuan-devel btrfs-progs-devel device-mapper-devel
$ git clone https://github.com/containers/skopeo
$ cd skopeo
$ make binary-local
$ mv skopeo /usr/local/bin/
从 pull-secret.json
中解码 quay.io
、registry.redhat.io
和 registry.access.redhat.com
的用户名密码,然后通过下面的命令认证:
$ skopeo login -u <quay.io_user> -p <quay.io_psw> quay.io
$ skopeo login -u <registry.redhat.io_user> -p <registry.redhat.io_psw> registry.redhat.io
$ skopeo login -u <registry.access.redhat.com_user> -p <registry.access.redhat.com_psw> registry.access.redhat.com
最后同步镜像的 manifest digest:
cat redhat-operators-manifests/mapping.txt | while read line; doorigin=$(echo $line | cut -d= -f1)target=$(echo $line | cut -d= -f2)if [[ "$origin" =~ "sha256" ]]; thentag=$(echo $origin | cut -d: -f2 | cut -c -8)skopeo copy --all docker://$origin docker://$target:$tagelseskopeo copy --all docker://$origin docker://$targetfi
done
不得不说,OCP 的安装真是个浩大的工程,这洋洋洒洒的一大篇也只是准备了离线资源,这只是安装的一小步,还有很长的步骤要写,心理素质不过关的同学切勿随意模仿。
5. 参考资料
离线部署 Openshift Container Platform 4.3 - 1: 准备离线资源[7]
Chapter 9. Using Operator Lifecycle Manager on restricted networks[8]
脚注
[1]
开发者账号: https://developers.redhat.com/
[2]
https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest-4.4/: https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest-4.4/
[3]
Pull Secret 页面: https://cloud.redhat.com/openshift/install/pull-secret
[4]
这个页面: https://quay.io/repository/openshift-release-dev/ocp-release?tab=tags
[5]
这里: https://gist.github.com/yuanlinios/7eea8207083e649cbe07e108a22df00b
[6]
1800674: https://bugzilla.redhat.com/show_bug.cgi?id=1800674
[7]
离线部署 Openshift Container Platform 4.3 - 1: 准备离线资源: https://notes.yuanlinios.me/2020-03-15/%E7%A6%BB%E7%BA%BF%E9%83%A8%E7%BD%B2-Openshift-Container-Platform-4-3-1-%E5%87%86%E5%A4%87%E7%A6%BB%E7%BA%BF%E8%B5%84%E6%BA%90/
[8]
Chapter 9. Using Operator Lifecycle Manager on restricted networks: https://access.redhat.com/documentation/en-us/openshift_container_platform/4.4/html/operators/olm-restricted-networks
你可能还喜欢
点击下方图片即可阅读
什么?终止一个容器竟然用了 10 秒钟,这不能忍!
云原生是一种信仰 ????
扫码关注公众号
后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!
点击 "阅读原文" 获取更好的阅读体验!
❤️给个「在看」,是对我最大的支持❤️
Openshift 4.4 静态 IP 离线安装系列(一):准备离线资源相关推荐
- Openshift 4.4 静态 IP 离线安装系列:准备离线资源
本系列文章描述了离线环境下以 UPI (User Provisioned Infrastructure) 模式安装 Openshift Container Platform (OCP) 4.4.5 的 ...
- Openshift 4.4 静态 IP 离线安装系列:初始安装
Openshift 4.4 静态 IP 离线安装系列:初始安装 上篇文章准备了离线安装 OCP 所需要的离线资源,包括安装镜像.所有样例 Image Stream 和 OperatorHub 中的所有 ...
- sdk linux 离线安装方法,Android SDK离线安装方法详解(加速安装)
AndroidSDK在国内下载一直很慢··有时候通宵都下不了一点点,最后只有选择离线安装,现在发出离线安装地址和方法,希望对大家有帮助 一,首先下载SDK的安装包,android-sdk_r10-wi ...
- 离线安装nginx(包括离线安装gcc-g++环境,免费下载gcc离线安装包)
离线安装nginx(包括离线安装gcc-g++环境) 有些时候我们的linux服务器无法连接公网的情况下就需要离线安装应用 检查电脑是否有gcc和gcc-c++环境 gcc -v g++ -v # 如 ...
- Ubuntu20.04设置静态IP,安装Samba服务,实现win10远程访问文件夹
道阻且长,行则将至.埋头苦干,不鸣则已,一鸣惊人!加油,骚年! 文章目录 1 参考资料 2 絮叨絮叨 3 Ubuntu20.04 设置静态 IP 3.1 基础环境 3.2 配置过程记录 3.2.1 配 ...
- linux离线安装docker教程,Linux 离线安装docker的过程
前言 有时候会遇到服务器不能联网的情况,这样就没法用yum安装软件,docker也是如此,针对这种情况,总结了一下离线安装docker的步骤 1. 准备docker离线包 下载需要安装的docker版 ...
- python如何离线安装第三方库_离线环境安装python第三方库
python 离线环境安装python第三方库 author: yafeishi tags: AntDB,python python对于运维工作确实方便了很多,但很多比较实用的库都是第三方提供,在os ...
- linux 离线安装nfs,ubuntu 上离线安装包制作与安装之NFS搭建
在Ubuntu上离线搭建NFS服务器 一.制作离线软件包 在联网且环境与你相同的电脑上 制作离线软件包 注:先查看有没有安装nfs-utils的安装包 命令:# rpm -q nfs-utils 1. ...
- python包离线安装教程_Linux下离线安装Python项目的依赖包
Linux下离线安装Python项目的依赖包 记录下在Linux下离线安装Python项目的依赖包的方法步骤.第一步新建一个site-packages文件夹,把Python项目有需要的依赖包名称导出到 ...
最新文章
- iis+php解析漏洞修复,IIS7.0畸形解析漏洞通杀0day
- 如何调用形参数组_函数的参数
- 光脚丫学LINQ(029):如何将列表示为类成员
- 【leetcode】42. Trapping Rain Water 计算坑洼地的积水量
- 【ABAP妙用】复制ALV之负号提前
- python22个字符串长度_python字符串处理内置方法一览表
- json学习之三:JSONArray的应用
- 西北师范大学知行学院计算机科学与技术,西北师范大学知行学院电子信息工程专业...
- 系统 应用 数据缺一不可 云优化三步走
- 基于STP的两种负载均衡的介绍
- laravel 事件及监听
- python中提交post表单_python接口自动化二(发送post请求)
- [通用指导]笔记本内置无线网卡选用
- xfs文件系统修复问题
- SAP 之定义工厂(Plant)
- dz.27z.co index.php,【DZ插件】VIP客户组开通 v2.0.2(zms)
- 拼多多“百亿农研”开辟发展新路径
- python中for循环在遍历文件内容时的问题
- ora-20005:object statistics are locked(stattype=all)的原因及解决方法
- JAVA 基础——学习
热门文章
- java defunct 父进程是1 linux,如何与父级1终止defunct进程
- VS配置PCL“无法解析外部符号”
- 市面上的教育点播软件选择从这几个方面来看
- JavaScript清空数组的三种方法及效率分析
- python之函数传递,形式参数和实际参数
- 创建粉丝圈,活跃率提高50%,运营主做对了这4件事
- HTML学习笔记2:文本
- Unknown repo: ‘PowerTools‘
- ubuntu安装投影仪后系统无法启动
- 运用REST提取ROI信号值与结果显示