k8s-ocp-yaml
Search…
2020-02-25-openshift 4.3 离线安装--DHCP方式
本文描述openshift4.3 baremental 离线安装方式,我的环境是 vmwamre esxi 虚拟化,也适用于其他方式提供的虚拟主机或者物理机。
4.x部署方式和之前3.x完全不同,请暂时忘记3.x的部署方式。
本篇采用PXE方式安装openshift集群,会启用dhcp服务,要求部署环境不能有其他dhcp服务,如果有,要想办法把网络隔离开。
如果对于DHCP冲突无法解决,建议采用静态IP方法,可以参照文末的其他文章,比如redhat wangzheng那篇。

部署环境介绍

本节介绍高可用部署所需的资源配置,及需要的安装文件。
整个环境部署可以不需要RHEL官方源,本文档部署所需的所有离线文件均可在网盘中下载,地址见下文。

官方推荐最小化资源配置--可忽略,直接看下一小节

这步介绍下官方推荐的配置,实际部署还会使用到dns,dhcp等服务。 知道下就好,实际部署不是按这个来。 一个临时 bootstrap 机器 三台 control plane 或 master 机器 至少两台计算或 worker 机器
Note: 集群要求 bootstrap 机器在三台 control plane 机器上部署 OpenShift Container Platform 集群。您可在安装集群后删除 bootstrap 机器。
官方推荐最低资源需求。
Machine
Operating System
vCPU
RAM
Storage
Bootstrap
RHCOS
4
16GB
120 GB
Control plane
RHCOS
4
16 GB
120 GB
Compute
RHCOS or RHEL 7.6
2
8 GB
120 GB
dns,dhcp,负载均衡等服务官网未做配置要求,可以用利用环境内已有服务进行配置。也可以全新部署。

本此部署使用资源

方案还是采用高可用,比官方多了一个base节点,用来搭建部署需要的dns,dhcp等服务,这台系统用Centos7.6,因为centos解决源比较方便,等熟悉部署及所需安装包后可以换成RHEL。
其他机器都用RHCOS,就是coreos专门针对openshift的操作系统版本。 对虚机资源做了压缩,家里穷,没那么多资源 T T
如果不要master高可用,可以把master1,2 去掉。
openshift集群节点统一使用RHCOS。注意系统不需要提前安装!!!会通过自动部署来安装。
几台RHCOS节点可以先把虚机创建好,不要装系统.
Machine
OS
vCPU
RAM
Storage
IP
bastion
Centos7.6
2
8GB
100 GB
192.168.2.10
bootstrap-0
RHCOS
2
4GB
40 GB
192.168.2.11
master-0
RHCOS
4
8 GB
40 GB
192.168.2.12
master-1
RHCOS
4
8 GB
40 GB
192.168.2.13
master-2
RHCOS
4
8 GB
40 GB
192.168.2.14
worker-0
RHCOS
4
16 GB
40 GB
192.168.2.15
worker-1
RHCOS
4
16 GB
40 GB
192.168.2.16
节点角色: 1台 基础服务节点,用于安装部署所需的dhcp,dns,ftp服务。系统不限。同时承担负载均衡,用于负载master节点api及router,功能同3.x。这个服务现在需要自己部署,生产环境也可用硬负载。 1台 部署引导节点 Bootstrap,用于安装openshift集群,在集群安装完成后可以删除。系统RHCOS 3台 控制节点 Control plane,即master,通常使用三台部署高可用,etcd也部署在上面。系统RHCOS 2台 计算节点 Compute,用于运行openshift基础组件及应用 。系统RHCOS

安装所需文件

rpm-packages.tar.gz 所需rpm安装包 docker-io-registry-2.tar docker镜像文件,这个手动重新拉取 registry:2.6 不要用2.7 openshift-client-linux-4.3.5.tar.gz oc客户端命令 registry.tar.gz 离线镜像仓库数据文件 pull-secret.json 镜像权限文件 openshift-install 安装程序 dnsmasq.d/ocp4.conf haproxy/haproxy.cfg matchbox/ 配置文件已经RHCOS的三个大文件 matchbox-v0.8.3-linux-amd64.tar.gz
对于其中配置文件,供参考,需按照文档说明修改以匹配自己环境。 程序和安装包,数据文件可以直接使用。
下载地址见文末

安装顺序

顺序就是先准备基础节点,包括需要的dhcp、dns、文件服务器、引导文件等,然后安装引导机 bootstrap,再后面就是 master, 再 node
ocp-4.1-install-process

安装准备-镜像仓库

安装base基础组件节点

|base|centos7.6|4|8GB|100 GB|192.168.2.10|
  1. 1.
    安装系统 centos7.6 mini
    设置IP,设置主机名,关闭防火墙和selinux
    注意所有节点主机名采用三级域名格式 如 master1.aa.bb.com
1
hostnamectl set-hostname bastion.ocp4.example.com
2
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3
setenforce 0
4
systemctl disable firewalld
5
systemctl stop firewalld
Copied!
  1. 1.
    设置 yum 缓存包到本地 - 可选步骤 针对在线安装,这样以后如果切换到离线安装,可以方便知道用了哪些包 编辑 /etc/yum.conf 把keepcache改为1 keepcache=1
  2. 2.
    针对离线安装 -- 离线安装必做
把我缓存的rpm包,一次性都装上,后面所有的yum install 都不需要再执行了,但是其他命令和参数配置还是要的。
1
tar -zxvf rpm-packages.tar.gz
2
cd rpm-packages
3
yum localinstall *.rpm
Copied!

创建内部镜像仓库

此仓库用于存放用于部署openshift平台所需使用的镜像,仓库本身也是用容器启动的。 安装所需软件包,及创建所需目录,这些文件夹将挂载到registry容器中。
在线安装直接使用yum install即可
1
yum -y install podman httpd httpd-tools vim
2
3
mkdir -p /opt/registry/{auth,certs,data}
Copied!
为 registry 提供证书。如果您没有现有的可信证书颁发机构,您可以生成自签名证书。 registry.example.com 是仓库的域名,自己定义,不要求和主机名一致。
1
cd /opt/registry/certs
2
openssl req -subj '/CN=registry.example.com/O=My Company Name LTD./C=US' -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout domain.key -out domain.crt
Copied!
给仓库生成用户密码,root password分别为仓库的用户名和密码。
1
htpasswd -bBc /opt/registry/auth/htpasswd root password
Copied!
离线安装先导入下registry2的镜像,现在安装也可以这么多,docker.io的镜像拉取比较慢
运行内部镜像仓库,-p 后面第一个5000表示镜像映射端口,可以修改成其他的。
1
podman load -i docker-io-registry-2.tar
2
3
podman run --name mirror-registry -p 5000:5000 \
4
-v /opt/registry/data:/var/lib/registry:z \
5
-v /opt/registry/auth:/auth:z \
6
-e "REGISTRY_AUTH=htpasswd" \
7
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
8
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
9
-v /opt/registry/certs:/certs:z \
10
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
11
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
12
-d docker.io/library/registry:2
Copied!
如果防火墙没关闭,需要放行本地端口,下面这个5000对应上面podman -p 后面第一个5000
1
firewall-cmd --add-port=5000/tcp --zone=internal --permanent
2
firewall-cmd --add-port=5000/tcp --zone=public --permanent
3
firewall-cmd --add-service=http --permanent
4
firewall-cmd --reload
Copied!
hosts 添加 registry.example.com 域名解析,IP是本机地址,域名与上面生成证书使用的域名一致。
1
echo "192.168.2.10 registry.example.com" >>/etc/hosts
Copied!
测试访问仓库,没有报错返回空值就是正常的,当前仓库内还没有镜像
1
curl -u root:password -k https://registry.example.com:5000/v2/_catalog
Copied!
如仓库无法访问,您应该检查 1.) registry 容器是否正常启动 2.) registry.example.com 域名是否可以正常解析 3.) htpasswd 文件中的用户名密码是否正确 4.) 防火墙5000端口是否开放 5.) 证书域名是否正确

下载镜像文件

下载最新的oc命令。进入下载链接,下载openshift client,install 文件不需要,后面从镜像里面提取 直接选一个4.3最新的 openshift-client-linux-4.3.5.tar.gz 网盘里有这个文件
1
tar -zxvf openshift-client-linux-4.3.5.tar.gz
2
mv oc /usr/local/bin/
3
oc version
4
Client Version: 4.3.5
Copied!
准备拉取镜像权限认证文件。 从 Red Hat OpenShift Cluster Manager 站点的 Pull Secret 页面下载 registry.redhat.io 的 pull secret。 https://cloud.redhat.com/openshift/install/pull-secret
1
# 把下载的txt文件转出json格式,如果没有jq命令,通过epel源安装,或者通过
2
cat ./pull-secret.txt | jq . > pull-secret.json
3
4
yum install epel-release -y
5
yum install jq -y
Copied!
json文件内容大概如下
1
{
2
"auths": {
3
"cloud.openshift.com": {
4
"auth": "b3BlbnNo...",
5
"email": "[email protected]"
6
},
7
"quay.io": {
8
"auth": "b3BlbnNo...",
9
"email": "[email protected]"
10
},
11
"registry.connect.redhat.com": {
12
"auth": "NTE3Njg5Nj...",
13
"email": "[email protected]"
14
},
15
"registry.redhat.io": {
16
"auth": "NTE3Njg5Nj...",
17
"email": "[email protected]"
18
}
19
}
20
}
Copied!
把本地仓库的用户密码转成base64编码
1
echo -n 'root:password' | base64 -w0
2
cm9vdDpwYXNzd29yZA==
Copied!
然后在pull-secret.json里面加一段本地仓库的权限。第一行仓库域名和端口,第二行是上面的base64,第三行自己写个邮箱
1
"auths": {
2
...
3
"registry.example.com:5000": {
4
"auth": "cm9vdDpwYXNzd29yZA==",
5
"email": "[email protected]"
6
},
7
...
Copied!
设置环境变量 OCP_RELEASE版本,https://quay.io/repository/openshift-release-dev/ocp-release?tab=tags 这个页面可以查看,版本写的不对,下面oc adm 时候会提示 image does not exist LOCAL_REGISTRY 本地仓库的域名和端口 LOCAL_REPOSITORY 镜像存储库名称,使用ocp4/openshift4,不需要改 PRODUCT_REPO RELEASE_NAME,都是一些版本特征,保持不变即可 LOCAL_SECRET_JSON 密钥路径,就是上面pull-secret.json 的存放路径
1
export OCP_RELEASE="4.3.5-x86_64"
2
export LOCAL_REGISTRY='registry.example.com:5000'
3
export LOCAL_REPOSITORY='ocp4/openshift4'
4
export PRODUCT_REPO='openshift-release-dev'
5
export LOCAL_SECRET_JSON='/root/pull-secret.json'
6
export RELEASE_NAME="ocp-release"
Copied!
将自签名的证书复制到默认信任证书路径
1
cp /opt/registry/certs/domain.crt /etc/pki/ca-trust/source/anchors/
2
update-ca-trust extract
Copied!
拉取镜像,这一步的动作就是把quay官方仓库中的镜像,同步到我们本地仓库,如果失败了重新执行命令。 整体内容大概5G。本地仓库数据在 /opt/registry/data 可以直接用我的离线文件 registry.tar.gz tar -zxvf registry.tar.gz ,把data 目录放到 /opt/registry,然后重启镜像仓库 podman restart mirror-registry
用离线文件的话,这句oc adm 命令就不需要执行了,下面返回的imageContentSource内容也不必介意,每次都一样的,抄下面的就行,仓库名称改成你的就好
1
oc adm -a ${LOCAL_SECRET_JSON} release mirror \
2
--from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE} \
3
--to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \
4
--to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}
Copied!
oc adm release mirror执行完毕后,返回的信息需要记录下来,特别是imageContentSource信息,后面 install-config.yaml 文件里配置进去
1
To use the new mirrored repository to install, add the following section to the install-config.yaml:
2
3
imageContentSources:
4
- mirrors:
5
- registry.example.com:5000/ocp4/openshift4
6
source: quay.io/openshift-release-dev/ocp-release
7
- mirrors:
8
- registry.example.com:5000/ocp4/openshift4
9
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
10
11
12
To use the new mirrored repository for upgrades, use the following to create an ImageContentSourcePolicy:
13
14
apiVersion: operator.openshift.io/v1alpha1
15
kind: ImageContentSourcePolicy
16
metadata:
17
name: example
18
spec:
19
repositoryDigestMirrors:
20
- mirrors:
21
- registry.example.com:5000/ocp4/openshift4
22
source: quay.io/openshift-release-dev/ocp-release
23
- mirrors:
24
- registry.example.com:5000/ocp4/openshift4
25
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
Copied!
本地镜像仓库缓存好镜像之后,通过tag/list 接口查看所有tag,应该能列出来一堆才是正常的
1
curl -u root:password -k https://registry.example.com:5000/v2/ocp4/openshift4/tags/list
Copied!

提取 openshift-install 命令

为了保证安装版本一致性,会从镜像库中提取 openshift-install 命令,需要用到上面export的环境变量 这步要联网,如果是离线环境,直接使用提取好的 openshift-install 文件,网盘里有
1
# 这步是在线提取openshift-install文件,离线环境跳过
2
oc adm -a ${LOCAL_SECRET_JSON} release extract --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}"
Copied!
如果提示"error: image dose not exist",说明拉取的镜像不全,或者版本不对。
把文件移动到/usr/local/bin 并确认版本
1
chmod +x openshift-install
2
mv openshift-install /usr/local/bin/
3
openshift-install version
4
#openshift-install 4.3.5
5
#built from commit 82f9a63c06956b3700a69475fbd14521e139aa1e
6
#release image registry.example.com:5000/ocp4/[email protected]:64320fbf95d968fc6b9863581a92d373bc75f563a13ae1c727af37450579f61a
Copied!

安装准备 -- DNS/DHCP server 部署

网上部署方法诸多,有其他的写hosts文件不用dns server 及静态IP的方法或者修改RHCOS镜像。本次采用DHCP PXE方式​。​。
部署dnsmasq服务,这个服务可以同时做dns server, dhcp server和tftp,为后面的RHCOS提供PXE无人值守安装
1
yum install dnsmasq tftp-server ipxe-bootimgs -y
2
3
# 配置dnsmasq,配置文件如下,网盘里也有
4
cd /etc/dnsmasq.d/
5
6
# 需要提前把RHCOS节点的虚机创建好,在虚机配置里把MAC地址记下来
7
# 因为在内网里有其他机器,不把MAC和IP绑定,DHCP server准备的IP容易被其他机器拿去。
8
9
vi ocp4.conf
10
dhcp-range=192.168.2.11,192.168.2.16,255.255.255.0
11
enable-tftp
12
tftp-root=/var/lib/tftpboot
13
dhcp-match=set:bios,option:client-arch,0
14
dhcp-boot=tag:bios,undionly.kpxe
15
dhcp-match=set:efi32,option:client-arch,6
16
dhcp-boot=tag:efi32,ipxe.efi
17
dhcp-match=set:efibc,option:client-arch,7
18
dhcp-boot=tag:efibc,ipxe.efi
19
dhcp-match=set:efi64,option:client-arch,9
20
dhcp-boot=tag:efi64,ipxe.efi
21
dhcp-userclass=set:ipxe,iPXE
22
dhcp-option=option:router,192.168.2.1
23
dhcp-option=option:dns-server,192.168.2.10
24
dhcp-boot=tag:ipxe,http://bastion.ocp4.example.com:8080/boot.ipxe
25
address=/bastion.ocp4.example.com/192.168.2.10
26
address=/api.ocp4.example.com/192.168.2.10
27
address=/apps.ocp4.example.com/192.168.2.15
28
address=/api-int.ocp4.example.com/192.168.2.10
29
address=/master-0.ocp4.example.com/192.168.2.12
30
address=/etcd-0.ocp4.example.com/192.168.2.12
31
address=/master-1.ocp4.example.com/192.168.2.13
32
address=/etcd-1.ocp4.example.com/192.168.2.13
33
address=/master-2.ocp4.example.com/192.168.2.14
34
address=/etcd-2.ocp4.example.com/192.168.2.14
35
address=/worker-0.ocp4.example.com/192.168.2.15
36
address=/worker-1.aocp4.example.com/192.168.2.16
37
address=/bootstrap-0.ocp4.example.com/192.168.2.11
38
address=/registry.example.com/192.168.2.10
39
srv-host=_etcd-server-ssl._tcp.ocp4.example.com,etcd-0.ocp4.example.com,2380,10
40
srv-host=_etcd-server-ssl._tcp.ocp4.example.com,etcd-1.ocp4.example.com,2380,10
41
srv-host=_etcd-server-ssl._tcp.ocp4.example.com,etcd-2.ocp4.example.com,2380,10
42
dhcp-host=00:0c:29:7d:ef:3e,master-0.ocp4.example.com,192.168.2.12
43
dhcp-host=00:0c:29:a1:84:7e,master-1.ocp4.example.com,192.168.2.13
44
dhcp-host=00:0c:29:0f:7a:71,master-2.ocp4.example.com,192.168.2.14
45
dhcp-host=00:0c:29:26:c6:fb,worker-0.ocp4.example.com,192.168.2.15
46
dhcp-host=00:0c:29:da:5c:92,worker-1.ocp4.example.com,192.168.2.16
47
dhcp-host=00:0c:29:f2:40:e0,bootstrap-0.ocp4.example.com,192.168.2.11
48
log-queries
49
log-dhcp
Copied!
dhcp-range: 几台RHCOS预留的IP池,及掩码 dhcp-option=option:router: 网关地址 dhcp-option=option:dns-server: 这台部署机的IP,因为这台做dns server dhcp-boot=tag:ipxe: 写这台部署机的主机名,其他不用改 下面的address,分别是主机名和IP地址 api.ocp4.example.com 如果单master,指向master0,如果是多master,指向master的负载,这边写部署机,后面部署机上面安装负载均衡,负载指向到三个master api apps.ocp4.example.com 指向第一个node节点,router组件所在 api-int.ocp4.example.com 同api.ocp4.example.com,指向openshift api,就是当前bastion节点 dhcp-host dhcp与mac配置,分别是几台RHCOS的mac地址,主机名,ip地址
配置tftp server,并启动dnsmasq,如果本机开启了防火墙还需要防火墙放行,我这台上面已经关闭防火墙了
1
mkdir -p /var/lib/tftpboot
2
ln -s /usr/share/ipxe/undionly.kpxe /var/lib/tftpboot
3
4
# 启动dnsmasq
5
systemctl enable dnsmasq && systemctl restart dnsmasq
6
7
# 查看dnsmasq服务状态,如果有报错,会提示错误在配置文件哪一行
8
systemctl status dnsmasq -l
9
10
# 本地修改 resolv.conf 文件
11
# 加一行下面参数,IP是本机地址,要写在其他nameserver前面
12
# 注意这个参数写在这里重启应该会丢,要想不丢,修改 /etc/sysconfig/network-scripts/ifcfg-ens192
13
# 加一行 DNS1=192.168.2.10 ,然后systemctl restart network
14
vi /etc/resolv.conf
15
nameserver 192.168.2.10
16
17
# 验证dns server
18
yum install bind-utils -y
19
20
# 测试下dns解析
21
nslookup master-0.ocp4.example.com & nslookup bootstrap-0.ocp4.example.com
22
23
# 测试结果,能正常解析IP
24
Name: bootstrap-0.ocp4.example.com
25
Address: 192.168.2.11
26
Name: master-0.ocp4.example.com
27
Address: 192.168.2.12
Copied!

安装准备 -- haproxy 负载均衡

单master可以跳过这一步,不过我还没测试单master部署。
haproxy主要用于负载master api 6443 ,worker节点的router 80 443,可以被其他负载代替
1
yum install haproxy -y
2
cd /etc/haproxy/
3
vim haproxy.cfg #在最下面加配置文件,也可以把自带的frontend 和backend删掉,没有用
4
5
# 可选项,可以通过页面查看负载监控状态
6
listen stats
7
bind :9000
8
mode http
9
stats enable
10
stats uri /
11
monitor-uri /healthz
12
13
# 负载master api,bootstrap 后面删掉
14
frontend openshift-api-server
15
bind *:6443
16
default_backend openshift-api-server
17
mode tcp
18
option tcplog
19
20
backend openshift-api-server
21
balance source
22
mode tcp
23
server bootstrap 192.168.2.11:6443 check
24
server master0 192.168.2.12:6443 check
25
server master1 192.168.2.13:6443 check
26
server master2 192.168.2.14:6443 check
27
28
frontend machine-config-server
29
bind *:22623
30
default_backend machine-config-server
31
mode tcp
32
option tcplog
33
34
backend machine-config-server
35
balance source
36
mode tcp
37
server bootstrap 192.168.2.11:22623 check
38
server master0 192.168.2.12:22623 check
39
server master1 192.168.2.13:22623 check
40
server master2 192.168.2.14:22623 check
41
42
# 负载router,就是*.apps.ocp4.example.com , 这个域名如果 dns server 指向了本机,则这边必须配置,否则对于测试环境可选项。
43
frontend ingress-http
44
bind *:80
45
default_backend ingress-http
46
mode tcp
47
option tcplog
48
49
backend ingress-http
50
balance source
51
mode tcp
52
server worker0 192.168.2.15:80 check
53
server worker1 192.168.2.16:80 check
54
55
frontend ingress-https
56
bind *:443
57
default_backend ingress-https
58
mode tcp
59
option tcplog
60
61
backend ingress-https
62
balance source
63
mode tcp
64
server worker0 192.168.2.15:443 check
65
server worker1 192.168.2.16:443 check
Copied!
启动服务
1
systemctl enable haproxy && systemctl start haproxy
Copied!
验证服务
通过浏览器页面查看 IP:9000 可以看到haproxy的监控页面,当前后端服务还没起,所以很多红色的。

安装准备 -- matchbox部署 -- 文件下发

安装配置matchbox ,该服务主要是用作pxe安装rhcos时,分配分配rhcos的ign部署配置文件
文件目录,下面会说明文件如何配置
1
[[email protected] ~]# tree /var/lib/matchbox/
2
/var/lib/matchbox/
3
├── assets
4
│ ├── rhcos-4.3.0-x86_64-installer-initramfs.img
5
│ ├── rhcos-4.3.0-x86_64-installer-kernel
6
│ └── rhcos-4.3.0-x86_64-metal.raw.gz
7
├── groups
8
│ ├── bootstrap-0.json
9
│ ├── master-0.json
10
│ ├── master-1.json
11
│ ├── master-2.json
12
│ ├── worker-0.json
13
│ └── worker-1.json
14
├── ignition
15
│ ├── bootstrap.ign
16
│ ├── master.ign
17
│ └── worker.ign
18
└── profiles
19
├── bootstrap.json
20
├── cptnod.json
21
├── infnod.json
22
└── master.json
23
24
4 directories, 16 files
Copied!
官方matchbox架构图
matchbox
最上面是即将部署的节点,groups目录下每个配置文件里都写了对应节点的mac,两者会根据mac进行匹配
所以groups下面是每个节点对应一个配置文件
groups下的json文件,会有一个profile参数,对应 profiles 目录下的文件。 profiles 即代表角色
assets 存放的引导文件和安装系统需要的文件
下载matchbox-v0.8.3-linux-amd64.tar.gz,可以到github的release页面下载, https://github.com/poseidon/matchbox/releases
1
tar xf matchbox-v0.8.3-linux-amd64.tar.gz
2
cd matchbox-v0.8.3-linux-amd64/
3
cp matchbox /usr/local/bin
4
cp contrib/systemd/matchbox-local.service /etc/systemd/system/matchbox.service
5
vi /etc/systemd/system/matchbox.service # 把 User Group 两行删掉,直接以root运行
6
mkdir -p /var/lib/matchbox/{assets,groups,ignition,profiles}
Copied!
下载rhcos 安装文件,本次部署需要下面这三个,你可以从下面官网连接下载,百度网盘里也有: https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/latest/latest/
rhcos-4.3.0-x86_64-installer-initramfs.img rhcos-4.3.0-x86_64-installer-kernel rhcos-4.3.0-x86_64-metal.raw.gz
这三个文件放到 /var/lib/matchbox/assets 目录下
groups 目录下修改节点配置文件,主要是mac地址和检查对应的 profiles 是否正确
profiles 目录下修改配置文件,主要确认kernel initrd 对应的配置文件及 url , install_dev :在不同虚拟化或者物理平台磁盘命名可能不一样,看下当前部署机是sda 还是 vda,rhcos下命名规则应该是一样的
ignition 下的文件后面生成
启动matchbox systemctl enable matchbox && systemctl restart matchbox
matchbox 监听8080 端口,可以通过浏览器访问到 http://192.168.2.10:8080/assets/

openshift 安装

准备 install-config.yaml

首先创建 install-config.yaml 文件,来生成matchbox 需要的ign 文件
创建一对公钥和私钥,用作登录RHCOS
1
ssh-keygen -t rsa -b 2048 -N "" -f /root/.ssh/id_rsa
2
mkdir /root/ocp4
3
4
cd /root/ocp4
5
vi install-config.yaml
6
7
apiVersion: v1
8
baseDomain: example.com
9
compute:
10
- hyperthreading: Enabled
11
name: worker
12
replicas: 0
13
controlPlane:
14
hyperthreading: Enabled
15
name: master
16
replicas: 3
17
metadata:
18
name: ocp4
19
networking:
20
clusterNetworks:
21
- cidr: 10.254.0.0/16
22
hostPrefix: 24
23
networkType: OpenShiftSDN
24
serviceNetwork:
25
- 172.30.0.0/16
26
platform:
27
none: {}
28
pullSecret: '{"auths":{"registry.example.com:5000": {"auth": "cm9vdDpwYXNzd29yZA==","email": "[email protected]"}}}'
29
sshKey: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC24BYgsRAKTm40fFIPV/0Rx1veBY5hNsCHf6X7sByLXBA3A7BkBR9UnnTtRHN6ONNajaX3ralWHDd7t9OzSPym/+27/6JGz3AcCuSu1G8ie3M+E6XaFvaptKyvv7ua+vI2xgwC1WZGRhtQAtzccjFo2+ZQijc8pqHtLSao3jB3szAc5wzQd2JUL7zJ/hppxMD4pkCu1COSdtLpQci8exL2Km837glElmKrpVzVvfjan+4BmO0R3h9H9Xf3KDBZB/A84OjsjnIy31tsF1RWuAt1MwYwaGHDXGInG3bnnchXx5SRHpdFmtdVXvgY1S/M0WF9oPedjo++C8rRft41NfaJ [email protected]'
30
additionalTrustBundle: |
31
-----BEGIN CERTIFICATE-----
32
MIIDaTCCAlGgAwIBAgIJAPe1Z6c1QYJSMA0GCSqGSIb3DQEBCwUAMEsxHTAbBgNV
33
BAMMFHJlZ2lzdHJ5LmV4YW1wbGUuY29tMR0wGwYDVQQKDBRNeSBDb21wYW55IE5h
34
bWUgTFRELjELMAkGA1UEBhMCVVMwHhcNMjAwMzA5MTczMzQyWhcNMjEwMzA5MTcz
35
MzQyWjBLMR0wGwYDVQQDDBRyZWdpc3RyeS5leGFtcGxlLmNvbTEdMBsGA1UECgwU
36
TXkgQ29tcGFueSBOYW1lIExURC4xCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0B
37
AQEFAAOCAQ8AMIIBCgKCAQEAvfdF5YwZdsFzI7/UUMGmipWXjRre9rk1ljXqYQRz
38
CLi/a/GTXllxsdV81d3CEKIUm25PqrLT7wt9c+Pe9DP/dtzcYTAixQJzkhYyrqIw
39
BhJrQ4YQauGObMnR87yAMnHDQFyIItZz3t0uMjtYHCX1kUPuAgYBD2E+Yfm0eQ7Y
40
dHi4/TNbopP2PEc396wiPfYA5cDLQteKPT9dZXpFov3SNxNAfVJj+WsHz/D84Q5y
41
qeJ5Y9CmlF9FuLkrERtlPRa5ppFxeV0+ggAFMc5haGBW6gP6CBes3zObuXNBGtCk
42
9szUB5sgvopBbTalBBJG4iDhqHITktAWhFxvVU3JYH9qMwIDAQABo1AwTjAdBgNV
43
HQ4EFgQUAOAciw0dFDFje2Dx0MrSeR5kyNUwHwYDVR0jBBgwFoAUAOAciw0dFDFj
44
e2Dx0MrSeR5kyNUwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAtbi2
45
v4CO06xCwFEy1o6E8hWa3jy31O++pdsHziqlUnGnztz4FYWj7oXJbvfTnsFJN0jI
46
ImYuDdXHZGHRX4Mcc5le/4J/RF+sWZijdspVfMIfS7EUUES8Pfya82SzPehgF/oa
47
sQF+gOTir4cohhy+5rtDVn4nlwhfhMTjlahXq8K3dBxgbnMZoz+kkbhEsYyE0b2n
48
ACNAqWTCvfmU73IrXUpUaX+vwPs15wAfQl2FZyPM3cSAlU34WOxXga+SD2hqJmj2
49
cklGvWAwXAeo0BIDgU5nABoJT5++WVQ43H6BBOshrhhNzpLzDIUaEDQPkSVIw72B
50
TRMFn8AEaDdTyUY2Bg==
51
-----END CERTIFICATE-----
52
imageContentSources:
53
- mirrors:
54
- registry.example.com:5000/ocp4/openshift4
55
source: quay.io/openshift-release-dev/ocp-release
56
- mirrors:
57
- registry.example.com:5000/ocp4/openshift4
58
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
Copied!
baseDomain 就是上面每个主机配置的域名 metadata,name 就是节点master/worker名称后面一级,这也是为什么主机名要用好几级 worker 0 不代表0个worker,此处不用改 cidr 是pod ip池 ,servicenetwork 就是k8s里的service ip,两个都要和虚拟机本地ip网段区分开 pullsecret的信息在上面pull-secret.json 中都有 sshKey ssh公钥,cat /root/.ssh/id_rsa.pub 全部内容贴进去 additionalTrustBundle 私有镜像仓库证书,cat /opt/registry/certs/domain.crt, 需要注意整体内容往后移个空格,换行保持不变,可以参考我的文件 imageContentSources 是之前oc admin release mirror 返回的结果,上面有记录,如果也是ocp4.3,核对下仓库域名,其他不用修改

生产 ign 配置文件

1
# 备份下文件,下面命令执行后文件会被自动删除
2
cp install-config.yaml /tmp/install-config.yaml.bak
3
4
# 生成ign文件,如果要重新生成,要把整个ocp4目录删了重来
5
# 有个隐藏文件 .openshift_install_state.json 会导致报错
6
openshift-install create ignition-configs
7
8
# 查看文件目录
9
[[email protected] ocp4]# tree
10
.
11
├── auth
12
│ ├── kubeadmin-password
13
│ └── kubeconfig
14
├── bootstrap.ign
15
├── install-config.yaml.bak
16
├── master.ign
17
├── metadata.json
18
└── worker.ign
19
20
# 把 .ign 文件复制到matchbox 数据目录
21
cp *.ign /var/lib/matchbox/ignition/
Copied!

安装 bootstarp 和 master

部署机 bastion 执行命令监控部署状态
1
cd ~
2
openshift-install --dir=/root/ocp4 wait-for bootstrap-complete --log-level debug
Copied!
然后把bootstrap虚拟打开,第一次启动的时候找不到本地系统盘会自动切换到网卡pxe启动。
待系统安装完成后,bootstrap虚机控制台会停留在登录页面。
在部署机 basetion 可以通过 ssh 命令进入bootstrap
2
3
# 检查方法:
4
# 查看网络信息
5
hostname -I
6
ip route show
7
cat /etc/resolv.conf
8
9
# 查看运行容器,sudo podman ps, 应该有运行中容器
10
# 如果没有在运行的容器, ps -ef 看下是否有podman pull 的进程
11
# 通过curl命令检查跟镜像仓库的连通性,我遇到过连不上仓库,在部署机上重启了下仓库后好了
12
sudo podman ps
13
sudo ps -ef
14
15
# 查看进程端口
16
netstat -an 查看 6443、22623
17
18
# 也可以通过haproxy的页面,就是192.168.2.10:9000 可以看到bootstrap的状态变成了绿色
19
# 说明这个时候bootstrap 已经部署成功
20
21
# 查看服务状态的命令,ssh进去的时候就会提示这条命令
22
journalctl -b -f -u bootkube.service
Copied!
master 部署
把master几台虚机打开,会自动从pxe启动部署,检查方法与上面类似 通过haproxy页面查看master节点api及machine-config状态 以及通过netstat 查看端口 api 6443, etcd 2379
部署完成后,从haproxy上看到master-1的api状态异常,master-0 master-2 正常,还不太熟悉服务组件运行方式,我重启master-1后正常了,后续再看。
oc 命令可以看到master状态
1
cp /root/ocp4/auth/kubeconfig ~/.kube/config
2
oc get node
3
NAME STATUS ROLES AGE VERSION
4
master-0 Ready master,worker 113m v1.16.2
5
master-1 Ready master,worker 113m v1.16.2
6
master-2 Ready master,worker 113m v1.16.2
Copied!
在bastion 节点,haproxy的配置文件,backend 中的 bootstrap 需要删掉,并重启haproxy。
1
vi /etc/haproxy/haproxy.cfg
2
# backend openshift-api-server 删除bootstrap这行 server bootstrap 192.168.2.11:6443 check
3
# backend machine-config-server 删除bootstrap这行 server bootstrap 192.168.2.11:22623 check
4
5
# 重启服务
6
systemctl restart haproxy
Copied!

安装 worker

部署机 bastion 执行命令监控部署状态
1
cd ~
2
openshift-install --dir=/root/ocp4 wait-for install-complete --log-level debug
Copied!
当两台worker 在控制台看到已经部署完
在部署机之前 get csr 命令,查看node 节点加入申请,批准之,然后就看到了node节点。 大功告成!!!
1
[[email protected] ~]# oc get csr
2
NAME AGE REQUESTOR CONDITION
3
csr-2mxfw 13m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
4
csr-p6ckt 13m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
5
6
[[email protected] ~]# oc get csr -ojson | jq -r '.items[] | select(.status == {} ) | .metadata.name' | xargs oc adm certificate approve
7
8
[[email protected] ~]# oc get node
9
NAME STATUS ROLES AGE VERSION
10
master-0 Ready master,worker 120m v1.16.2
11
master-1 Ready master,worker 120m v1.16.2
12
master-2 Ready master,worker 120m v1.16.2
13
worker-0 Ready worker 45s v1.16.2
14
worker-1 Ready worker 49s v1.16.2
Copied!

Web console 登录

ocp4的web console 入口走router了,所以找下域名 首先找到我们的域名,然后在我们自己电脑上 hosts添加解析,指向到worker-0,这样就能够访问openshift 的web 控制台了
1
[[email protected] ~]# oc get route --all-namespaces |grep console-openshift
2
openshift-console console console-openshift-console.apps.ocp4.example.com console https reencrypt/Redirect None
Copied!
把这条写入hosts 192.168.2.15 oauth-openshift.apps.ocp4.example.com console-openshift-console.apps.ocp4.example.com
第一次发现页面打不开. Application is not available , 这是router返回的,说明router服务好使,web console 服务异常。
1
[[email protected] ~]# oc get pod --all-namespaces |grep console
2
openshift-console-operator console-operator-597c74c496-gr78z 1/1 Running 0 109m
3
openshift-console console-5f4b9f69c7-kmtlz 0/1 Pending 0 41m
4
openshift-console console-87c8d8ddc-2tv59 0/1 Pending 0 41m
5
openshift-console console-87c8d8ddc-k2kpl 0/1 Pending 0 37m
6
openshift-console console-87c8d8ddc-zdpc2 0/1 UnexpectedAdmissionError 0 41m
7
openshift-console downloads-7fdfb77b95-bk9cr 1/1 Running 0 109m
8
openshift-console downloads-7fdfb77b95-k84hj 1/1 Running 0 109m
Copied!
嗯,pod pending, 看event, 是通过node selector 指定了master,两个node的标签不匹配,但是master的cpu又不够。所以给三台master虚拟修改下CPU,之前是2核改成4,重启下系统
1
[[email protected] ~]# oc -n openshift-console describe po console-5f4b9f69c7-kmtlz
2
3
Warning FailedScheduling <unknown> default-scheduler 0/5 nodes are available: 2 node(s) didn't match node selector, 3 Insufficient cpu.
Copied!
重新看下 console pod,正常后console 就可以打开了 oc -n openshift-console get pod
用户名是 kubeadmin 密码在这个文件里 cat /root/ocp4/auth/kubeadmin-password
matchbox

参考文档

这里面有静态IP的方法,修改启动参数,不修改RHCOS镜像,但是启动参数挺长的,手动敲容易出错,错了就得重来。。。
参考文档,来自redhat wangzheng。静态IP,修改RHCOS镜像 https://github.com/wangzheng422/docker_env/blob/master/redhat/ocp4/4.2.disconnect.operator.md
同事程吉祥的4.2 word文档(不方便上传,在此感谢祥哥,祥哥!这么大的广告,你要不要打赏一下。)
官方安装诊断手册 Troubleshooting OpenShift Container Platform 4.x: UPI Installation https://access.redhat.com/articles/4292081

下载地址

请原谅我的小小手段。。。
识别图中二维码,关注公众号,回复 ocp4.3 即可获取百度云下载地址
也可以顺便关注下我的github,后续更新会同步到github