重要: 3台管理节点内存尽量大,至少12G以上,低于12G失败概率大。
大概步骤:
- 基础环境机器,提供OKD集群中的节点的DNS正反解析,可以用bind或者容器时代的coredns+etcd;提供OKD引导节点以及控制平面节点以及集群负载ingress的负载均均衡软件,比如haproxy或者envoy,主要包括 控制节点api 6443,OKD平台的80 443,以及其他Ingress入口。配置可以直接按官网的来就行。另外内网环境或者不想直接去外网容器仓库拉镜像的情况,还需要提供内部registry,可以用docker 自带的registry或者 vmware的哈勃或者其他registry,注意生成证书提供HTTPS访问以及账号认证用于部署的时候客户端访问。
- 配置好基础环境的dns,haproxy,registry(如果基础环境机器只有一个IP,不能占用443端口,okd集群要用),然后就是下载oc 以及installer,生成install-config.yaml文件,里面定义了集群域名,Pod IP以及service IP段,虚拟网络插件,基础环境机器(充当管理机)ssh公钥,内网镜像registry信息(离线OKD镜像参考官网文档),以及registry的https证书。通过这个文件生成manifests信息,然后再生成点火文件。
- 手工安装的OKD,需要下载coreos,直接通过ISO或者PXE引导安装,安装过程主要是为节点机器提供网络配置,点火文件,安装后,重启节点后会自动进行安装,先安装bootstrap,bootstrap起来后最终可以sudo crictl pods看到起7个Pod后可以认为是正常了,然后再安装master,3台可以同时安装,安装完后看运气(内存不给够的情况下).
- 节点都安装上了后,wait-for bootstrap-complete 一直观察,如果正常会报告可以删除bootstrap的时候,就去haproxy里面把bootstrap机器的条目注视掉或者删掉。重启haproxy,这样集群就完全是走控制平面三个节点了。引导节点起来会起几个静态pod起个小的k8s环境,然后用来引导master完成安装,安装完后引导节点就把k8s控制平面由本机交给真正的3台控制平面机器。
- 再然后就是不停检查node,clusteroperators,pods状态,或者wait-for install-complete,如果安装完成后会报告web console的登陆地址以及账号密码。
- 未完待续。
使用docker的registry镜像搭建容器仓库,开启https以及认证
生成系统自认证证书,如果是本机或者可以直接添加证书为信任的情况,CA都不用,直接
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/registry/certs/domain.key -x509 -days 3000 -out /opt/registry/certs/domain.crt -addext "subjectAltName = DNS:registry.okd.example.com"
这样生成key和crt,注意一定要加参数
-addext "subjectAltName = DNS:registry.okd.example.com"
不然registry起来后,客户端访问会报
x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
原因是go的高版本要求明确指定subjectaltname了,就是他提示那个SAN,参考
GENERAL: What should I do if I get an "x509: certificate relies on legacy Common Name field" error?https://jfrog.com/knowledge-base/general-what-should-i-do-if-i-get-an-x509-certificate-relies-on-legacy-common-name-field-error/How do I use SANs with openSSL instead of common name? - Stack Overflowhttps://stackoverflow.com/questions/64814173/how-do-i-use-sans-with-openssl-instead-of-common-name生成后,本机添加下信任
cp /opt/registry/certs/domain.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust extract
账号认证用
htpasswd -Bbn admin admin > htpassfile
然后就可以起registry容器了。这个镜像的使用方法及参数见官网,主要是镜像存储位置,认证信息,https证书和key
docker run -d --restart=always --name registry \
-v /opt/registry/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-v /opt/registry/data:/var/lib/registry \
-v "/opt/registry/auth:/auth" \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpassfile" \
-p 443:443 registry
然后去拖镜像用于离线安装
#OCP_RELEASE直接用下载的installer包的版本号,官网教程不准。
export OCP_RELEASE=4.10.0-0.okd-2022-03-07-131213
export LOCAL_REGISTRY='registry.okd.example.com:443'
export LOCAL_REPOSITORY='openshift/okd'
export PRODUCT_REPO='openshift'
export RELEASE_NAME="okd"
export LOCAL_SECRET_JSON='/root/.docker/config.json'
oc adm release mirror -a ${LOCAL_SECRET_JSON} \
--from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE} \
--to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \
--to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}
拖完后会提示
imageContentSources:
- mirrors:
- registry.okd.example.com:443/openshift/okd
source: quay.io/openshift/okd
- mirrors:
- registry.okd.example.com:443/openshift/okd
source: quay.io/openshift/okd-content
这一段就可以加到install-config.yaml里面去了,这样安装就不需要再去拖镜像了。
安装OKD标准上需要1台基础服务机器,用于配置dns(集群内各种资源和主机的正反解),haproxy(okd 控制节点以及pod的ingress负载均衡),registry(离线容器镜像,基础服务器机器不会跑任何其他容器,所以可以直接用docker的registry,其他registry太大,配置麻烦),等共用服务,1台bootstrap,用于起一个微型k8s环境安装正式的okd master. okd master官网说最少是3台,但网上也有人直接修改配置只装一台的,但安装好后后面还需要改一些其他pod的副本数,资源足够尽量就3台mster,1台bootstrap
官网文档提供了在各种云平台的部署,以及裸金属 installer-provider部署和user provider部署,区别就在于云平台和installer provider环境下,OKD installer会准备很多环境及基础服务,让整个安装过程自动化,简化安装,但对实际技术人员学习来讲,理清安装的每一个环节以及步骤,手动操作才能搞清楚整个安装过程的情况,如果一键安装,不出问题的情况下,那安装完就啥也不知道,也无法理解安装的依赖以及安装情况了。
所以选择user provider部署方式来学习OKD部署最合适,因为user provider方式需要部署的人准备好一切,所以也就知道安装过程是个什么原理发生了什么。
OKD部署大致就是通过install-config.yaml生成manifests,manifests 再生成 部署实际bootstrap以及master的点火文件(bootstrap,master compute节点的点火文件),有了点火文件后,就可以开始安装bootstrap引导(引导安装master用)节点,bootstrap起来后就可以安装master节点了,master起来后就可以干掉bootstrap了,compute节点通过master节点环境安装。
几个节点的安装过程可以通过网络安装(需要DHCP配置好要给到对应节点的信息,IP,主机名,dns,点火文件获取方式),也可以通过手工ISO安装并在安装界面手工添加IP,主机名,点火文件下载信息,或者定制好ISO。
这样安装完成后,也就清楚整个安装过程是怎么来的了。
NOTE1:不知道为啥,我用iso安装,添加coreos.inst.ignition_url 参数不起作用,只能添加IP配置,然后进系统再执行安装
NOTE2:不知道为啥,离线安装方式,bootstrap非要去找registry.okd.example.com:443访问registry,inistall-config.yaml里面修改成2443了,重新生成ign并拷贝到nginx的html目录后,再安装,他还是要去找registry.okd.example.com:443,最后没办法,只能修改回来.
NOTE3:MMP的官网给的文档做LB的时候haproxy配置里面bootstrap后面加了backup,理论上这个是别的机器活着的时候,这个backup机器就不提供服务,但不知道为啥,我部署的bootstrap起来了 6443端口也是监听了,在LB机器用netstat -antup | grep 6443就死活看不到haproxy去连bootstrap机器,不停去连其他三台,要了命了(其他三台还等着bootstrap来搭把手起服务呢,怎么可能起来api-server啊,自举真麻烦)。
NOTE4:离线registry要单独放在另外的IP地址上,否则争用443端口(因为*.apps.okd.example.com这个泛域名解析已经做到用于部署LB的机器了,haproxy会监听443,如果registry用了443,haproxy没法监听,也没法转发请求到3台master机器上去了。
oc get clusteroperators.config.openshift.io
这里列出来authentication服务就会解析oauth-openshift.apps.okd.example.com,这样的域名。配置好haproxy 443端口后,所有的输出都正常了。
NOTE5:几个确认集群状态正常的命令
oc get nodes
oc adm top nodes
oc get clusterversion
oc get clusteroperators.config.openshift.io
oc describe clusterversion
#查看节点日志
oc adm node-logs <node_name> -u crio
NOTE6: 查看集群pod以及日志
oc get clusteroperators
oc get pods --all-namespaces
#查看pod日志
oc logs downloads-58b68d9689-tktbk -n openshift-console
# 获取web console 账号密码方法
./openshift-install --dir /root/okd/install-dir/ wait-for install-complete
INFO Waiting up to 40m0s (until 5:11PM) for the cluster at https://api.okd.example.com:6443 to initialize...
INFO Waiting up to 10m0s (until 4:41PM) for the openshift-console route to be created...
INFO Install complete!
INFO To access the cluster as the system:admin user when using 'oc', run 'export KUBECONFIG=/root/okd/install-dir/auth/kubeconfig'
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.okd.example.com
INFO Login to the console with user: "kubeadmin", and password: "Y7Q6x-TWRgd-uMjSF-hQATP"
INFO Time elapsed: 0s