本文为企业级Openshift实践文档系列第一篇,后续还将继续推出系列文章。
OCP 4 相比 3 有巨大的提升,但是直到 4.2 才提供离线安装,因此我们从 4.2 开始尝试。整个过程主要验证了如下内容:
1、按照 bare metal 的方式在 VMware ESXi 6.7.0 环境(非 vSphere,non-tested platforms)安装部署成功;
2、不需部署 DHCP,采用 OpenShift 4.1 Bare Metal Install Quickstart 中第二种 STATIC IPS 方式但修正了其中的错误。对于3、小规模集群的正式部署也建议采用这种方式;
3、不需部署 LB,但仅仅针对试验环境确认这种方式是可行的。正式部署不应采用。
Intro
OCP 文档和软件下载在 openshift.com 和 redhat.com 各有一套,但是红帽网站的下载速度、内容更新、文档格式(支持 PDF)均优于 openshift.com,因此建议主要使用前者,不过有些内容需要红帽账号。
目前的实验环境为 VMware ESXi,而 9.4. Installing a cluster on vSphere in a restricted network 要求使用的是 VMware vSphere,因此我们虽然使用虚拟机,但仍然按照 bare metal 的方式安装,虽然文档也提及:
但从我们的实践结果看,基于 VMware ESXi 6.7.0 采用 bare metal 方式可以成功安装 OCP 4.2,且没有需要特别调整的地方。当然主要是指功能运行正常,至于性能、稳定性等等,正式使用仍应采用官方验证的环境,参见 OpenShift Container Platform 4.x Tested Integrations。
以下为实验环境及相关配置:
之后部署预期配置:
以下步骤尽可能将操作脚本化,但是由于安装虚拟机、修改配置文件等很难完全做到。
根据以下参考在正式安装 OCP 前需配置相关依赖:
以上 DHCP、LB、DNS、HTTP Server、Mirror registry 都是安装所依赖的服务,大多运行在堡垒机(bastion host)。由于是实验环境,不可能动公司现有的正式服务,因此尽量自行搭建,而这些依赖是否必须以及如何部署将在以下各节讨论。
在文档中 Bastion host 实际有多个作用:
由于实验环境所限(无法直接或通过代理连接外网),在该环境中部署的 Bastion host 并不直接同步外网内容,因此只起了另外几个作用(因此在以下安装中命名为 base),如何同步镜像将在 Mirror registry 一节说明。
堡垒机安装配置步骤。比较繁琐但非本文重点,因此折叠以下内容。
VMWare ESXi
Create a new virtual machine
Customize settings
CentOS 7
INSTALLATION SUMMARY
验证配置,检查网络连接及 DNS 是否正常。
YUM
OCP 4 在安装过程中需从 HTTP Server 获取两种内容:
针对第二种情况,由于使用容器运行 HTTP Server 非常方便,不存在繁琐的安装配置,自己部署一套完全没问题。但有个疑问,就是集群安装成功后如果需要添加新的节点机是否仍需要访问 HTTP Server 提供的 Ignition 文件,如是的话那么也应该找一个永久性的地方存放;但 bootstrap.ign 包含敏感信息,如对应"/root/.docker/config.json"的 contents 包含 registry 的用户密码,因此也不适合放在 Public HTTP Server。见之后 Post-installtion / Backup 一节。
暂定先自行搭建,具体 podman 的命令见 Ignition config 一节。
虽然在 9.3.4.1. Networking requirements for user-provisioned infrastructure 提及了:
但是考虑到没有现成的 DHCP 服务而自搭的话,对于正式环境就又多了一个需要运维的点,因此对小规模 OCP 集群仍倾向于能用静态 IP 配置解决最好,参见 Set up static IP configuration for an RHCOS node:
这种方式是在 RHCOS 启动时输入相应配置参数,相对直观,但仍有麻烦的地方,就是这个界面无法拷贝粘贴、手工输入大量文本也容易出错,但因为本来在此处就有不少输入、额外并未多出太多,所以总的来说这种方法还是可以接受, 不需要搭建 DHCP 服务 。
### LB
实验环境为了省事,不搭建 LB 服务,而是通过 DNS 设置将:
经实际验证无问题,当然这也失去了高可用,在正规环境还是必须配置 LB,具体步骤参见 Close to OpenShift 4 Installing raw version#LB(公司内也有现成服务)。
在 Bastion host 上部署 DNS 服务。参考 Setting Up DNS Server On CentOS 7 及其他 dns forward 文档 :
options {
listen-on port 53 { 127.0.0.1; 10.130.250.202; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost; 10.130.250.0/24; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type forward;
forward only;
forwarders { 10.130.250.24; };
};
zone "paas02.uat.xxxorgcloud.com" IN {
type master;
file "paas02.zone";
allow-update { none; };
};
zone "250.130.10.in-addr.arpa" IN {
type master;
file "paas02.rzone";
allow-update { none; };
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
3、vi /var/named/paas02.zone,参考 ocp4-zonefile.db :
$TTL 1W
@ IN SOA ns1.paas02.uat.xxxorgcloud.com. root (
2019070700 ; serial
3H ; refresh (3 hours)
30M ; retry (30 minutes)
2W ; expiry (2 weeks)
1W ) ; minimum (1 week)
IN NS ns1.paas02.uat.xxxorgcloud.com.
;
ns1 IN A 10.130.250.202
;
registry IN A 10.130.250.202
;
; The wildcard points to worker01
*.apps IN A 10.130.250.206
;
bootstrap IN A 10.130.250.209
master01 IN A 10.130.250.203
master02 IN A 10.130.250.204
master03 IN A 10.130.250.205
worker01 IN A 10.130.250.206
worker02 IN A 10.130.250.207
;
; The api points to the IP of LB
api IN A 10.130.250.209
api-int IN A 10.130.250.209
;
; The ETCd cluster lives on the masters...so point these to the IP of the masters
etcd-0 IN A 10.130.250.203
etcd-1 IN A 10.130.250.204
etcd-2 IN A 10.130.250.205
;
; The SRV records are IMPORTANT....make sure you get these right...note the trailing dot at the end...
_etcd-server-ssl._tcp IN SRV 0 10 2380 etcd-0.paas02.uat.xxxorgcloud.com.
_etcd-server-ssl._tcp IN SRV 0 10 2380 etcd-1.paas02.uat.xxxorgcloud.com.
_etcd-server-ssl._tcp IN SRV 0 10 2380 etcd-2.paas02.uat.xxxorgcloud.com.
;
;EOF
注意以上 api* 的 IP 在安装过程中需要调整(见 LB 一节说明,具体过程见下)。
4、vi /var/named/paas02.rzone,参考 ocp4-reverse.db :
$TTL 1W
@ IN SOA ns1.paas02.uat.xxxorgcloud.com. root (
2019070700 ; serial
3H ; refresh (3 hours)
30M ; retry (30 minutes)
2W ; expiry (2 weeks)
1W ) ; minimum (1 week)
IN NS ns1.paas02.uat.xxxorgcloud.com.
;
202 IN PTR registry.paas02.uat.xxxorgcloud.com.
209 IN PTR bootstrap.paas02.uat.xxxorgcloud.com.
203 IN PTR master01.paas02.uat.xxxorgcloud.com.
204 IN PTR master02.paas02.uat.xxxorgcloud.com.
205 IN PTR master03.paas02.uat.xxxorgcloud.com.
206 IN PTR worker01.paas02.uat.xxxorgcloud.com.
207 IN PTR worker02.paas02.uat.xxxorgcloud.com.
;
;EOF
注意以上 DNS 的 Reverse 记录省略了:
209 IN PTR api.paas02.uat.xxxorgcloud.com.
209 IN PTR api-int.paas02.uat.xxxorgcloud.com.
在安装过程中会将 api 指向的 bootstrap IP 的 209 调到 master01 IP 的 203,但 master01 重启后的 hostname 会变成 api。因此去除了该 Reverse 记录,貌似未影响平台功能。但这种操作的主要目的还是为了在实验室环境省去搭建 LB 的步骤,对于不熟悉的人可能反而把事情弄复杂了。TODO
5、service named start
6、vi /etc/resolv.conf
7、允许之后创建的 OCP 节点机访问:firewall-cmd --permanent --add-port=53/tcp && firewall-cmd --permanent --add-port=53/udp && firewall-cmd --reload
8、从本机及外部验证:nslookup repos.xxxorgcloud.com && nslookup bootstrap.paas02.uat.xxxorgcloud.com
既然是 Installing in restricted networks,对于一个正常的企业环境,内部镜像应该是现成的(我们已部署搭建 JFrog)最不需要自行搭建的, 但是,OCP 4 安装程序对镜像的使用却不是通常的方式:
由于以上限制,且 bastion/base 也无法直连或通过代理连接外网,只好先在本地开发机部署 Linux VM,执行 release mirror 从 quay.io 镜像至 bastion 的 mirror-registry 上(本机需有 telnet bastion 80/5000 等网络权限)。
参考 9.1.3. Creating a mirror registry,注意有些准备工作已经在 Bastion host 一节提前做了。
mkdir -p /opt/registry/{auth,certs,data}
生成 registry 证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/registry/certs/domain.key -x509 -days 365 -out /opt/registry/certs/domain.crt -subj "/CN=registry.paas02.uat.xxxorgcloud.com"
cp /opt/registry/certs/domain.crt /etc/pki/ca-trust/source/anchors/ && update-ca-trust
生成 registry 登录用户密码:htpasswd -bBc /opt/registry/auth/htpasswd root ****
运行 registry:
podman run --name mirror-registry -d -p 5000:5000 -v /opt/registry/data:/var/lib/registry:z -v /opt/registry/auth:/auth:z -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /opt/registry/certs:/certs:z -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key repos.it.xxxorg.com:8080/library/registry:2
允许外部访问:firewall-cmd --add-port=5000/tcp --permanent && firewall-cmd --reload
验证:curl -k https://registry.paas02.uat.xxxorgcloud.com:5000/v2/_catalog -u root:****
参考 9.1.4. Creating a pull secret for your mirror registry:
由于从外网 mirror 耗时很长(具体细节参见 Close to OpenShift 4 Installing raw version),利用已经 mirror 好的文件:
验证:
注意自己部署的 registry 这个镜像貌似有 Bug,如果 curl 或者 podman login 有问题可以 podman stop mirror-registry & podman start registry 试试。
在 Bastion host 上生成 Ignition 配置文件。参考 9.3.7. Creating the Kubernetes manifest and Ignition config files,注意有些准备工作已经在 Bastion host 一节提前做了。
apiVersion: v1
baseDomain: uat.xxxorgcloud.com
compute:
- hyperthreading: Enabled
name: worker
replicas: 0
controlPlane:
hyperthreading: Enabled
name: master
replicas: 3
metadata:
name: paas02
networking:
clusterNetwork:
- cidr: 192.8.0.0/14
hostPrefix: 23
networkType: OpenShiftSDN
serviceNetwork:
- 172.30.0.0/16
platform:
none: {}
pullSecret: '{"auths":{"registry.paas02.uat.xxxorgcloud.com:5000":{"auth":"**********"}}}'
sshKey: 'ssh-rsa AAAAB..................Byw== root@base'
additionalTrustBundle: |
-----BEGIN CERTIFICATE-----
MIIFM..................rBgNV
..................
..................
..................
OQPLM..................4SQ==
-----END CERTIFICATE-----
imageContentSources:
- mirrors:
- registry.paas02.uat.xxxorgcloud.com:5000/ocp4/openshift4
source: quay.io/openshift-release-dev/ocp-release
- mirrors:
- registry.paas02.uat.xxxorgcloud.com:5000/ocp4/openshift4
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
其中:
cd ~(以下命令不能指定绝对路径,必须在制作 Ignition 文件的 paas02 目录上一层操作)
在进入 RHCOS 安装配置以前先创建相应虚拟机,以 bootstrap 为例:
https://10.130.250.200 root/******
Navigator -> Virtual Machines -> Create / Register VM
Create a new virtual machine
Name: bootstrap
Compatibility: ESXi 6.7 Virtual machine
Guest OS family: Linux
Guest OS version: CoreOS Linux (64-bit)(注意现在所使用的 VMware 版本还未提供 RHCOS 选项,安装后会提示不符合。)
Customize settings
4 CPU、16G Memory、120G Hard disk(参见 9.3.3.3. Minimum resource requirements)
CD/DVD Drive 1: Datastore ISO file (datastore02/ocp-installer/rhcos-4.2.0-x86_63-installer.iso)
参考 9.3.8.1. Creating Red Hat Enterprise Linux CoreOS (RHCOS) machines using an ISO image:
成功安装后从跳板机(bastion/base)访问 bootstrap 机器:ssh core@bootstrap
在 bootstrap 验证:
网络配置是否符合安装时的指定:
验证是否成功启动 bootstrap 相应服务:
类似 bootstrap,启动参数调整为:
主要改动见标黑处,另 master02/03 的 IP 分别为 204/205,但注意 ignition_url 中的 master.ign 都是使用同一个 Ignition 配置文件、不要在文件名添加数字。由于无法拷贝粘贴,请输入仔细核对后再回车进行。如果安装有问题会进入 emergency shell,简单 ping repos.xxxorgcloud.com 看网络、域名解析是否正常,如果正常一般是以上参数输入有误,reboot 退出 shell 回到第一步重新开始。
安装成功后 master 会重启一次,之后同样从跳板机访问:ssh core@master01
在各 master 检查 etcd 服务是否成功启动:sudo netstat -ltnp|grep 2379
待 master 节点机都成功安装后先不着急装 worker,先执行下一步。
待 3 台 master 安装成功后,在 bootstrap 继续执行:journalctl -b -f -u bootkube.service
有如下类似日志:
待以上三个 etcd 节点均 healthy 后:
待出现“It is now safe to remove the bootstrap resources”提示后在 bastion/base 修改 DNS 服务配置:
同 master,这一步可以和上一步同时进行,如果是尝试怕搞乱的话也可以等上一步成功后再做。启动参数调整为:
主要改动见标黑处,另 worker02 的 IP 分别为 207,但注意 worker.ign 不要添加 02。由于无法拷贝粘贴,请输入仔细核对后再回车进行。如果安装有问题会进入 emergency shell,简单 ping repos.xxxorgcloud.com 看网络、域名解析是否正常,如果正常一般是以上参数输入有误,reboot 退出 shell 重新开始。
安装成功后 worker 会重启一次,之后同样从跳板机访问:ssh core@worker01
在 bastion/base:
CSRs
参考 9.3.12.1.2. Configuring storage for the image registry in non-production clusters
尚未配置正规域名,暂时将如下内容加入本机 hosts 文件:
访问 https://console-openshift-console.apps.paas02.uat.xxxorgcloud.com 并按照上一步提示的用户密码成功登录:
Post-installtion
首次登录 Web Console 会提示:
由于内部 Gitlab 未提供 https 无法使用,暂时配置 htpasswd 方式。4.1. Configuring an HTPasswd identity provider 步骤比较繁琐,直接如下即可(不清楚为何要那么复杂?TODO):
参见 Configuring image settings:
但注意自动重启并不是修改后马上生效,另外在重启节点机时 OCP 平台有一小段时间不可用。
最后检验使用 Helm 3 rc 2 部署 Sakura 成功。到这一步可以认为安装成功并基本可用,当然还有一些 Alerts 需要处理,在之后的配置管理的维基中继续。
目前新增 master 或 worker 节点的做法同以上安装步骤,但是之前的 HTTP Server 是临时性搭建,其提供的 master.ign / worker.ign 内容是否需要备份还是说能够从已搭建好的集群(比如 Machine Config Pools)重新生成?
TODO
参见最上 Intro → Reference 所列的解疑网站,是遇到问题最应搜索的地方。以下所列为自己的一些总结、以及因为自己在准备阶段失误引起的罕见错误(网上未搜到)。
相比 OCP 3 的安装及配置管理以及常用的 Debug 手段,OCP 4 有如下大的改动。
OCP 4 节点机 OS 主要使用 Red Hat Enterprise Linux CoreOS (RHCOS),相比以往安装 RHEL/CentOS 6/7:
这样做的好处是安装完成就一步到位,而后者通常还需要对各节点机做更多的手工配置(很难保证各节点节配置完全同步)或者使用 Ansible 等等。但也有问题:
OCP 4 使用 CRI-O 替换了 Docker 容器引擎,因此相比以往容器相关的排查手段,现在主要使用 Podman 和 Crictl 这两个工具,至于为什么需要两个工具参见 Crictl Vs Podman:
另外在 1.2.1.3. Installations in restricted networks 提及了:
目前有 repos.it.xxxorg.com:8080 作为容器镜像、registry.it.xxxorg.com 作为容器 Repository、还有 repos.xxxorgcloud.com 等,由于配置、非 HTTPS 等原因,实验时各有问题,需要梳理整合。TODO
最常见的问题就是由于安装时引导参数输入错误导致失败并进入 emergency shell:
注意有的错误会尝试很久到 timeout,因此如果没有一直盯着屏幕、自动重启后又回到安装界面,就会觉得莫名其妙。
进入 Shell 后可以:
Bootstrap 基本安装成功并且可以从跳板机 ssh 后,首先验证是否成功启动相关服务:
如果没有正常运行状态的容器可以在 journalctl 日志中搜索"pulling image”,如果出现"Error pulling image"则有以下几种可能:
在尝试过程中碰到过 journalctl 日志出现以下消息:
参考 Cert issues on bootstrap cluster,执行:
openssl s_client -connect api.paas02.uat.xxxorgcloud.com:6443 | openssl x509 -noout -text
果然发现 certs expired,但奇怪的是 install-config.yaml 是当天创建而过期日是几天前,因为之前已经注意到 9.3.7. Creating the Kubernetes manifest and Ignition config files 提及了:
继续搜索到 OpenShift 4.1.4 installation on vSphere failed: certificate has expired:
果然是每次生成 Ignition 配置时我做的是 rm -rf paas02/* 但实际 paas02 下的 .openshift_install_state.json 并未删除,因此需要彻底删除该目录:rm -rf paas02。
成功安装三台 master 后在 bootstrap 使用 journalctl -b -f -u bootkube.service 持续观察时提示:
三台 master 没有任何差别,使用 ps -ef | grep etcd 对比可以发现 master03 没有 etcd 进程。查找相关日志:
发现 etcd-member-master03.paas02.uat.xxxorgcloud.com_openshift-etcd_etcd-member-*.log 中有异常:
由于 master03 和 master01/02 无任何差别,重装 master03 仍然出错,估计不是 master03 安装的问题而是 01/02 引起。由于之前 DHCP 将 10.130.250.205 给了 master02,虽然也删除 master02 重装但不知道是否有影响,因此将 master 全部删除重装,错误消失。
成功安装三台 master 后在 bootstrap 用 journalctl -b -f -u bootkube.service 观察长时间无新输出,使用 journalctl -f 或者 journalctl -f -u bootkube -u openshift 观察有如下提示不停出现:
上网搜索特别是 https://github.com/openshift/installer 未发现有提及相关问题的,非常奇怪,由于是使用 bare metal 方式在 VM 上安装、上述错误提及的又是 MachineConfig 相关,还以为是未验证平台的 Bug。后来反复查看安装文档,发现在 install-config.yaml 中配置 clusterNetwork 时错误理解成节点机的 IP 网段了,但修改后仍未解决,后转向 master01 日志发现了明确线索:
原因是在修改 clusterNetwork 时仅改动了 cidr 而忘了将 hostPrefix 从 29 改为 23,导致可用 IP 非常少引起故障。
文章来自:泰康云容器云架构团队出品
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞4
添加新评论0 条评论