![]() |
乐观的西红柿 · Iframe不调整大小_无法调整iFrame ...· 7 月前 · |
![]() |
干练的野马 · typescript无法在windows上找 ...· 7 月前 · |
![]() |
飘逸的煎饼果子 · 中国首条跨省地铁今开通:江苏昆山直达上海市区 ...· 7 月前 · |
![]() |
爱笑的茶壶 · 关于四肢骨折的分型,看这篇就够了! - ...· 9 月前 · |
![]() |
暗恋学妹的鸵鸟 · css实现横向滚动条(css纵向滚动条)-腾 ...· 10 月前 · |
本文是全部离线安装,也就是 UPI (User Provisioned Infrastructure) 模式安装,假设机器只能配置静态ip不能有网络配置权限和配置 dhcp 和 pxe。机器可以是物理机和虚拟机。
openshift 不像其他的 dashboard 诸如 rancher,k3s 之类的,它自己实现了 cs 的三个组件,也给 k8s 贡献了 rbac 和 ingress 的代码。它的节点系统是使用 Red Hat Enterprise Linux CoreOS (RHCOS),这是一款面向容器的操作系统,结合了 CoreOS 和 Red Hat Atomic Host 操作系统的一些最佳特性和功能。
RHCOS 是专门为从 OpenShift Container Platform 运行容器化应用程序而设计的,能够与新工具配合,提供快速安装、基于 Operator 的管理和简化的升级,ocp 里 master节点必须是 rhcos 系统,而 worker 节点除了 rhcos 以外还可以选择 rhel。并且集群里有大量的 operator,通过使用 k8s 的声明式 yaml 减少了对系统和集群底层的关注度,甚至集群升级也是通过 cluster-version-operator 完成。
它的安装是先在一台机器(bastion)上准备 pxe 和相关的安装集群描述信息需要的文件(Ignition)以及 dns,负载均衡,然后引导主机(
Bootstrap
)通过 dhcp 或者 人为挂载 rhcos 的 iso 在安装界面手写 boot cmdline 从 bastion 指定获取
bootstrap.ign
和 os.raw.gz 文件完成安装, 随后 master 节点启动会获取
master.ign
文件并且从 bootstrap 节点获取 machine-config 信息,随后 node 同理。
在安装过程中 bootstrap 的 ign文件里证书是24小时过期的,因为官方这种涉及理念是 bootstrap 作用于引导集群的,安装完后会将控制平面移交到 master上,所以我们要配置负载均衡(以及代理后续集群里的 ingress controller)
Cluster Installer
bastion
上手写一个集群安装的 yaml ,然后使用 oc 命令把 yaml 转换成集群部署清单和 Ignition 文件
Bootstrap
)通过 dhcp 或者挂载 rhcos 的 iso 启动后在安装界面手写
boot cmdline
(包含网络配置,nameserver,install_dev,image_url,ignition_url),安装完系统后重启后,bootstrap 机器会执行 bootkube.sh 脚本,内部是 crio 和 podman 启动容器和 pod 来启动控制平面,并等待 master 加入
Master
节点如果像我没有dhcp就手动配置boot cmdline 安装后会从引导主机远程获取资源并完成引导,会作为 node 注册。
Etcd
集群。
Etcd
集群启动临时
Kubernetes
控制平面。
bootkube.sh
执行,最后执行完后会在集群里添加一个
-n kube-system configmap/bootstrap
作为保存状态。
引导安装过程完成以后,OCP 集群部署完毕。然后集群开始下载并配置日常操作所需的其余组件,包括创建计算节点、通过
Operator
安装其他服务等。
这里机器信息是如下,官方很多镜像都是存在
quay.io
这个仓库下,因为墙的问题会无法拉取,所以实际部署都会部署一个镜像仓库,这里我镜像仓库是使用 quay ,它会使用 443 端口(暂时没找到更改端口的方法),负载均衡会负载 ingress controller 的 http 和 https(443端口)节点,所以镜像仓库单独一个机器,如果你用其他的仓库例如 registry 可以放在负载均衡的节点上。节点的配置和 role 如下关系,因为 bootstrap 用完后可以删除,可以后面用作 worker 节点。
单 master 节点参照网上的我部署有问题,后文会说明原因
服务器规划如下:
Etcd
、控制平面组件。
machine-config
、ocp 的
kube-apiserver
和 集群里的
ingress controller
)。
Quay
,因为官方镜像在
quay.io
上很难拉取。
openshift4
是集群名,
example.com
是 basedomain
FQDN
,所有节点主机名都要采用三级域名格式,如
master1.aa.bb.com
。后面会在 dns server里写入记录
所有节点(计算节点和控制平面)之间需要开放的端口:
测试网络连通性
9000-9999
节点的服务端口,包括 node exporter 使用的
9100-9101
端口和 Cluster Version Operator 使用的
9099
端口
10250
-
10259
Kubernetes 预留的默认端口
10256
openshift-sdn
VXLAN 协议或 GENEVE 协议的通信端口
VXLAN 协议或 GENEVE 协议的通信端口
9000
-
9999
节点的服务端口,包括 node exporter 使用的
9100-9101
端口
30000
-
32767
Kubernetes NodePort range
控制平面需要向其他节点开放的端口:
2379
-
2380
Etcd 服务端口
Kubernetes API
除此之外,还要配置两个四层负载均衡器,一个用来暴露集群 API,一个用来暴露 Ingress:
引导主机和控制平面使用。在引导主机初始化集群控制平面后,需从负载均衡器中手动删除引导主机 Kubernetes API server
22623
引导主机和控制平面使用。在引导主机初始化集群控制平面后,需从负载均衡器中手动删除引导主机
Machine Config server
Ingress Controller 或 Router 使用
HTTPS 流量
Ingress Controller 或 Router 使用
HTTP 流量
api.<cluster_name>.<base_domain>.
此 DNS 记录必须指向控制平面节点的负载均衡器。此记录必须可由集群外部的客户端和集群中的所有节点解析。
api-int.<cluster_name>.<base_domain>.
此 DNS 记录必须指向控制平面节点的负载均衡器。此记录必须可由集群外部的客户端和集群中的所有节点解析。
Routes
*.apps.<cluster_name>.<base_domain>.
DNS 通配符记录,指向负载均衡器。这个负载均衡器的后端是 Ingress router 所在的节点,默认是计算节点。此记录必须可由集群外部的客户端和集群中的所有节点解析。
etcd-<index>.<cluster_name>.<base_domain>.
OCP 要求每个 etcd 实例的 DNS 记录指向运行实例的控制平面节点。etcd 实例由
0
开头,以
n-1
结束,其中
n
是集群中控制平面节点的数量。集群中的所有节点必须都可以解析此记录。
_etcd-server-ssl._tcp.<cluster_name>.<base_domain>.
因为 etcd 使用端口
2380
对外服务,因此需要建立对应每台 etcd 节点的 SRV DNS 记录,优先级 0,权重 10 和端口 2380
因为镜像都是在
quay.io
上,国内很难拉取下来,所以参考官方文档
Creating a mirror registry for installation in a restricted network
创建个镜像仓库。
要求支持 version 2 schema 2 (manifest list)
,我这里选择的是
Quay 3.3
。quay 镜像仓库需要部署在另外一台节点,因为它需要用到
443
端口,与后面的负载均衡 https 端口冲突。同时因为镜像是需要翻墙拉取,所以需要自备一台能翻墙的节点处于网络边界上。
这里使用
docker-compose
搭建 quay 仓库,自行安装
docker
和
docker-compose
设置好系统和内核参数,如果你也使用容器搭建,可以不用和我一样的操作系统。容器已经能通过
alias
互联,所以没必要的端口不用映射到宿主机上,你也可以使用
podman
或者其他容器工具起一个环境,甚至
docker run
起来这些容器。
设置机器的 hostname
1 |
hostnamectl set-hostname registry.openshift4.example.com |
1 |
mkdir -p /data/quay/lib/mysql \ |
创建quay仓库的
docker-compose.yml
文件
1 |
cat>/data/quay/docker-compose.yml << EOF |
注意,其中的镜像
quay.io/redhat/quay:v3.3.1
是无法拉取的,参考
官方链接
获取Red Hat Quay v3 镜像的访问权才可以拉取
1 |
docker login -u="redhat+quay" -p="O81WSHRSJR14UAZBK54GQHJS0P1V4CLWAJV1X2C4SD7KO59CQ9N3RE12612XU1HR" quay.io |
这个镜像我已经同步到阿里云上的镜像仓库上,也方便拉取,另外这个镜像的运行命令
config redhat
的
redhat
是 quay 仓库起来后的 web 里用到的密码,这里我们先拉取上面所需要的镜像。
1 |
cd /data/quay |
后续还会部署的话推荐这里使用 docker 把这三个镜像
docker save -o
成一个tar包方便以后
docker load -i
导入
1 |
cd /data/quay |
起来后访问
https://ip
basic auth 信息为
quayconfig/redhat
,选择
Start New Registry Setup
选择新建配置,然后设置数据库:
连接信息按照上面的
docker-compose
里的环境变量写,
ssl certificate
先别管。
设置超级管理员,记住密码,然后下一步
下一步然后页面往下滑动,在
Server Configuration
段里设置
Server Hostname
,例如为
registry.openshift4.example.com
,往下滑动,配置redis信息
点击左下角的Save,弹出的
Checking
全绿后点击
Next
配置检查通过后,就可以保存下载下来:
最后会导出一个
quay-config.tar.gz
,将其上传到 Quay 所在的服务器,解压到配置文件目录:
1 |
cp quay-config.tar.gz /data/quay/config/ |
1 |
cd /data/quay/config/ |
证书搞定后
PREFERRED_URL_SCHEME: http
修改成 https
1 |
sed -ri '/^PREFERRED_URL_SCHEME:/s#\S+$#https#' config.yaml |
然后停掉服务,注释掉 command 后再启动,web 打开看看是不是镜像仓库,是的话本机添加下 hosts
1 |
cd /data/quay/ |
去浏览器上web登录下镜像仓库,添加一个
Organization
,名字为
ocp4
用于存放镜像,然后添加一个
Repository
名字为
openshift4
1 |
grep -qw 'registry.openshift4.example.com' /etc/hosts || |
首先是 oc 下载,很多机器都需要,官方说 这个
页面
下载,我们也可以去
mirror页面
下载。解压后放到系统的
$PATH
里
1 |
wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.5/openshift-client-linux-4.5.9.tar.gz |
安装一些基础小工具,jq 用来格式化 json 文件,chrony 用于时间同步
1 |
yum install -y epel-release && \ |
准备拉取镜像权限认证文件,很多镜像在好几个镜像仓库上,有授权信息才能拉取。 从 Red Hat OpenShift Cluster Manager 站点的 Pull Secret 页面下载 registry.redhat.io 的 pull secret
把文件或者内容整上去后,格式化下json
1 |
jq . pull-secret.txt > pull-secret.json |
大致下面的内容
1 |
{ |
把前面 quay 的用户名和密码按照
user:pass
base64 加密了,例如
echo -n admin:openshift | base64
, 然后符合 json 的格式要求下把镜像仓库和 auth 信息追加到
pull-secret.json
里
1 |
... |
增加后用
jq . pull-secret.json
检验下 json 格式是否正确
下面利用变量拼接一些镜像tag来同步
1 |
|
oc adm
时会提示
image does not exist
。
ocp4/openshift4
。
PRODUCT_REPO
和
RELEASE_NAME
都不需要改,这些都是一些版本特征,保持不变即可。
pull-secret.json
的存放路径。
同步镜像分为两种方式,一种是实时使用 oc 命令把镜像转发到
LOCAL_REGISTRY
,一种是离线存储为文件,然后把文件拿到内网去用 oc 命令推送到内网的仓库。
一些后续可研究的东西:
如果后续有需求研究同步镜像到国内,每个版本的镜像列表可以查看
官方这个文档
里的命令解开镜像去查看镜像列表:
1 |
# 查看镜像info |
如果想解开这个镜像研究的话,我已经把这个镜像同步到阿里上了
1 |
skopeo copy docker://quay.io/openshift-release-dev/ocp-release:4.5.9-x86_64 \ |
1 |
grep -qw 'registry.openshift4.example.com' /etc/hosts || |
执行同步命令
1 |
# 这里之前打算同步到阿里云仓库上,但是一直报错,以后有空的时候再研究下看怎么同步到阿里的镜像仓库上 |
下面是输出,可以临时保存下:
1 |
info: Mirroring 110 images to registry.openshift4.example.com/ocp4/openshift4 ... |
梯子不稳定的话多执行几次,
oc adm release mirror
命令执行完成后会输出下面类似的信息,保存下来,将来会用在
install-config.yaml
文件中:
1 |
imageContentSources: |
这里说下同步到本地,假如云梯的节点和内网是不通的,所以我们需要先在纵云梯节点上把镜像存为文件,后面文件拷贝内网里去推送到内网仓库上
1 |
# 创建目录 |
梯子不稳定的话多执行几次,这个命令支持继续上次的位置下载,下载完成后会有下面类似内容
1 |
phase 0: |
结尾输出了把 mirror 目录下文件推送到镜像仓库的命令
oc image mirror --from-dir=mirror/ 'file://openshift/release:4.5.9*' REGISTRY/REPOSITORY
,后面会用到这个命令,目录为下面情况
1 |
$ tree -L 4 mirror/ |
把这些镜像目录打包成压缩包,压缩后的大概5-6G大小
1 |
tar zcvf mirror.tar.gz mirror/ |
把前面的
mirror.tar.gz
压缩包传过来,这里传到内网的
LOCAL_REGISTRY
机器上,还有
pull-secret.json
文件和
oc
命令也记得拷贝过来。文件准备好后设置下变量
1 |
|
然后用之前下载镜像到目录的时候结尾输出的命令导入下,因为证书是非权威机构 ca 签署的,所以加
--insecure
1 |
tar zxvf mirror.tar.gz |
导入后去镜像仓库的 web 上查看有没有下面名字的镜像
1 |
$ echo ${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE} |
如果你机器数量多,或者内网有 dns server 和负载均衡,上面这些服务没必要耦合部署在一台上,同时这些实现手段看自己掌握的工具,没必要和我用一模一样
1 |
cp ssl.cert /etc/pki/ca-trust/source/anchors/ssl.crt |
如果使用 Docker 登录,需要将证书复制到 docker 的信任证书路径:
1 |
mkdir -p /etc/docker/certs.d/registry.openshift4.example.com |
把 registry 上的 oc 命令拷贝过来。为了保证安装版本一致性,需要从镜像库中提取
openshift-install
二进制文件,不能直接从
https://mirror.openshift.com/pub/openshift-v4/clients/ocp/
下载,不然后面会有
sha256
匹配不上的问题。
1 |
# 这一步需要用到上面的 export 变量 |
如果提示
error: image dose not exist
,说明拉取的镜像不全,或者版本不对,可以自己去仓库的 web 上去搜下
${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}
这个镜像。
把文件移动到
$PATH
并确认版本:
1 |
chmod +x openshift-install |
1 |
mkdir -p /data/coredns |
创建相关目录
1 |
mkdir -p /data/coredns/config/ \ |
1 |
cat > /data/coredns/config/Corefile <<'EOF' |
/etc/resolv.conf
上的 nameserver 段填写
1 |
cat > /data/coredns/etcd/conf/etcd.config.yml <<'EOF' |
1 |
docker-compose up -d |
验证下解析
1 |
$ dig +short apps.openshift4.example.com @127.0.0.1 |
然后根据集群的 ip 添加解析记录
1 |
|
查看所有记录
1 |
etcdctlv3 get /skydns --prefix |
1 |
yum install -y bind-utils |
然后我们改下系统的
resolv.conf
,使用 coredns 作为dns,这样我们不用去写 hosts
1 |
cp -a /etc/resolv.conf /etc/resolv.conf.bak |
1 |
curl -sk https://api-int.openshift4.example.com:22623/config/master |
安装完成后 bootstrap 会交出控制平面到 master 上(machine-config 和 kubernetes api),所以无论 master 有几个,都必须要配置负载均衡。使用工具不限,nginx,envoy 啥的均可。nginx 配置四层 mode 七层 check rs 的时候要安装插件来7层 healthz check,挺麻烦的,所以这里我使用 haproxy
1 |
mkdir -p /data/haproxy |
1 |
mkdir -p /data/haproxy/config/ |
因为前文使用的 quay 仓库无法更改 443 端口,这会和 haproxy 代理的 ingress-https 的 443 冲突,所以 quay 仓库单独部署。启动 haproxy
1 |
cd /data/haproxy |
可以访问
http://ip:9000
查看 haproxy 的状态,basic auth 为上面 haproxy 配置文件里的
admin:openshift
如果有配置 dhcp 的网络环境,这里需要起 dhcp server 和 tftp 之类的服务让 pxe 自动安装,但是我这里没这个网络条件,所以是开机器后挂载 installer iso,然后开机的时候按 tab 按键输入一堆 boot 选项参数,让它从指定 http 的地方下载和安装(也就是前面我门下载的rhcos的raw.gz文件)。这里 http 用容器 nginx 提供
创建相关目录
1 |
mkdir -p /data/install-nginx/{install/ignition,conf.d} |
创建 docker-compose 文件和配置文件,因为宿主机有负载均衡 80 端口在运行,所以这里 nginx 使用 8080 端口
1 |
cd /data/install-nginx |
启动
install-nginx
,起来后访问
http://ip:8080
看到目录就正常
1 |
docker-compose up -d |
下载 rhcos 的 ISO ,
下载链接地址
或者
这里下载
。我们下载下面俩个即可,
版本号必须小于等于ocp的版本号
,
installer
是给机器挂载,会在内存里运行,根据用户输入的 boot cmdline 去从 http server 下载
metal.x86_64.raw.gz
和 ignition 文件安装和配置
1 |
rhcos-4.5.6-x86_64-installer.x86_64.iso |
installer是给机器挂载从光驱启动的,raw.gz存放在 nginx的http目录下
1 |
cd /data/install-nginx/install/ |
installer 的 iso 如果是物理机或者虚机的话不要在 bmc 或者类似 vshpere 上远程挂载你自己pc上的 iso,否则会遇到 bootstrap 和 master 在 logo 的安装界面输入boot cmdline 后回车无响应的情况,建议传到远端上,相对于机器近的存储上。例如是 exsi 和 vshpere 则上传到上面的数据存储上。
在安装过程中,我们会在基础节点上执行 OCP 安装调试和灾难恢复,因此必须在基础节点上配置 SSH key,ssh-agent 将会用它来执行安装程序。
基础节点上的 core 用户可以使用该私钥登录到 Master 节点。同时部署集群时,该私钥会被添加到 core 用户的
~/.ssh/authorized_keys
列表中。
创建无密码验证的 SSH key:
1 |
ssh-keygen -t rsa -b 4096 -N '' -f ~/.ssh/new_rsa |
后续 ssh 到 master 和 node 使用下面命令即可
1 |
ssh -i ~/.ssh/new_rsa [email protected] |
1 |
mkdir /data/ocpinstall |
<cluster_name>
。
hostPrefix
设置为
23
,则为每一个节点分配一个给定 cidr 的
/23
子网,允许510个 Pod IP 地址,24位的话每个 node 的 pod 最多254个ip后期可能会太少了。
jq . /root/pull-secret.json
来压缩成一行。
cat ~/.ssh/new_rsa.pub
查看。
cat /data/quay/config/ssl.cert
查看。
oc adm release mirror
的输出结果。
platform 实际上支持 gcp,aws,vshpere,bmc之类的自动创建机器,有兴趣可以去去研究下
修改好上面的文件后接着生成 Ignition 配置文件,创建后
install-config.yaml
会被删除,所以备份下,同时该文件实际上会被生成 configmap 的 yaml 放在
manifests/cluster-config.yaml
)里,在集群起来后会存在
kube-system cm/cluster-config-v1
里
1 |
cd /data/ocpinstall |
创建部署清单manifests
1 |
cd /data/ocpinstall |
如果你的 worker 节点很多,不希望 master 节点上有pod被调度,修改
manifests/cluster-scheduler-02-config.yml
文件,将
mastersSchedulable
的值设为 flase,以防止 Pod 调度到控制节点。
后面的install create会转换manifest目录下所有文件,这里备份下manifest目录,有兴趣后面可以研究下
1 |
cp -a manifests manifests-bak |
ll manifests/
目录是一堆yaml
Ignition 生成的文件如下,也有隐藏的文件,有兴趣可以去看看
1 |
├── auth |
把所有 ignition 文件复制到 http server 的目录里
1 |
\cp -a /data/ocpinstall/*.ign /data/install-nginx/install/ignition/ |
机器创建好后给机器的光驱挂载上前面的 installer 的 iso 文件,开机后会停留在菜单选择界面
Tab
键进入引导参数配置选项
coreos.inst=yes
之后添加(由于无法拷贝粘贴,请输入
仔细核对
后再回车进行):
1 |
ip=10.225.45.223::10.225.45.254:255.255.255.0:bootstrap.openshift4.example.com:ens192:none nameserver=10.225.45.250 coreos.inst.install_dev=sda coreos.inst.image_url=http://10.225.45.250:8080/rhcos.raw.gz coreos.inst.ignition_url=http://10.225.45.250:8080/ignition/bootstrap.ign |
参数说明,参数为
key=value key1=value1
每个得空格隔开
$IPADDRESS::$DEFAULTGW:$NETMASK:$HOSTNAMEFQDN:$IFACE:none
IFACE
在rhcos里似乎是固定的
ens192
,我试过了可以不写
nameserver
${bastion_ip}
集群的dns server,这里是
bastion
coreos.inst.install_dev
rhcos 安装在哪块儿硬盘上,测试过只有一块硬盘也不会自动识别,所以不能省略,我的环境是 vsphere,硬盘是 sda,没有在 openstack 的虚机下试过(这样可能写vda?)
coreos.inst.image_url
http://${bastion_ip}:8080/rhcos-metal.raw.gz
rhcos-metal
的 url,根据自己http server的实际 url 填写
coreos.inst.ignition_url
http://${bastion_ip}:8080/ignition/${type}.ign
ignition 的 url 链接,bootstrap 则结尾是
bootstrap.ign
,master 则是
master.gin
emergency shell
,检查网络、域名解析是否正常,如果不正常一般是以上参数输入有误,reboot 退出 shell 回到第一步重新开始。
安装成功后从基础节点通过命令
ssh -i ~/.ssh/new_rsa [email protected]
登录 bootstrap 节点,然后
sudo su
切换到 root 后验证:
hostname
ip route
cat /etc/resolv.conf
podman ps -a
查看服务是否以容器方式运行
ss -tulnp
查看 6443 和 22623 端口是否启用。
这里简单介绍一下 bootstrap 节点的启动流程,它启动后运行
bootkube.service
,systemd 的
ConditionPathExists
可以看到用文件作为防止成功后再次运行
1 |
[root@bootstrap core]# systemctl cat bootkube |
查看上面的脚本内容,我们会发现它会先通过
podman
跑一些容器,然后在容器里面启动临时控制平面,这个临时控制平面是通过
CRIO
跑在容器里的,有点绕。。看下面
1 |
[root@bootstrap core]# podman ps -a |
如果你快速查看上面的可能一时半会儿没起来,可以通过下面命令持续观察脚本运行的日志,
bootkube.sh
正常运行完(所有master也上来后)会出现
bootkube.service complete
1 |
$ journalctl -b -f -u bootkube.service |
1 |
ip=10.225.45.251::10.225.45.254:255.255.255.0:master1.openshift4.example.com:ens192:none nameserver=10.225.45.250 coreos.inst.install_dev=sda coreos.inst.image_url=http://10.225.45.250:8080/rhcos.raw.gz coreos.inst.ignition_url=http://10.225.45.250:8080/ignition/master.ign |
此时你worker也可以按照相关参数启动,下面是参考,我这里是后面 bootstrap 完成后重装它去启动作为worker的
1 |
ip=10.225.45.223::10.225.45.254:255.255.255.0:worker1.openshift4.example.com:ens192:none nameserver=10.225.45.250 coreos.inst.install_dev=sda coreos.inst.image_url=http://10.225.45.250:8080/rhcos.raw.gz coreos.inst.ignition_url=http://10.225.45.250:8080/ignition/worker.ign |
一样的安装,注意
ingition_url
结尾是
worker.ign
,起来后 node 的 csr 得批准
查看挂起的证书签名请求(CSR),并确保添加到集群的每台节点都能看到具有
Pending
或
Approved
状态的客户端和服务端请求。针对 Pending 状态的 CSR 批准请求:
1 |
oc get csr |
或者执行以下命令批准所有 CSR:
1 |
CSR_NAMES=`oc get csr -o json | jq -r '.items[] | select(.status == {} ) | .metadata.name'` |
后续添加 worker 重复此步骤即可
在 bastion 节点上,我们生成部署清单的时候会产生一个
kubeconfig
,目录
/data/ocpinstall/auth
1 |
├── auth |
像 k8s 那样,我们需要拷贝到默认读取目录
1 |
mkdir ~/.kube |
配置下 oc 的自动补全
1 |
cat>/etc/bash_completion.d/oc <<'EOF' |
1 |
$ oc get node |
查看集群的 pod,如果很久之后某些 pod 还是一直 crash 的话看下面
troubleshooting
的,因为
源码里会等待所有pod不再crash
1 |
oc get po -A |
使用 openshift-install 命令查看 bootstrap 完成否,会需要等很久,有问题看下文的 troubleshooting
1 |
$ openshift-install --dir=/data/ocpinstall wait-for bootstrap-complete --log-level=debug |
这里
查看源码
,实际上 bootkube.sh 最后阶段会向集群里注入一个 cm
kube-system/bootstrap
存放状态。而上面的
wait-for bootstrap-complete
实际上就是等待这个cm创建,可以
查看源码里的waitForBootstrapConfigMap方法
1 |
$ cd /data/ocpinstall |
注意最后提示访问
Web Console
的网址及用户密码。如果密码忘了也没关系,可以查看文件
/data/ocpinstall/auth/kubeadmin-password
来获得密码。
本地访问 Web Console,因为集群里已经有 ingress controller 了,并且我们的入口是 10.225.45.250 ,所以本地需要添加下列 hosts:
1 |
10.225.45.250 console-openshift-console.apps.openshift4.example.com |
浏览器访问
https://console-openshift-console.apps.openshift4.example.com
,输入上面输出的用户名(kubeadm)和密码登录。首次登录后顶部会提示:
1 |
You are logged in as a temporary administrative user. Update the Cluster OAuth configuration to allow others to log in. |
我们可以通过 htpasswd 自定义管理员账号,步骤如下:
1
cd /data/ocpinstall/auth && htpasswd -c -B -b users.htpasswd admin xxxxx
2 将
users.htpasswd
文件下载到本地。
3 在 Web Console 页面打开
Global Configuration
:
然后找到
OAuth
,点击进入,然后添加
HTPasswd
类型的
Identity Providers
,并上传
users.htpasswd
文件。
4 退出当前用户,要注意退出到如下界面:
选择
htpasswd
,然后输入之前创建的用户名密码登录。
如果退出后出现的就是用户密码输入窗口,实际还是
kube:admin
的校验,如果未出现如上提示,可以手动输入 Web Console 地址来自动跳转。
5 登录后貌似能看到
Administrator
菜单项,但访问如
OAuth Details
仍然提示:
1 |
oauths.config.openshift.io "cluster" is forbidden: User "admin" cannot get resource "oauths" in API group "config.openshift.io" at the cluster scope |
因此需要授予集群管理员权限:
1 |
oc adm policy add-cluster-role-to-user cluster-admin admin |
Web Console 部分截图:
1 |
oc -n kube-system delete secrets kubeadmin |
github 地址为
cluster-ingress-operator
这里我集群是3个 master,发现ingress controller的一些属性没配置对,自行先
get deploy router-default -o yaml
查看,可能后续修复了。根据推测排查到是 operator 部署的,
1 |
[root@bastion ~]# oc get ingresscontrollers -A |
但是看了下属性
oc explain ingresscontrollers.spec.endpointPublishingStrategy.hostNetwork
发现不支持配置互斥和
dnsPolicy
,这会导致无法解析集群内的svc
1 |
[root@master2 ~]# crictl pods --name router-default-fb744fb7f-hmmn5 -q |
这个我已经提 issue 了
调整下 ingress controller 的数量,因为 deployment 由 crd 纳管,最好不要直接去操作 deploy 的属性,同时这里我们是把 ingress controller 部署在 master 上,所以得用 nodeSelector 固定,先打 label
1 |
oc label node master1.openshift4.example.com ingressControllerDeploy=true |
参考 Installing the Local Storage Operator
1 |
oc oc new-project local-storage |
查看 clusteroperator,如果有个别有问题,可以等worker部署完了慢慢排查
1 |
[root@bastion ~]# oc get clusteroperator |
参考 官方troubleshooting文档 ,很多理念还是 k8s,所以多用 oc 命令排查
这里是我单 master 时候的错误,可以参考下排查思路
1 |
[root@bastion ocpinstall]# oc get po -A |
发现
kube-apiserver-master1.openshift4.example.com
的 pod 有个容器一直 crash,从 bastion 上 ssh 到 master1 上去后查看日志
1 |
# 查看 apiserver 的容器组 |
查看发现没有etcd的容器
1 |
crictl ps -a | grep etcd |
回到 bastion 上,查看 etcd 来源
1 |
# 查看 pod |
从时间上看,operator 先部署,然后operator 部署了 etcd-quorum-guard 的 pod,但是没就绪。这个 etcd 来源于 crd
1 |
$ oc -n openshift-etcd get etcd |
看输出是期待 3 个 etcd member,我们需要更改成非 HA 的,执行下面命令
1 |
oc patch etcd cluster -p=' |
ocp4.6.+ 除了要应用以上
etcd
配置更新外,还需要配置更改
oauth
对于 APIServer HA 的要求,参
https://github.com/openshift/okd/issues/465
1 |
oc patch authentication cluster -p='{"spec":{"unsupportedConfigOverrides":{"useUnsupportedUnsafeNonHANonProductionUnstableOAuthServer":true}}}' --type=merge |
1 |
[root@master1 core]# ll /etc/kubernetes/manifests/ |
具体哪一步骤有问题可以看下面目录的 done文 件结合
/usr/local/bin/bootkube.sh
脚本查看,正常完成后是下面的
1 |
[root@bootstrap kubernetes]# ll /opt/openshift/ |
3个 master 和 1个 node 的所有 pod 情况参考:
1 |
[root@bastion ocpinstall]# oc get po -A |
2021-06-08 推荐 24 小时后再备份, 官方备份文档
其他的 单master 参考:
原文作者: Zhangguanzhang
原文链接: http://zhangguanzhang.github.io/2020/09/18/ocp-4.5-install/
发表日期: September 18th 2020, 11:14:06 am
更新日期: September 18th 2020, 11:14:06 am
版权声明:本文采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
CATALOG