为了方便读者直观体验OpenShift的部署,我们以在某客户进行PoC时的安装过程作为示例进行说明。本示例仅为帮助读者理解,不代表生产环境配置。需要注意的是,本安装实例采用离线+bare metal模式进行安装,使用的版本是OpenShift 4.3。这个安装方法与OpenShift 4.4、OpenShift 4.5是通用的。OpenShift 4.6采用离线+bare metal模式进行安装的方式略有简化,会在3.2.3节第12小节中提及。想安装OpenShift 4.6的朋友,请先阅读这一小节。
安装OpenShift PoC环境的资源需求如表3-2所示。
表3-2 资源需求表
上述机器需要在vSphere上启动,对vCenter需要以下操作权限:
·具有创建虚拟机和给虚拟机安装操作系统的权限。
·具有访问VM Console的权限。
·具有对创建的VM全生命周期管理的权限:启动、关闭、删除、重启、做快照、还原等。
·具有上传ISO以及挂载ISO的权限。
首先使用RHEL操作系统的ISO启动管理机,然后在管理机上配置本地的Yum repo(步骤省略)。本节以下所有操作未明确指出的,均在管理机上以root执行。
需要指出的是,虽然我们在vSphere上安装OpenShift,但使用的方法是Baremetal的安装方法,这种安装方法较为通用。
在管理机上安装需要的工具。
# yum -y install wget httpd podman pigz skopeo docker buildah jq bind-utils bash- completion
关闭管理机上的Firewalld。
# systemctl stop firewalld # systemctl disable firewalld
如果客户环境不允许关闭Firewalld,则需要将OpenShift安装过程中需要访问的端口加入Firewall的白名单,我们以添加5000端口为例。
# firewall-cmd --permanent --add-port=5000/tcp --zone=public # firewall-cmd --permanent --add-port=5000/tcp --zone=internal # firewall-cmd --reload
配置管理机上的SELinux。
默认操作系统的SELinux是Enforcing状态会影响HAproxy的启动,使用如下命令修改为Permissive。
# vi /etc/selinux/config
将enforcing修改为permissive。
# setenforce 0
接下来,导入Docker Registry离线镜像,用于启动本地镜像仓库。
# podman load -i registry-image.tar # podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/registry 2 2d4f4b5309b1 4 weeks ago 26.8 MB
创建容器镜像仓库目录。
# mkdir -p /opt/registry/{auth,certs,data}
创建证书,设置Common Name的时候,注意正确设置为管理机的主机名。
# cd /opt/registry/certs # openssl req -newkey rsa:4096 -nodes -sha256 -keyout example.com.key -x509 -days 365 -out example.com.crt ……………… Common Name (eg, your name or your server's hostname) []: repo.ocp4.example.com
利用bcrypt格式,创建离线镜像仓库的用户名和密码。安装htpasswd命令行的工具并创建用户。
# yum install httpd-tools # htpasswd -bBc /opt/registry/auth/htpasswd david david
将自签名证书添加到管理机。
# cp /opt/registry/certs/example.com.crt /etc/pki/crust/source/anchors/ # update-ca-trust
接下来,我们使用3.2.3节中的方法3导入离线镜像。
将提前准备好的OpenShift安装镜像包解压缩到管理机上。
# tar -zxvf registry.tgz -C /data/
解压缩后,确认解压文件的位置,Mirror Registry启动的时候,需要访问docker的上一级目录,目录结构如图3-16所示。
图3-16 OpenShift镜像解压缩目录
通过podman启动Mirror Registry,注意启动时指定到容器镜像的解压缩目录、证书目录、htpasswd文件目录。
# podman run --name mirror-registry -p 5000:5000 -v /data/registry:/var/lib/ registry -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/example.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/example. com.key -d docker.io/library/registry:2
确认本地镜像仓库成功启动。
# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a80baf5ee9e docker.io/library/registry:2 /entrypoint.sh /e... 33 seconds ago Up 33 seconds ago 0.0.0.0:5000->5000/tcp mirror-registry
查看Mirror Registry中的镜像,输出应该有类似图3-17的内容。
# curl -u david:david -k https://repo.ocp4.example.com:5000/v2/_catalog
图3-17 查看Mirror Registry中的内容
将本地镜像仓库身份认证信息直接进行整合,方便后面书写install-config.yaml。使用如下命令创建一个包含正确格式的镜像仓库认证文件。
# cat << EOF > registry_auth.json {"auths":{}} EOF
指定认证文件登录Mirror Registry,以便认证信息注入registry_auth.json中。
# podman login --authfile ~/registry_auth.json repo.ocp4.example.com:5000 # cat ~/registry_auth.json { "auths": { "repo.ocp4.example.com:5000": { "auth": "ZGF2aWQ6ZGF2aWQ=" } } }
接下来,在管理机上配置HTTP服务器。
# mkdir -p /var/www/html/materials/ # restorecon -vRF /var/www/html/materials/
由于后面配置HAproxy会占用80端口,因此修改httpd监听端口为8080。
# vi /etc/httpd/conf/httpd.conf
将Listen 80修改为Listen 8080。配置虚拟主机,用HTTP提供文件下载服务。
# vi /etc/httpd/conf.d/base.conf <VirtualHost *:8080> ServerName repo.ocp4.example.com DocumentRoot /var/www/html/materials/ </VirtualHost>
重启HTTP服务。
# systemctl enable httpd --now # systemctl restart httpd
在管理机上配置DNS服务器。可以使用bind或者dnsmasq,PoC中我们使用后者。
在管理机上安装dnsmasq,配置正向和反向解析,然后其他所有OpenShift的节点都必须要指定到这个Nameserver,即管理机。
# yum install dnsmasq -y # vim /etc/dnsmasq.conf
配置正向解析。
# vi /etc/dnsmasq.conf conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig #resolv-file=/etc/resolv.conf.upstream # 如果OpenShift节点需要访问外网,这里配置上游DNS。 domain-needed strict-order local=/ocp4.example.com/ address=/apps.ocp4.example.com/28.4.184.100 address=/repo.ocp4.example.com/28.4.184.100 address=/bootstrap.ocp4.example.com/28.4.184.101 address=/master01.ocp4.example.com/28.4.184.102 address=/master02.ocp4.example.com/28.4.184.103 address=/master03.ocp4.example.com/28.4.184.104 address=/etcd-0.ocp4.example.com/28.4.184.102 address=/etcd-1.ocp4.example.com/28.4.184.103 address=/etcd-2.ocp4.example.com/28.4.184.104 address=/worker01.ocp4.example.com/28.4.184.105 address=/worker02.ocp4.example.com/28.4.184.106 address=/worker03.ocp4.example.com/28.4.184.107 address=/api.ocp4.example.com/28.4.184.100 address=/api-int.ocp4.example.com/28.4.184.100 srv-host=_etcd-server-ssl._tcp.ocp4.example.com,etcd-0.ocp4.example.com,2380 srv-host=_etcd-server-ssl._tcp.ocp4.example.com,etcd-1.ocp4.example.com,2380 srv-host=_etcd-server-ssl._tcp.ocp4.example.com,etcd-2.ocp4.example.com,2380 addn-hosts=/etc/dnsmasq.openshift.addnhosts bind-dynamic no-hosts
配置反向解析。
# vi /etc/dnsmasq.openshift.addnhosts 28.4.184.100 repo.ocp4.example.com 28.4.184.101 bootstrap.ocp4.example.com 28.4.184.102 master01.ocp4.example.com 28.4.184.103 master02.ocp4.example.com 28.4.184.104 master03.ocp4.example.com 28.4.184.102 etcd-0.ocp4.example.com 28.4.184.103 etcd-1.ocp4.example.com 28.4.184.104 etcd-2.ocp4.example.com 28.4.184.105 worker01.ocp4.example.com 28.4.184.106 worker02.ocp4.example.com 28.4.184.107 worker03.ocp4.example.com 28.4.184.100 api.ocp4.example.com 28.4.184.100 api-int.ocp4.example.com
重启DNS服务。
# systemctl enable dnsmasq # systemctl restart dnsmasq
安装HAproxy并编写配置文件。HAproxy配置文件主要配置以下四个端口,如表3-3所示。
表3-3 HAproxy中开放的端口
配置步骤如下:
# yum install haproxy -y # vim /etc/haproxy/haproxy.cfg
配置文件内容参见Repo中的haproxy.cfg。
启动并查看HAProxy的状态,确保正常运行。
# systemctl enable haproxy # systemctl start haproxy # systemctl status haproxy
接下来,在管理机上安装openshift-install二进制文件和OC Client。
需要注意的是,这两个文件的版本一定要与安装的OpenShift镜像的版本一致,否则会安装失败。
首先解压缩文件。
# tar xvf openshift-client-linux-4.x.y.tar.gz # tar xvf openshift-install-linux-4.x.y.tar.gz
拷贝到可执行目录下。
# cp oc /usr/local/bin/ # cp kubectl /usr/local/bin/ # cp openshift-install /usr /local/bin
在管理机上生成SSH Key,以便安装过程中节点之间与管理机可以无密码SSH登录。
# ssh-keygen # mkdir /var/www/html/materials # cd /var/www/html/materials
利用如下命令生成install-config.yaml。
cat << EOF > install-config.yaml apiVersion: v1 baseDomain: example.com compute: - hyperthreading: Enabled name: worker replicas: 0 controlPlane: hyperthreading: Enabled name: master replicas: 3 metadata: name: ocp4 networking: clusterNetworks: - cidr: 10.254.0.0/16 hostPrefix: 24 networkType: OpenShiftSDN serviceNetwork: - 172.30.0.0/16 platform: none: {} pullSecret: '$(awk -v RS= '{$1=$1}1' ~/registry_auth.json)' sshKey: '$(cat /root/.ssh/id_rsa.pub)' additionalTrustBundle: | $(cat /opt/registry/certs/example.com.crt | sed 's/^/ /g' | sed 's/^/ /g') imageContentSources: - mirrors: - repo.ocp4.example.com:5000/ocp4/openshift4 source: quay.io/openshift-release-dev/ocp-release - mirrors: - repo.ocp4.example.com:5000/ocp4/openshift4 source: quay.io/openshift-release-dev/ocp-v4.0-art-dev EOF
创建存放安装文件的目录,注意此处的路径与HTTP服务器配置的路径匹配。
# mkdir /var/www/html/materials/pre-install
利用openshift-installer安装工具创建安装用的ignition文件。
# cd /var/www/html/materials # cp install-config.yaml /var/www/html/materials/pre-install/
我们以bare metal方式安装OpenShift,使用如下RHCOS的引导文件。
# cp /data/orig/rhcos-4.3.8-x86_64-metal.x86_64.raw.gz pre-install/1.raw.gz # openshift-install create manifests --dir pre-install/
修改manifest目录中的cluster-scheduler-02-config.yml文件,并把这个文件中的master-Schedulable=true改成false,这样可以让Master节点不参与业务Pod调度。
# vi pre-install/manifests/cluster-scheduler-02-config.yml
接下来,通过安装工具生成ignition文件。
# openshift-install create ignition-configs --dir=pre-install
命令执行成功后,pre-install目录生成OpenShift安装所需的ignition文件,如图3-18所示。
图3-18 生成的ignition文件
修改ign文件的权限,否则安装过程会出现权限错误。
# chmod 755 pre-install/*
在vSphere上使用RHCOS的ISO引导虚拟机启动,进入维护模式,查看RHCOS的网卡和磁盘名,我们以查看的结果为ens33和sda为例。
重启系统引导虚拟机启动,按tab键可以输入启动参数,启动参数内容如下(内容不要换行)。
coreos.inst.install_dev=sda coreos.inst.image_url=http://28.4.184.100:8080/pre- install/1.raw.gz coreos.inst.ignition_url=http://28.4.184.100:8080/pre- install/bootstrap.ign ip=28.4.184.101::28.4.184.254:255.255.255.0:bootstrap. ocp4.example.com:ens33:off nameserver=28.4.184.100
等待片刻,Bootstrap节点会启动。Bootstrap在启动过程中会从Mirror Registry拉取OpenShift离线镜像、启动etcd-singer容器并且启动两个端口监——443(k8s-api-server使用)和22623(machine-config-server使用),如图3-19所示。
图3-19 Bootstrap主机上的容器
如果两个端口的监听和etcd-singer容器无法启动,就需要排查本地镜像仓库是否配置正确且可以被正常访问,并检查HAproxy配置是否正确。
etcd-singer容器启动后,代表Bootstrap节点上的临时控制平面已经生成,接下来需要手工启动Master节点。
此时,我们可以在管理机上观察OpenShift的安装日志。
设置环境变量。
#export KUBECONFIG=/var/www/html/materials/pre-install/auth/kubeconfig
查看Bootstrap安装完毕前的日志。
#openshift-install --dir=/var/www/html/materials/pre-install wait-for bootstrap- complete --log-level=debug
查看整体安装日志。
#openshift-install --dir=/var/www/html/materials/pre-install wait-for install-complete
在vSphere上使用RHCOS的ISO引导三个Master虚拟机启动,系统引导后,按tab键可以输入启动参数,分别在三个虚拟机上输入以下内容。
# Master01 coreos.inst.install_dev=sda coreos.inst.image_url=http://28.4.184.100:8080/pre- install/1.raw.gz coreos.inst.ignition_url=http://28.4.184.100:8080/pre- install/master.ign ip=28.4.184.102::28.4.184.254:255.255.255.0:master01. ocp4.example.com:ens33:off nameserver=28.4.184.100 # Master02 coreos.inst.install_dev=sda coreos.inst.image_url=http://28.4.184.100:8080/pre- install/1.raw.gz coreos.inst.ignition_url=http://28.4.184.100:8080/pre- install/master.ign ip=28.4.184.103::28.4.184.254:255.255.255.0:master02. ocp4.example.com:ens33:off nameserver=28.4.184.100 # Master03 coreos.inst.install_dev=sda coreos.inst.image_url=http://28.4.184.100:8080/pre- install/1.raw.gz coreos.inst.ignition_url=http://28.4.184.100:8080/pre- install/master.ign ip=28.4.184.104::28.4.184.254:255.255.255.0:master03. ocp4.example.com:ens33:off nameserver=28.4.184.100
等待Master节点启动后,会与Bootstrap节点通信,Bootstrap上的etcd-singer容器会在三个Master节点上创建出三节点etcd集群,最终完成Master节点的安装。
当安装日志出现如下提示时,代表Master节点已经部署成功,Bootstrap节点的使命已经完成,可以关闭或销毁。
# openshift-install --dir=/var/www/html/materials/pre-install wait-for bootstrap- complete --log-level=debug "INFO It is now safe to remove the bootstrap resources"
在vSphere上使用RHCOS的ISO引导三个Worker虚拟机启动,系统引导后,按tab键可以输入启动参数,分别在三个虚拟机上输入以下内容。
# Worker01 coreos.inst.install_dev=sda coreos.inst.image_url=http://28.4.184.100:8080/pre- install/1.raw.gz coreos.inst.ignition_url=http://28.4.184.100:8080/pre- install/worker.ign ip=28.4.184.105::28.4.184.254:255.255.255.0:worker01. ocp4.example.com:ens33:off nameserver=28.4.184.100 # Worker02 coreos.inst.install_dev=sda coreos.inst.image_url=http://28.4.184.100:8080/pre- install/1.raw.gz coreos.inst.ignition_url=http://28.4.184.100:8080/pre- install/worker.ign ip=28.4.184.106::28.4.184.254:255.255.255.0:worker02. ocp4.example.com:ens33:off nameserver=28.4.184.100 # Worker03 coreos.inst.install_dev=sda coreos.inst.image_url=http://28.4.184.100:8080/pre- install/1.raw.gz coreos.inst.ignition_url=http://28.4.184.100:8080/pre- install/worker.ign ip=28.4.184.107::28.4.184.254:255.255.255.0:worker03. ocp4.example.com:ens33:off nameserver=28.4.184.100
OpenShift的Worker节点是由Master节点完成部署的。在部署的过程中,我们可以看到ClusterOperator依次创建。
Worker开始安装后,通过证书访问oc集群。
# export KUBECONFIG=/var/www/html/materials/pre-install/auth/kubeconfig
然后查看安装中是否有需要批准的csr,如图3-20所示。
# oc get csr
图3-20 待批准的节点
使用如下命令行,批准所有Pending状态的csr。
# oc get csr -ojson | jq -r '.items[] | select(.status == {} ) | .metadata.name' | xargs oc adm certificate approve
反复执行批准证书命令,直到没有新的Pending csr出现。
通过下面的命令行查看ClusterOperator状态,确保ClusterOperator都安装成功,确保安装进度执行完毕。
#oc get co # oc get clusterversion
当我们看到所有的ClusterOperator都已经正确安装,也就表示OpenShift集群离线部署大功告成!
查看整体安装日志,会列出OpenShift集群console的地址,以及kubeadmin用户的密码。
#openshift-install --dir=/var/www/html/materials/pre-install wait-for install-complete INFO Install complete! INFO Access the OpenShift web-console here: https://console-openshift-console. apps.ocp4.example.com INFO Login to the console with user: kubeadmin, password: BmLFD-U4Qph-jTMXF-jtqbw
在集群部署完成后,通常并不能直接使用,还需要经过一系列的部署后配置,我们将在3.2.4节中进行介绍。
在OpenShift 4.5中我们会使用rhcos-installer.x86_64.iso镜像引导主机启动,这个镜像的大小是89M,启动后再通过http server下载rhcos-metal.x86_64.raw.gz安装RHCOS,如图3-21所示。
图3-21 OpenShift 4.5中的RHCOS安装镜像
OpenShift从4.6版本开始,提供了一个新的RHCOS iso:rhcos-live.x86_64.iso。链接如下所示,镜像如图3-22所示,rhcos-live.x86_64.iso镜像大小为876M。
https://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/latest/latest/
图3-22 rhcos-live.x86_64.iso镜像
在OpenShift 4.6的安装中,我们使用rhcos-live.x86_64.iso镜像引导主机启动后,启动参数就不必再指定下载rhcos-metal.x86_64.raw.gz的参数,其他内容不变,如图3-23所示。
图3-23 OpenShift 4.6离线安装启动参数
和OpenShift 4.5相比,OpenShift 4.6离线+bare metal安装除了本小节提到的参数设置变化外,其他步骤完全相同。