yeefone
作者yeefone2019-11-12 10:19
云计算架构资深专家, 某大型保险公司

OpenShift 4企业高可用集群(离线)安装实践 & Troubleshooting记录

字数 20535阅读 9464评论 0赞 4

前言

本文为企业级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

Reference

OCP 文档和软件下载在 openshift.com 和 redhat.com 各有一套,但是红帽网站的下载速度、内容更新、文档格式(支持 PDF)均优于 openshift.com,因此建议主要使用前者,不过有些内容需要红帽账号。

Labs

目前的实验环境为 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。

以下为实验环境及相关配置:

之后部署预期配置:

以下步骤尽可能将操作脚本化,但是由于安装虚拟机、修改配置文件等很难完全做到。

Pre-installation

Prerequisites

根据以下参考在正式安装 OCP 前需配置相关依赖:

以上 DHCP、LB、DNS、HTTP Server、Mirror registry 都是安装所依赖的服务,大多运行在堡垒机(bastion host)。由于是实验环境,不可能动公司现有的正式服务,因此尽量自行搭建,而这些依赖是否必须以及如何部署将在以下各节讨论。

Bastion host

About

在文档中 Bastion host 实际有多个作用:

  • 部署以上需自行搭建的依赖服务。
  • 同步镜像外网内容。
  • 制作 Ignition 文件。
  • 作为之后部署的 OCP 节点机的跳板机。

由于实验环境所限(无法直接或通过代理连接外网),在该环境中部署的 Bastion host 并不直接同步外网内容,因此只起了另外几个作用(因此在以下安装中命名为 base),如何同步镜像将在 Mirror registry 一节说明。

Install

堡垒机安装配置步骤。比较繁琐但非本文重点,因此折叠以下内容。
VMWare ESXi

  1. https://10.130.250.200 root/
  2. Navigator -> Virtual Machines -> Create / Register VM
  3. Create a new virtual machine

    • Name: base
    • Compatibility: ESXi 6.7 Virtual machine
    • Guest OS family: Linux
    • Guest OS version: CentOS 7 (64-bit)(有 CentOS 8 镜像,但是在安装过程中就 必须指定 Repo URL,暂时先用 7。)
  4. Customize settings

    • Hard disk 1:120G(因为要作为 Mirror registry,需要较大存储。)
    • CD/DVD Drive 1: Datastore ISO file (datastore02/iso/CentOS-7-*)

CentOS 7

  1. INSTALLATION SUMMARY

    • ROOT PASSWORD: root/**
    • Host name: base
    • Configure... -> IPv4 Settings
    • Ethernet(...): ON
    • Address: 10.130.250.202
    • Netmask: 255.255.255.0
    • Gateway: 10.130.250.254
    • DNS servers: 10.130.250.24
    • Method: Manual
    • Addresses
    • DATE & TIME: Asia / Shanghai
    • NETWORK & HOSTNAME
    • USER SETTINGS
  2. 验证配置,检查网络连接及 DNS 是否正常。

    1. ip route show
    2. cat /etc/resolv.conf
    3. ping 10.130.250.254
    4. ping repos.xxxorgcloud.com
  3. 从本机 ssh 10.130.250.202。
  4. YUM

    1. yum repolist -v(看是否 Repo 地址都指向内网)
    2. yum install net-tools
    3. curl http://repos.xxxorgcloud.com/repository/centos-repo/7/CentOS-Base-TK.repo > /etc/yum.repos.d/CentOS-Base-TK.repo
    4. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
    5. yum makecache
    6. 验证

Prepare

之上提及的服务尽量使用容器运行以简化手工配置步骤:

HTTP Server

OCP 4 在安装过程中需从 HTTP Server 获取两种内容:

  • 安装文件:由于这类文件可以反复使用,已上载至 repos.xxxorgcloud.com 固定保存。
  • Ignition 配置文件(用途之后说明):由于只是在安装本集群时使用,不适合上传至 repos.xxxorgcloud.com 保存。

针对第二种情况,由于使用容器运行 HTTP Server 非常方便,不存在繁琐的安装配置,自己部署一套完全没问题。但有个疑问,就是集群安装成功后如果需要添加新的节点机是否仍需要访问 HTTP Server 提供的 Ignition 文件,如是的话那么也应该找一个永久性的地方存放;但 bootstrap.ign 包含敏感信息,如对应"/root/.docker/config.json"的 contents 包含 registry 的用户密码,因此也不适合放在 Public HTTP Server。见之后 Post-installtion / Backup 一节。

暂定先自行搭建,具体 podman 的命令见 Ignition config 一节。

DHCP

虽然在 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 设置将:

  • api 先指向 bootstrap 后指向 master01(具体操作见以下过程,但即使配置了 LB 也会有类似调整,只不过不在 DNS 而是 LB 端)。
  • *.apps 指向 worker01。

经实际验证无问题,当然这也失去了高可用,在正规环境还是必须配置 LB,具体步骤参见 Close to OpenShift 4 Installing raw version#LB(公司内也有现成服务)。

DNS

在 Bastion host 上部署 DNS 服务。参考 Setting Up DNS Server On CentOS 7 及其他 dns forward 文档 :

  1. yum install bind bind-utils
  2. vi /etc/named.conf
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";
  • listen-on port 53 { 127.0.0.1; 10.130.250.202; };
  • allow-query { localhost; 10.130.250.0/24; };
  • dnssec-enable no;(如果这两行用默认的 yes 则会在 /var/named/data/named.run 日志中发现转发 10.130.250.24 出现的安全错误。)
  • dnssec-validation no;
  • zone "." IN { ... } 修改为 forward
  • 新增 zone "paas02.uat.xxxorgcloud.com"、zone "250.130.10.in-addr.arpa",以及以下两项配置文件。

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

Mirror registry

既然是 Installing in restricted networks,对于一个正常的企业环境,内部镜像应该是现成的(我们已部署搭建 JFrog)最不需要自行搭建的, 但是,OCP 4 安装程序对镜像的使用却不是通常的方式:

  1. 在 JFrog 创建了 quay.io 的 Remote Repository(内部镜像)后,并在 OCP 4 安装过程中调整配置到使用该镜像,但 OCP节点机启动后仍然报错,提示还需要 quay.io/openshift-release-dev/ocp-v4.0-art-dev 镜像,而在 quay.io 网站的 openshift-release-dev 项下只发现 ocp-release 却没有 ocp-v4.0-art-dev。从试验中发现后者是在 oc adm release mirror 中产生的。
  2. 虽然 oc adm release mirror 这一步无法略过,但是否可以将 release mirror 的 from(从 quay.io 获取镜像及 Metadata?)和 to(部署到内部镜像)都指向 JFrog,能节省自己搭建 Mirror Registry 的工作,但尝试暂不可行,应该也有内部 JFrog 配置的问题。

由于以上限制,且 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:

  • podman login --authfile ~/pullsecret_config.json registry.paas02.uat.xxxorgcloud.com:5000

由于从外网 mirror 耗时很长(具体细节参见 Close to OpenShift 4 Installing raw version),利用已经 mirror 好的文件:

  1. scp root@10.130.250.201:/opt/registry/ocp4-registry-data.tar.gz /opt/registry
  2. tar -xvf /opt/registry/ocp4-registry-data.tar.gz -C /opt/registry
  3. 验证:

    1. podman login registry.paas02.uat.xxxorgcloud.com:5000
    2. podman image pull registry.paas02.uat.xxxorgcloud.com:5000/ocp4/openshift4:etcd

注意自己部署的 registry 这个镜像貌似有 Bug,如果 curl 或者 podman login 有问题可以 podman stop mirror-registry & podman start registry 试试。

Installing

Ignition config

在 Bastion host 上生成 Ignition 配置文件。参考 9.3.7. Creating the Kubernetes manifest and Ignition config files,注意有些准备工作已经在 Bastion host 一节提前做了。

  1. rm -rf ~/paas02 && mkdir ~/paas02(反复尝试时该目录下有隐藏文件可能引起错误,因此要先删除整个目录。)
  2. vi ~/paas02/install-config.yaml
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

其中:

  • pullSecret 为 ~/pullsecret_config.json 内容(见 Mirror registry 一节)。
  • sshKey 为 ~/.ssh/id_rsa.pub 内容(见 Bastion host / Prepare 一节)。
  • additionalTrustBundle 为 /opt/registry/certs/domain.crt 内容(见 Mirror registry 一节安装配置步骤...),并注意右移二格。可以使用 Certificate Decoder 查看确认域名、有效期。
  1. cd ~(以下命令不能指定绝对路径,必须在制作 Ignition 文件的 paas02 目录上一层操作)

    • set mastersSchedulable = false
    • openshift-install create manifests --dir=paas02
    • vi paas02/manifests/cluster-scheduler-02-config.yml
    • openshift-install create ignition-configs --dir=paas02
  2. 将生成的 Ignition 文件以 HTTP 服务暴露出去:podman run -dit --name httpd -p 8080:80 -v ~/paas02:/usr/local/apache2/htdocs/paas02:z repos.it.xxxorg.com:8080/library/httpd:2.4
  3. 允许外部访问:firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload
  4. 验证:curl http://10.130.250.202:8080/paas02/bootstrap.ign

Bootstrap machine

在进入 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:

  1. 在 RHEL CoreOS Installer 安装界面按 Tab 键进入配置选项。
  2. 在默认选项 coreos.inst = yes 之后添加(由于无法拷贝粘贴,请输入仔细核对后再回车进行):
    coreos.inst.install_dev=sda coreos.inst.image_url= http://repos.xxxorgcloud.com/repository/openshift-v4/dependencies/rhcos/4.2/4.2.0/rhcos-4.2.0-x86_64-metal-bios.raw.gz coreos.inst.ignition_url= http://10.130.250.202:8080/paas02/bootstrap.ign ip=10.130.250.209::10.130.250.254:255.255.255.0:bootstrap::none nameserver=10.130.250.202
  3. 如果安装有问题会进入 emergency shell,简单 ping repos.xxxorgcloud.com 看网络、域名解析是否正常,如果正常一般是以上参数输入有误,reboot 退出 shell 回到第一步重新开始。

成功安装后从跳板机(bastion/base)访问 bootstrap 机器:ssh core@bootstrap

在 bootstrap 验证:

  • 网络配置是否符合安装时的指定:

    • hostname -I
    • ip route show
    • cat /etc/resolv.conf
  • 验证是否成功启动 bootstrap 相应服务:

    • 服务是以容器方式启动:sudo podman ps(应该有 etcd 等镜像启动,如果为空参见最后的 Troubleshooting。)
    • 使用 netstat -an 查看 6443、22623 端口是否已启用(可能要等一会)。

      如果验证无问题则可以一边观察日志一边继续以下的安装步骤:journalctl -b -f -u bootkube.service

Master machines

类似 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,先执行下一步。

Creating the cluster

待 3 台 master 安装成功后,在 bootstrap 继续执行:journalctl -b -f -u bootkube.service

有如下类似日志:

待以上三个 etcd 节点均 healthy 后:

待出现“It is now safe to remove the bootstrap resources”提示后在 bastion/base 修改 DNS 服务配置:

  1. vi /var/named/paas02:将两个配置文件中 api 指向的 209 地址改为 master01 的 203。
  2. service named restart
  3. 可以从 master/worker 验证改动是否生效:ping api / ping api-int

Worker machines

同 master,这一步可以和上一步同时进行,如果是尝试怕搞乱的话也可以等上一步成功后再做。启动参数调整为:

主要改动见标黑处,另 worker02 的 IP 分别为 207,但注意 worker.ign 不要添加 02。由于无法拷贝粘贴,请输入仔细核对后再回车进行。如果安装有问题会进入 emergency shell,简单 ping repos.xxxorgcloud.com 看网络、域名解析是否正常,如果正常一般是以上参数输入有误,reboot 退出 shell 重新开始。

安装成功后 worker 会重启一次,之后同样从跳板机访问:ssh core@worker01

Logging in to the cluster

在 bastion/base:

  1. export KUBECONFIG=~/paas02/auth/kubeconfig(应该加入 profile,否正每次重新登录都需要配置。TODO)
  2. oc whoami(显示 system:admin 即表示成功)
  3. CSRs

    1. oc get csr
    2. 针对 Pending 状态的 CSR 执行:oc adm certificate approve xxx
    3. 循环到第一步直到没有新的 Pending CSR。
  4. oc get nodes
  5. oc get clusteroperators(可以发现还有 Available 为 False 的记录,重复执行观察一段时间,最后只剩下 image-registry 为 False。)
  6. 参考 9.3.12.1.2. Configuring storage for the image registry in non-production clusters

    1. oc patch configs.imageregistry.operator.openshift.io cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
    2. oc get clusteroperators image-registry(要等一会才变成 True)
  7. oc get clusteroperators(确认全部 Available)
  8. openshift-install --dir=$HOME/paas02 wait-for install-complete
  9. 注意以上提示访问 Web Console 的网址及用户密码。

Web Console

尚未配置正规域名,暂时将如下内容加入本机 hosts 文件:

访问 https://console-openshift-console.apps.paas02.uat.xxxorgcloud.com 并按照上一步提示的用户密码成功登录:

Post-installtion

OAuth

首次登录 Web Console 会提示:

由于内部 Gitlab 未提供 https 无法使用,暂时配置 htpasswd 方式。4.1. Configuring an HTPasswd identity provider 步骤比较繁琐,直接如下即可(不清楚为何要那么复杂?TODO):

  1. htpasswd -bBc ~/pass02-htpasswd admin *
  2. 将 pass02-htpasswd 文件下载至本机。
  3. 在 OAuth Details 页面添加 HTPasswd 类型的 Identity Providers 并上传 pass02-htpasswd 文件。
  4. 退出当前用户验证,注意要退到如下界面:
    并选择 htpasswd(之前添加 IDP 时的命名),再输入 admin/*。如果退出后出现的就是用户密码输入窗口,实际还是 kube:admin 的校验,如果未出现如上提示,可以手工输入 Web Console 地址来自动跳转。
  5. 以 admin 登录后貌似能看到 Administrator 菜单项,但访问如 OAuth Details 仍然提示:
    oauths.config.openshift.io "cluster" is forbidden: User "admin" cannot get resource "oauths" in API group "config.openshift.io" at the cluster scope
    因此需要如下授权:
    oc adm policy add-cluster-role-to-user cluster-admin admin
  6. 参考 7.2. Removing the kubeadmin user:oc delete secrets kubeadmin -n kube-system

Registry

参见 Configuring image settings:

  1. oc create configmap registry-t rusted-ca -n openshift-config && oc edit configmap/registry-trusted-ca -n openshift-config

  2. oc edit image.config.openshift.io/cluster(或者访问 Images > Image Details)
  3. 如果在安装时 install-config.yaml 将 registry.it.xxxorg.com 的证书也配置到 additionalTrustBundle 应该就不需要现在处理。

由于:

但注意自动重启并不是修改后马上生效,另外在重启节点机时 OCP 平台有一小段时间不可用。

最后检验使用 Helm 3 rc 2 部署 Sakura 成功。到这一步可以认为安装成功并基本可用,当然还有一些 Alerts 需要处理,在之后的配置管理的维基中继续。

Backup

目前新增 master 或 worker 节点的做法同以上安装步骤,但是之前的 HTTP Server 是临时性搭建,其提供的 master.ign / worker.ign 内容是否需要备份还是说能够从已搭建好的集群(比如 Machine Config Pools)重新生成?

TODO

Troubleshooting

About

参见最上 Intro → Reference 所列的解疑网站,是遇到问题最应搜索的地方。以下所列为自己的一些总结、以及因为自己在准备阶段失误引起的罕见错误(网上未搜到)。

What's new

相比 OCP 3 的安装及配置管理以及常用的 Debug 手段,OCP 4 有如下大的改动。

OS - RHCOS

OCP 4 节点机 OS 主要使用 Red Hat Enterprise Linux CoreOS (RHCOS),相比以往安装 RHEL/CentOS 6/7:

  • RHCOS 需要在安装前准备详细配置文件(Ignition File)并在开始安装时输入多达二三百字符的引导参数,而后者是在安装过程中逐步提示各种参数配置以及在安装后进行更详细的配置。

这样做的好处是安装完成就一步到位,而后者通常还需要对各节点机做更多的手工配置(很难保证各节点节配置完全同步)或者使用 Ansible 等等。但也有问题:

  • 首先输入引导参数就不够直观。事实上这个功能并不是 RHCOS 特有、而是 Linux 提供的(参见 The kernel’s command-line parameters),但 RHCOS 扩展了自己的配置,但未找到完整的 Reference 文档。
  • 其次由于引导参数多达几百字符,刚开始安装时又无法拷贝粘贴,非常容易出错。因此在 RCHOS 安装过程最常遇到的问题就是由于引导参数输入错误引起的安装失败,以下详述解决办法。

Container engine - CRI-O

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

RHCOS - emergency shell

最常见的问题就是由于安装时引导参数输入错误导致失败并进入 emergency shell:

注意有的错误会尝试很久到 timeout,因此如果没有一直盯着屏幕、自动重启后又回到安装界面,就会觉得莫名其妙。

进入 Shell 后可以:

  • 简单的尝试 ping 网关或者 curl repos.xxxorgcloud.com 等确认网络配置、对方服务是否有问题。
  • 运行 journalctl 查看日志定位问题,但是日志里有些警告或错误并不一定是真正问题、而仅仅是等待条件就位,因此不熟且比较干扰的情况下首先在日志内检查引导参数是否输入有误。这是最常见的原因,然后 reboot 重新开始。

Error pulling image

Bootstrap 基本安装成功并且可以从跳板机 ssh 后,首先验证是否成功启动相关服务:

  • sudo podman ps -a

如果没有正常运行状态的容器可以在 journalctl 日志中搜索"pulling image”,如果出现"Error pulling image"则有以下几种可能:

  • 在之上 Mirror registry 一节提到自己部署的 registry 服务有可能出 Bug,之前验证服务正常但之后莫名停止响应,需要重启。但重启 registry 服务后 bootstrap 貌似不能自动重试失败的任务、需要重装?
  • 如果更具体的出错日志类似"lookup quay.io on 10.130.250.201:53: no such host",表示没有正常访问内部 registry 镜像。可能是 Ignition 配置的 imageContentSources - mirrors 有问题,检查由其生成的 /etc/containers/registries.conf 配置并尝试 Mirror registry 一节提到的验证命令(podman pull)。如果是 Ignition 出错需要回到这一步重新开始。

x509: certificate has expired or is not yet valid

在尝试过程中碰到过 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。

etcd is unhealthy

成功安装三台 master 后在 bootstrap 使用 journalctl -b -f -u bootkube.service 持续观察时提示:

三台 master 没有任何差别,使用 ps -ef | grep etcd 对比可以发现 master03 没有 etcd 进程。查找相关日志:

  • find /var/log -name 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 全部删除重装,错误消失。

no matches for kind MachineConfig

成功安装三台 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 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广