Openshift 4.4 靜態 IP 離線安裝系列:初始安裝
阿新 • • 發佈:2020-06-15
[上篇文章](https://fuckcloudnative.io/posts/openshift4.4-install-offline-static-1-requirement/)準備了離線安裝 OCP 所需要的離線資源,包括安裝映象、所有樣例 `Image Stream` 和 `OperatorHub` 中的所有 RedHat Operators。本文就開始正式安裝 `OCP`(Openshift Container Platform) 叢集,包括 DNS 解析、負載均衡配置、`ignition` 配置檔案生成和叢集部署。
`OCP` 安裝期間需要用到多個檔案:安裝配置檔案、Kubernetes 部署清單、Ignition 配置檔案(包含了 machine types)。**安裝配置檔案將被轉換為 Kubernetes 部署清單,然後將清單包裝到 `Ignition` 配置檔案中。** 安裝程式使用這些 `Ignition` 配置檔案來建立 Openshift 叢集。執行安裝程式時,所有原始安裝配置檔案都會修改,因此在安裝之前應該先備份檔案。
## 1. 安裝過程
在安裝 OCP 時,我們需要有一臺引導主機(`Bootstrap`)。這個主機可以訪問所有的 OCP 節點。引導主機啟動一個臨時控制平面,它啟動 OCP 叢集的其餘部分然後被銷燬。引導主機使用 Ignition 配置檔案進行叢集安裝引導,該檔案描述瞭如何建立 OCP 叢集。**安裝程式生成的 Ignition 配置檔案包含 24 小時後過期的證書,所以必須在證書過期之前完成叢集安裝。**
引導叢集安裝包括如下步驟:
+ 引導主機啟動並開始託管 `Master` 節點啟動所需的資源。
+ `Master` 節點從引導主機遠端獲取資源並完成引導。
+ `Master` 節點通過引導主機構建 `Etcd` 叢集。
+ 引導主機使用新的 `Etcd` 叢集啟動臨時 `Kubernetes` 控制平面。
+ 臨時控制平面在 Master 節點啟動生成控制平面。
+ 臨時控制平面關閉並將控制權傳遞給生產控制平面。
+ 引導主機將 OCP 元件注入生成控制平面。
+ 安裝程式關閉引導主機。
引導安裝過程完成以後,OCP 叢集部署完畢。然後叢集開始下載並配置日常操作所需的其餘元件,包括建立計算節點、通過 `Operator` 安裝其他服務等。
![建立引導主機、控制平面和計算節點](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111308628-338871961.png)
## 2. 準備伺服器資源
伺服器規劃如下:
+ 三個控制平面節點,安裝 `Etcd`、控制平面元件和 `Infras` 基礎元件。
+ 兩個計算節點,執行實際負載。
+ 一個引導主機,執行安裝任務,叢集部署完成後可刪除。
+ 一個基礎節點,用於準備上節提到的離線資源,同時用來部署 DNS 和負載均衡。
+ 一個映象節點,用來部署私有映象倉庫 `Quay`。
| 主機型別 | 作業系統 | Hostname | vCPU | 記憶體 | 儲存 | IP | FQDN |
| :------: | :---------------: | :-------: | :--: | ---- | :---: | :-----------: | :------------------------------: |
| 映象節點 | RHEL 7.6 | registry | 4 | 8GB | 150GB | 192.168.57.70 | registry.openshift4.example.com |
| 基礎節點 | RHEL 7.6 | bastion | 4 | 16GB | 120GB | 192.168.57.60 | bastion.openshift4.example.com |
| 引導主機 | RHCOS | bootstrap | 4 | 16GB | 120GB | 192.168.57.61 | bootstrap.openshift4.example.com |
| 控制平面 | RHCOS | master1 | 4 | 16GB | 120GB | 192.168.57.62 | master1.openshift4.example.com |
| 控制平面 | RHCOS | master2 | 4 | 16GB | 120GB | 192.168.57.63 | master2.openshift4.example.com |
| 控制平面 | RHCOS | master3 | 4 | 16GB | 120GB | 192.168.57.64 | master3.openshift4.example.com |
| 計算節點 | RHCOS 或 RHEL 7.6 | worker1 | 2 | 8GB | 120GB | 192.168.57.65 | worker1.openshift4.example.com |
| 計算節點 | RHCOS 或 RHEL 7.6 | worker2 | 2 | 8GB | 120GB | 192.168.57.66 | worke2.openshift4.example.com |
## 3. 防火牆配置
接下來看一下每個節點的埠號分配。
所有節點(計算節點和控制平面)之間需要開放的埠:
| 協議 | 埠 | 作用 |
| :--: | :-------------: | :----------------------------------------------------------: |
| ICMP | N/A | 測試網路連通性 |
| TCP | `9000-9999` | 節點的服務埠,包括 node exporter 使用的 `9100-9101` 埠和 Cluster Version Operator 使用的 `9099` 埠 |
| | `10250`-`10259` | Kubernetes 預留的預設埠 |
| | `10256` | openshift-sdn |
| UDP | `4789` | VXLAN 協議或 GENEVE 協議的通訊埠 |
| | `6081` | VXLAN 協議或 GENEVE 協議的通訊埠 |
| | `9000`-`9999` | 節點的服務埠,包括 node exporter 使用的 `9100-9101` 埠 |
| | `30000`-`32767` | Kubernetes NodePort |
控制平面需要向其他節點開放的埠:
| 協議 | 埠 | 作用 |
| :--: | :-----------: | :------------: |
| TCP | `2379`-`2380` | Etcd 服務埠 |
| | `6443` | Kubernetes API |
除此之外,還要配置兩個四層負載均衡器,一個用來暴露叢集 API,一個用來暴露 Ingress:
| 埠 | 作用 | 內部 | 外部 | 描述 |
| :-----: | :----------------------------------------------------------: | :--: | :--: | :-------------------: |
| `6443` | 引導主機和控制平面使用。在引導主機初始化叢集控制平面後,需從負載均衡器中手動刪除引導主機 | x | x | Kubernetes API server |
| `22623` | 引導主機和控制平面使用。在引導主機初始化叢集控制平面後,需從負載均衡器中手動刪除引導主機 | | x | Machine Config server |
| `443` | Ingress Controller 或 Router 使用 | x | x | HTTPS 流量 |
| `80` | Ingress Controller 或 Router 使用 | x | x | HTTP 流量 |
## 4. 配置 DNS
按照官方文件,使用 UPI 基礎架構的 OCP 叢集需要以下的 DNS 記錄。在每條記錄中,`` 是叢集名稱,`` 是在 `install-config.yaml` 檔案中指定的叢集基本域,如下表所示:
| 元件 | DNS記錄 | 描述 |
| :------------: | :---------------------------------------------------: | :----------------------------------------------------------: |
| Kubernetes API | `api...` | 此 DNS 記錄必須指向控制平面節點的負載均衡器。此記錄必須可由叢集外部的客戶端和叢集中的所有節點解析。 |
| | `api-int...` | 此 DNS 記錄必須指向控制平面節點的負載均衡器。此記錄必須可由叢集外部的客戶端和叢集中的所有節點解析。 |
| Routes | `*.apps...` | DNS 萬用字元記錄,指向負載均衡器。這個負載均衡器的後端是 Ingress router 所在的節點,預設是計算節點。此記錄必須可由叢集外部的客戶端和叢集中的所有節點解析。 |
| etcd | `etcd-...` | OCP 要求每個 etcd 例項的 DNS 記錄指向執行例項的控制平面節點。etcd 例項由 值區分,它們以 `0` 開頭,以 `n-1` 結束,其中 `n` 是叢集中控制平面節點的數量。叢集中的所有節點必須都可以解析此記錄。 |
| | `_etcd-server-ssl._tcp...` | 因為 etcd 使用埠 `2380` 對外服務,因此需要建立對應每臺 etcd 節點的 SRV DNS 記錄,優先順序 0,權重 10 和埠 2380 |
DNS 服務的部署方法由很多種,我當然推薦使用 `CoreDNS`,畢竟雲原生標配。由於這裡需要新增 SRV 記錄,所以需要 CoreDNS 結合 `etcd` 外掛使用。**以下所有操作在基礎節點上執行。**
首先通過 yum 安裝並啟動 etcd:
```bash
$ yum install -y etcd
$ systemctl enable etcd --now
```
然後下載 CoreDNS 二進位制檔案:
```bash
$ wget https://github.com/coredns/coredns/releases/download/v1.6.9/coredns_1.6.9_linux_amd64.tgz
$ tar zxvf coredns_1.6.9_linux_amd64.tgz
$ mv coredns /usr/local/bin
```
建立 `Systemd Unit` 檔案:
```bash
$ cat > /etc/systemd/system/coredns.service < /etc/coredns/Corefile <`。
+ **cidr** : 定義了分配 Pod IP 的 IP 地址段,不能和物理網路重疊。
+ **hostPrefix** : 分配給每個節點的子網字首長度。例如,如果將 `hostPrefix` 設定為 `23`,則為每一個節點分配一個給定 cidr 的 `/23` 子網,允許 $510 (2^{32 - 23} - 2)$ 個 Pod IP 地址。
+ **serviceNetwork** : Service IP 的地址池,只能設定一個。
+ **pullSecret** : 上篇文章使用的 pull secret,可通過命令 `cat /root/pull-secret.json|jq -c` 來壓縮成一行。
+ **sshKey** : 上面建立的公鑰,可通過命令 `cat ~/.ssh/new_rsa.pub` 檢視。
+ **additionalTrustBundle** : 私有映象倉庫 Quay 的信任證書,可在映象節點上通過命令 `cat /data/quay/config/ssl.cert` 檢視。
+ **imageContentSources** : 來自前面 `oc adm release mirror` 的輸出結果。
備份安裝配置檔案,便於以後重複使用:
```bash
$ cd /ocpinstall
$ cp install-config.yaml install-config.yaml.20200604
```
### 建立 Kubernetes 部署清單
> 建立 Kubernetes 部署清單後 `install-config.yaml` 將被刪除,請務必先備份此檔案!
建立 Kubernetes 部署清單檔案:
```bash
$ openshift-install create manifests --dir=/ocpinstall
```
修改 `manifests/cluster-scheduler-02-config.yml` 檔案,將 `mastersSchedulable` 的值設為 `flase`,以防止 Pod 排程到控制節點。
### 建立 Ignition 配置檔案
> 建立 Ignition 配置檔案後 `install-config.yaml` 將被刪除,請務必先備份此檔案!
```bash
$ cp install-config.yaml.20200604 install-config.yaml
$ openshift-install create ignition-configs --dir=/ocpinstall
```
生成的檔案:
```bash
├── auth
│ ├── kubeadmin-password
│ └── kubeconfig
├── bootstrap.ign
├── master.ign
├── metadata.json
└── worker.ign
```
準備一個 HTTP 服務,這裡選擇使用 Nginx:
```bash
$ yum install -y nginx
```
修改 Nginx 的配置檔案 `/etc/nginx/nginx/.conf`,將埠改為 `8080`(因為負載均衡器已經佔用了 80 埠)。然後啟動 Nginx 服務:
```bash
$ systemctl enable nginx --now
```
將 `Ignition` 配置檔案拷貝到 HTTP 服務的 ignition 目錄:
```bash
$ mkdir /usr/share/nginx/html/ignition
$ cp -r *.ign /usr/share/nginx/html/ignition/
```
### 獲取 RHCOS 的 BIOS 檔案
下載用於裸機安裝的 BIOS 檔案,並上傳到 Nginx 的目錄:
```bash
$ mkdir /usr/share/nginx/html/install
$ wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.4/latest/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz -O /usr/share/nginx/html/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz
```
### 獲取 RHCOS 的 ISO 檔案
本地下載 RHCOS 的 `ISO` 檔案:[https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.4/latest/rhcos-4.4.3-x86_64-installer.x86_64.iso](https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.4/latest/rhcos-4.4.3-x86_64-installer.x86_64.iso),然後上傳到 `vSphere`。步驟如下:
① 首先登陸 vSphere,然後點選『儲存』。
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111308853-1471453497.png)
② 選擇一個『資料儲存』,然後在右邊的視窗中選擇『上載檔案』。
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111309250-1097895417.png)
③ 選擇剛剛下載的 ISO 檔案,上傳到 ESXI 主機。
## 7. 安裝叢集
### Bootstrap
最後開始正式安裝叢集,先建立 bootstrap 節點虛擬機器,作業系統選擇『Red Hat Enterprise Linux 7 (64-Bit)』,並掛載之前上傳的 ISO,按照之前的表格設定 CPU 、記憶體和硬碟,開啟電源,然後按照下面的步驟操作:
① 在 RHCOS Installer 安裝介面按 `Tab` 鍵進入引導引數配置選項。
② 在預設選項 `coreos.inst = yes` 之後新增(由於無法拷貝貼上,請輸入**仔細核對**後再回車進行):
```bash
ip=192.168.57.61::192.168.57.1:255.255.255.0:bootstrap.openshift4.example.com:ens192:none nameserver=192.168.57.60 coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.57.60:8080/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz coreos.inst.ignition_url=http://192.168.57.60:8080/ignition/bootstrap.ign
```
其中 `ip=...` 的含義為 `ip=$IPADDRESS::$DEFAULTGW:$NETMASK:$HOSTNAMEFQDN:$IFACE:none`。
如圖所示:
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111309709-1742250468.png)
③ 如果安裝有問題會進入 `emergency shell`,檢查網路、域名解析是否正常,如果正常一般是以上引數輸入有誤,reboot 退出 shell 回到第一步重新開始。
安裝成功後從基礎節點通過命令 `ssh -i ~/.ssh/new_rsa [email protected]` 登入 bootstrap 節點,然後驗證:
+ 網路配置是否符合自己的設定:
+ `hostname`
+ `ip route`
+ `cat /etc/resolv.conf`
+ 驗證是否成功啟動 bootstrap 相應服務:
+ `podman ps` 檢視服務是否以容器方式執行
+ 使用 `ss -tulnp` 檢視 6443 和 22623 埠是否啟用。
這裡簡單介紹一下 bootstrap 節點的啟動流程,它會先通過 `podman` 跑一些容器,然後在容器裡面啟動臨時控制平面,這個臨時控制平面是通過 `CRIO` 跑在容器裡的,有點繞。。直接看命令:
```bash
$ podman ps -a --no-trunc --sort created --format "{{.Command}}"
start --tear-down-early=false --asset-dir=/assets --required-pods=openshift-kube-apiserver/kube-apiserver,openshift-kube-scheduler/openshift-kube-scheduler,openshift-kube-controller-manager/kube-controller-manager,openshift-cluster-version/cluster-version-operator
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
render --dest-dir=/assets/cco-bootstrap --cloud-credential-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:244ab9d0fcf7315eb5c399bd3fa7c2e662cf23f87f625757b13f415d484621c3
bootstrap --etcd-ca=/assets/tls/etcd-ca-bundle.crt --etcd-metric-ca=/assets/tls/etcd-metric-ca-bundle.crt --root-ca=/assets/tls/root-ca.crt --kube-ca=/assets/tls/kube-apiserver-complete-client-ca-bundle.crt --config-file=/assets/manifests/cluster-config.yaml --dest-dir=/assets/mco-bootstrap --pull-secret=/assets/manifests/openshift-config-secret-pull-secret.yaml --etcd-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:aba3c59eb6d088d61b268f83b034230b3396ce67da4f6f6d49201e55efebc6b2 --kube-client-agent-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:8eb481214103d8e0b5fe982ffd682f838b969c8ff7d4f3ed4f83d4a444fb841b --machine-config-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:31dfdca3584982ed5a82d3017322b7d65a491ab25080c427f3f07d9ce93c52e2 --machine-config-oscontent-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b397960b7cc14c2e2603111b7385c6e8e4b0f683f9873cd9252a789175e5c4e1 --infra-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:d7862a735f492a18cb127742b5c2252281aa8f3bd92189176dd46ae9620ee68a --keepalived-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:a882a11b55b2fc41b538b59bf5db8e4cfc47c537890e4906fe6bf22f9da75575 --coredns-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b25b8b2219e8c247c088af93e833c9ac390bc63459955e131d89b77c485d144d --mdns-publisher-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:dea1fcb456eae4aabdf5d2d5c537a968a2dafc3da52fe20e8d99a176fccaabce --haproxy-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:7064737dd9d0a43de7a87a094487ab4d7b9e666675c53cf4806d1c9279bd6c2e --baremetal-runtimecfg-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:715bc48eda04afc06827189883451958d8940ed8ab6dd491f602611fe98a6fba --cloud-config-file=/assets/manifests/cloud-provider-config.yaml --cluster-etcd-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9f7a02df3a5d91326d95e444e2e249f8205632ae986d6dccc7f007ec65c8af77
render --prefix=cluster-ingress- --output-dir=/assets/ingress-operator-manifests
/usr/bin/cluster-kube-scheduler-operator render --manifest-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:187b9d29fea1bde9f1785584b4a7bbf9a0b9f93e1323d92d138e61c861b6286c --asset-input-dir=/assets/tls --asset-output-dir=/assets/kube-scheduler-bootstrap --config-output-file=/assets/kube-scheduler-bootstrap/config
/usr/bin/cluster-kube-controller-manager-operator render --manifest-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:187b9d29fea1bde9f1785584b4a7bbf9a0b9f93e1323d92d138e61c861b6286c --asset-input-dir=/assets/tls --asset-output-dir=/assets/kube-controller-manager-bootstrap --config-output-file=/assets/kube-controller-manager-bootstrap/config --cluster-config-file=/assets/manifests/cluster-network-02-config.yml
/usr/bin/cluster-kube-apiserver-operator render --manifest-etcd-serving-ca=etcd-ca-bundle.crt --manifest-etcd-server-urls=https://localhost:2379 --manifest-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:187b9d29fea1bde9f1785584b4a7bbf9a0b9f93e1323d92d138e61c861b6286c --manifest-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:718ca346d5499cccb4de98c1f858c9a9a13bbf429624226f466c3ee2c14ebf40 --asset-input-dir=/assets/tls --asset-output-dir=/assets/kube-apiserver-bootstrap --config-output-file=/assets/kube-apiserver-bootstrap/config --cluster-config-file=/assets/manifests/cluster-network-02-config.yml
/usr/bin/cluster-config-operator render --config-output-file=/assets/config-bootstrap/config --asset-input-dir=/assets/tls --asset-output-dir=/assets/config-bootstrap
/usr/bin/cluster-etcd-operator render --etcd-ca=/assets/tls/etcd-ca-bundle.crt --etcd-metric-ca=/assets/tls/etcd-metric-ca-bundle.crt --manifest-etcd-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:aba3c59eb6d088d61b268f83b034230b3396ce67da4f6f6d49201e55efebc6b2 --etcd-discovery-domain=test.example.com --manifest-cluster-etcd-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9f7a02df3a5d91326d95e444e2e249f8205632ae986d6dccc7f007ec65c8af77 --manifest-setup-etcd-env-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:31dfdca3584982ed5a82d3017322b7d65a491ab25080c427f3f07d9ce93c52e2 --manifest-kube-client-agent-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:8eb481214103d8e0b5fe982ffd682f838b969c8ff7d4f3ed4f83d4a444fb841b --asset-input-dir=/assets/tls --asset-output-dir=/assets/etcd-bootstrap --config-output-file=/assets/etcd-bootstrap/config --cluster-config-file=/assets/manifests/cluster-network-02-config.yml
render --output-dir=/assets/cvo-bootstrap --release-image=registry.openshift4.example.com/ocp4/openshift4@sha256:4a461dc23a9d323c8bd7a8631bed078a9e5eec690ce073f78b645c83fb4cdf74
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
```
```bash
$ crictl pods
POD ID CREATED STATE NAME NAMESPACE ATTEMPT
17a978b9e7b1e 3 minutes ago Ready bootstrap-kube-apiserver-bootstrap.openshift4.example.com kube-system 24
8a0f79f38787a 3 minutes ago Ready bootstrap-kube-scheduler-bootstrap.openshift4.example.com kube-system 4
1a707da797173 3 minutes ago Ready bootstrap-kube-controller-manager-bootstrap.openshift4.example.com kube-system 4
0461d2caa2753 3 minutes ago Ready cloud-credential-operator-bootstrap.openshift4.example.com openshift-cloud-credential-operator 4
ab6519286f65a 3 minutes ago Ready bootstrap-cluster-version-operator-bootstrap.openshift4.example.com openshift-cluster-version 2
457a7a46ec486 8 hours ago Ready bootstrap-machine-config-operator-bootstrap.openshift4.example.com default 0
e4df49b4d36a1 8 hours ago Ready etcd-bootstrap-member-bootstrap.openshift4.example.com openshift-etcd 0
```
如果驗證無問題,則可以一邊繼續下面的步驟一邊觀察日誌:`journalctl -b -f -u bootkube.service`
> RHCOS 的預設使用者是 `core`,如果想獲取 root 許可權,可以執行命令 `sudo su`(不需要輸入密碼)。
### Master
控制節點和之前類似,先建立虛擬機器,然後修改引導引數,引導引數調整為:
```bash
ip=192.168.57.62::192.168.57.1:255.255.255.0:master1.openshift4.example.com:ens192:none nameserver=192.168.57.60 coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.57.60:8080/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz coreos.inst.ignition_url=http://192.168.57.60:8080/ignition/master.ign
```
控制節點安裝成功後會重啟一次,之後同樣可以從基礎節點通過 SSH 金鑰登入。
然後重複相同的步驟建立其他兩臺控制節點,注意修改引導引數(IP 和主機名)。先不急著建立計算節點,先在基礎節點執行以下命令完成生產控制平面的建立:
```bash
$ openshift-install --dir=/ocpinstall wait-for bootstrap-complete --log-level=debug
DEBUG OpenShift Installer 4.4.5
DEBUG Built from commit 15eac3785998a5bc250c9f72101a4a9cb767e494
INFO Waiting up to 20m0s for the Kubernetes API at https://api.openshift4.example.com:6443...
INFO API v1.17.1 up
INFO Waiting up to 40m0s for bootstrapping to complete...
DEBUG Bootstrap status: complete
INFO It is now safe to remove the bootstrap resources
```
待出現 `It is now safe to remove the bootstrap resources` 提示之後,從負載均衡器中刪除引導主機,本文使用的是 Envoy,只需從 `cds.yaml` 中刪除引導主機的 endpoint,然後重新載入就好了。
觀察引導節點的日誌:
```bash
$ journalctl -b -f -u bootkube.service
...
Jun 05 00:24:12 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:12.108179 1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:21 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:21.595680 1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:26 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:26.250214 1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:26 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:26.306421 1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:29 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:29.097072 1 waitforceo.go:64] Cluster etcd operator bootstrapped successfully
Jun 05 00:24:29 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:29.097306 1 waitforceo.go:58] cluster-etcd-operator bootstrap etcd
Jun 05 00:24:29 bootstrap.openshift4.example.com podman[16531]: 2020-06-05 00:24:29.120864426 +0000 UTC m=+17.965364064 container died 77971b6ca31755a89b279fab6f9c04828c4614161c2e678c7cba48348e684517 (image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9f7a02df3a5d91326d95e444e2e249f8205632ae986d6dccc7f007ec65c8af77, name=recursing_cerf)
Jun 05 00:24:29 bootstrap.openshift4.example.com bootkube.sh[12571]: bootkube.service complete
```
### Worker
計算節點和之前類似,先建立虛擬機器,然後修改引導引數,引導引數調整為:
```bash
ip=192.168.57.65::192.168.57.1:255.255.255.0:worker1.openshift4.example.com:ens192:none nameserver=192.168.57.60 coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.57.60:8080/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz coreos.inst.ignition_url=http://192.168.57.60:8080/ignition/worker.ign
```
計算節點安裝成功後也會重啟一次,之後同樣可以從基礎節點通過 SSH 金鑰登入。
然後重複相同的步驟建立其他計算節點,注意修改引導引數(IP 和主機名)。
### 登入叢集
可以通過匯出叢集 kubeconfig 檔案以預設系統使用者身份登入到叢集。kubeconfig 檔案包含有關 CLI 用於將客戶端連線到正確的叢集和 API Server 的叢集資訊,該檔案在 OCP 安裝期間被建立。
```bash
$ mkdir ~/.kube
$ cp /ocpinstall/auth/kubeconfig ~/.kube/config
$ oc whoami
system:admin
```
### 批准 CSR
將節點新增到叢集時,會為新增的每臺節點生成**兩個**待處理證書籤名請求(CSR)。必須確認這些 CSR 已獲得批准,或者在必要時自行批准。
```bash
$ oc get node
NAME STATUS ROLES AGE VERSION
master1.openshift4.example.com Ready master,worker 6h25m v1.17.1
master2.openshift4.example.com Ready master,worker 6h39m v1.17.1
master3.openshift4.example.com Ready master,worker 6h15m v1.17.1
worker1.openshift4.example.com NotReady worker 5h8m v1.17.1
worker2.openshift4.example.com NotReady worker 5h9m v1.17.1
```
輸出列出了建立的所有節點。檢視掛起的證書籤名請求(CSR),並確保新增到叢集的每臺節點都能看到具有 `Pending` 或 `Approved` 狀態的客戶端和服務端請求。針對 Pending 狀態的 CSR 批准請求:
```bash
$ oc adm certificate approve xxx
```
或者執行以下命令批准所有 CSR:
```bash
$ oc get csr -ojson | jq -r '.items[] | select(.status == {} ) | .metadata.name' | xargs oc adm certificate approve
```
### Operator 自動初始化
控制平面初始化後,需要確認所有的 `Operator` 都處於可用的狀態,即確認所有 Operator 的 `Available` 欄位值皆為 `True`:
```bash
$ oc get clusteroperators
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE
authentication 4.4.5 True False False 150m
cloud-credential 4.4.5 True False False 7h7m
cluster-autoscaler 4.4.5 True False False 6h12m
console 4.4.5 True False False 150m
csi-snapshot-controller 4.4.5 True False False 6h13m
dns 4.4.5 True False False 6h37m
etcd 4.4.5 True False False 6h19m
image-registry 4.4.5 True False False 6h12m
ingress 4.4.5 True False False 150m
insights 4.4.5 True False False 6h13m
kube-apiserver 4.4.5 True False False 6h15m
kube-controller-manager 4.4.5 True False False 6h36m
kube-scheduler 4.4.5 True False False 6h36m
kube-storage-version-migrator 4.4.5 True False False 6h36m
machine-api 4.4.5 True False False 6h37m
machine-config 4.4.5 True False False 6h36m
marketplace 4.4.5 True False False 6h12m
monitoring 4.4.5 True False False 6h6m
network 4.4.5 True False False 6h39m
node-tuning 4.4.5 True False False 6h38m
openshift-apiserver 4.4.5 True False False 6h14m
openshift-controller-manager 4.4.5 True False False 6h12m
openshift-samples 4.4.5 True False False 6h11m
operator-lifecycle-manager 4.4.5 True False False 6h37m
operator-lifecycle-manager-catalog 4.4.5 True False False 6h37m
operator-lifecycle-manager-packageserver 4.4.5 True False False 6h15m
service-ca 4.4.5 True False False 6h38m
service-catalog-apiserver 4.4.5 True False False 6h38m
service-catalog-controller-manager 4.4.5 True False False 6h39m
storage 4.4.5 True False False 6h12m
```
如果 Operator 不正常,需要進行問題診斷和修復。
### 完成安裝
最後一步,完成叢集的安裝,執行以下命令:
```bash
$ openshift-install --dir=/ocpinstall wait-for install-complete --log-level=debug
```
注意最後提示訪問 `Web Console` 的網址及使用者密碼。如果密碼忘了也沒關係,可以檢視檔案 `/ocpinstall/auth/kubeadmin-password` 來獲得密碼。
本地訪問 Web Console,需要新增 hosts:
```bash
192.168.57.60 console-openshift-console.apps.openshift4.example.com
192.168.57.60 oauth-openshift.apps.openshift4.example.com
```
瀏覽器訪問 `https://console-openshift-console.apps.openshift4.example.com`,輸入上面輸出的使用者名稱密碼登入。首次登入後會提示:
```bash
You are logged in as a temporary administrative user. Update the Cluster OAuth configuration to allow others to log in.
```
我們可以通過 htpasswd 自定義管理員賬號,步驟如下:
① `htpasswd -c -B -b users.htpasswd admin xxxxx`
② 將 `users.htpasswd` 檔案下載到本地。
③ 在 Web Console 頁面開啟 `Global Configuration`:
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111310023-33232992.png)
然後找到 `OAuth`,點選進入,然後新增 `HTPasswd` 型別的 `Identity Providers`,並上傳 `users.htpasswd` 檔案。
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111310380-999618017.png)
④ 退出當前使用者,注意要退出到如下介面:
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111310732-723508065.png)
選擇 `htpasswd`,然後輸入之前建立的使用者名稱密碼登入。
如果退出後出現的就是使用者密碼輸入視窗,實際還是 `kube:admin` 的校驗,如果未出現如上提示,可以手動輸入 Web Console 地址來自動跳轉。
⑤ 登入後貌似能看到 `Administrator` 選單項,但訪問如 `OAuth Details` 仍然提示:
```bash
oauths.config.openshift.io "cluster" is forbidden: User "admin" cannot get resource "oauths" in API group "config.openshift.io" at the cluster scope
```
因此需要授予叢集管理員許可權:
```bash
$ oc adm policy add-cluster-role-to-user cluster-admin admin
```
Web Console 部分截圖:
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111311039-1350863386.png)
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111311365-2052536350.png)
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111311732-2128816846.png)
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111312089-361410362.png)
如果想刪除預設賬號,可以執行以下命令:
```bash
$ oc -n kube-system delete secrets kubeadmin
```
## 8. 參考資料
+ [OpenShift 4.2 vSphere Install with Static IPs](https://www.openshift.com/blog/openshift-4-2-vsphere-install-with-static-ips)
+ [OpenShift Container Platform 4.3部署實錄](https://blog.csdn.net/scwang18/article/details/104222408)
+ [Chapter 1. Installing on bare metal](https://access.redhat.com/documentation/en-us/openshift_container_platform/4.4/html/installing_on_bare_metal/installing-on-bare-metal)
----
Kubernetes 1.18.2 1.17.5 1.16.9 1.15.12離線安裝包釋出地址http://store.lameleg.com ,歡迎體驗。 使用了最新的sealos v3.3.6版本。 作了主機名解析配置優化,lvscare 掛載/lib/module解決開機啟動ipvs載入問題, 修復lvscare社群netlink與3.10核心不相容問題,sealos生成百年證書等特性。更多特性 https://github.com/fanux/sealos 。歡迎掃描下方的二維碼加入釘釘群 ,釘釘群已經整合sealos的機器人實時可以看到sealos的動態。
![](https://img2020.cnblogs.com/other/1737323/202006/1737323-20200615111312328-469435