1. 程式人生 > >openshift/origin學習記錄(0)——Ansible安裝多節點openshift叢集

openshift/origin學習記錄(0)——Ansible安裝多節點openshift叢集

本節內容是基於Ansible Playbook自動部署openshift叢集,之後幾節內容會通過一個AllInOne的叢集手動新增元件,研究實現的流程。

本部分內容是3.6.0,可能不適用3.6.1,另外本文寫於2017年9月,最新版本安裝建議參考官方文件。

本部分openshift叢集的部署分為以下幾個階段:

  1. 主機準備。準備openshift叢集需要的主機。
  2. 安裝前預配置。準備相應的系統配置與軟體依賴。
  3. 執行安裝。使用Ansible Playbook進行自動化安裝。
  4. 安裝後配置。新增相應的元件以及修改配置。如匯入模板等。

主機準備

型別 主機名 IP 作業系統 記憶體
Master master.example.com 192.168.121.149 CentOS 7.3 2G
Node node1.example.com 192.168.121.151 CentOS 7.3 2G
Node node2.example.com 192.168.121.152 CentOS 7.3 2G


第一次節點記憶體分配1G,安裝失敗,報錯資訊大致是由於記憶體不足導致的。之後修改每個節點,分配2G記憶體。

安裝前預配置

配置主機名

確實主機名配置正確。如有需要,可採用hostnamectl命令設定主機名。例如:

# hostnamectl set-hostname master.example.com

此外需要保證主機名能夠正確的解析到主機IP。可以通過ping $(hostname)來驗證。

實際生產環境推薦配置相關的域名解析伺服器。

在此直接修改各個節點的/etc/hosts檔案,加上靜態的域名解析。

192.168.121.149 master.example.com
192.168.121.151 node1.example.com 
192.168.121.152 node2.example.com 
  • 開啟SELINUX

官方文件推薦開啟SELINUX,否則會導致安裝失敗。
修改/etc/selinux/config

SELINUX=enforcing
SELINUXTYPE=targeted

啟用網路

我自己主機在安裝的時候就已經激活了網路。
有些參考我部落格的朋友安裝失敗,我幫著解決的時候發現是他們的網路預設沒有啟用,這裡新增一下啟用網路的設定。所有主機都要執行。

# nmcli con show
ens32    77817a17-07cf-4f32-b03b-791730dd248d  802-3-ethernet  ens32   
# nmcli con up ens32
# nmcli con mod ens32 connection.autoconnect yes
# systemctl restart NetworkManager

安裝及配置軟體包

  • 所有的節點下執行以下命令安裝Openshift依賴的軟體包。
# yum install -y wget git net-tools bind-utils iptables-services bridge-utils bash-completion
  • 所有節點安裝docker。
# yum install -y docker

預設情況下,Docker將使用一個檔案作為後端的儲存。生產環境中一般會預留一塊未分配空間的分割槽或未分配空間的硬碟作為Docker的資料儲存區域。這裡先不處理。

  • 配置Docker映象伺服器。

選擇中國科技大學的映象伺服器進行加速。修改/etc/sysconfig/docker檔案,在OPTIONS變數中追加--registry-mirror=https://docker.mirrors.ustc.edu.cn --insecure-registry=172.30.0.0/16
- 所有節點啟動docker。

# systemctl enable docker
# systemctl start docker
  • 啟用EPEL倉庫以安裝Ansible

openshift安裝以Ansible為基礎,需要啟用EPEL倉庫以安裝Ansible。
master節點上執行以下命令。

# yum -y install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm

這裡寫圖片描述

# sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo
# yum -y --enablerepo=epel install ansible pyOpenSSL

我裝的ansible版本是ansible 2.3.2.0,最新ansible版本語法有修改,以下內容可能不適用。
這裡寫圖片描述
- master節點上生成SSH金鑰。

# ssh-keygen -f /root/.ssh/id_rsa -N ''

Ansible是基於Agentless架構實現的,即不需要在遠端的目標主機上預先安裝Agent程式。Ansible對遠端主機命令的執行依賴SSH等遠端控制協議。因為將在Master上執行Ansible Playbook安裝openshift,所以需要配置Master到各個節點的互信,包括Master到Master的互信
在Master節點上執行:

for host in master.example.com node1.example.com node2.example.com; do ssh-copy-id -i ~/.ssh/id_rsa.pub $host;  done

這裡寫圖片描述

# wget https://github.com/openshift/openshift-ansible/archive/openshift-ansible-3.6.173.0.81-1.tar.gz
# tar zxvf openshift-ansible-3.6.173.0.81-1.tar.gz
  • 安裝etcd。

安裝單Master的Openshift叢集可以不單獨安裝etcd。這裡選擇單獨安裝一個節點的etcd叢集。
在實際的生產環境中,推薦配置含有3個或以上成員的etcd叢集,保證高可用性。
在Master上執行。

# yum -y install etcd
# systemctl enable etcd
# systemctl start etcd

配置Ansible

配置Ansible的hosts配置檔案(記錄了Ansible需要操作的目標主機資訊)。

  • 備份原有的hosts檔案
# mv -f /etc/ansible/hosts /etc/ansible/hosts.org
  • 建立/etc/ansible/hosts檔案,新增下面的內容。
# Create an OSEv3 group that contains the masters and nodes groups
[OSEv3:children]
masters
nodes
etcd

# Set variables common for all OSEv3 hosts
[OSEv3:vars]
# SSH user, this user should allow ssh based auth without requiring a password
ansible_ssh_user=root
openshift_deployment_type=origin
openshift_pkg_version=3.6.0
openshift_disable_check=disk_availability,docker_storage,memory_availability,docker_image_availability

# uncomment the following to enable htpasswd authentication; defaults to DenyAllPasswordIdentityProvider
openshift_master_identity_providers=[{'name':'htpasswd_auth','login':'true','challenge':'true','kind':'HTPasswdPasswordIdentityProvider','filename':'/etc/origin/master/htpasswd'}]

# host group for masters
[masters]
master.example.com

# host group for nodes, includes region info
[nodes]
master.example.com openshift_schedulable=True openshift_node_labels="{'region': 'infra'}"
node1.example.com openshift_node_labels="{'zone': 'east'}"
node2.example.com openshift_node_labels="{'zone': 'west'}"

[etcd]
master.example.com    

執行安裝

# ansible-playbook ~/openshift-ansible-openshift-ansible-3.6.173.0.81-1/playbooks/byo/config.yml

安裝過程是完全自動化的,無需手動干預。在絕大多數情況下,Ansible的指令碼Playbook是可以反覆執行的。因為要下載不少內容,整體安裝時間還是比較長的。

如果安裝Openshift的過程中出錯了,修復問題後再次執行Playbook,可以在之前的基礎上繼續安裝
(由於網路波動、記憶體不足等原因,可能需要多次重複執行上述指令)。

安裝過程中,我遇到了disk_availability,docker_storage,memory_availability,docker_image_availability這四個錯誤,修改hosts檔案,選擇了跳過檢查這四項。

disk_availability:報錯資訊是推薦的master磁碟空間剩餘量大於40GB。測試環境無法滿足,跳過檢測。
memory_availability:報錯資訊是推薦的master記憶體為16GB,node記憶體為8GB,測試環境無法滿足,跳過檢測。
docker_image_availability:報錯資訊是需要的幾個映象未找到,選擇跳過,裝完集群后,在使用的時候再自行下載。
docker_storage:報錯資訊是推薦選擇一塊磁碟空間儲存映象,這裡選擇跳過。採用docker預設的方式儲存映象。

安裝完成後,Ansible會輸出一個結果彙總資訊,從彙總資訊可以判斷安裝的執行結果。
這裡寫圖片描述

(前前後後大概裝了快倆小時,重複執行了指令多次。)網路狀況良好的情況下耗時半小時左右。

安裝完成後,執行oc get nodes檢查當前叢集的成員列表以及它們的狀態。

這裡寫圖片描述

當前叢集有三個節點,都處於Ready狀態。Master多一個SchedulingDisabled的狀態,意味著Master節點不承擔執行容器的任務。

執行oc whoami可以看到當前是以管理員的許可權登入的叢集。
執行oc get all -o wide。檢視資源列表。

這裡寫圖片描述

可以看出registry、router都在部署中。但有報錯,使用oc describe指令檢視pod日誌。

這裡寫圖片描述

發現都是沒有節點匹配導致的錯誤。官網的hosts例子有給節點打標籤。之前不明打標籤的原因,刪掉了此部分,導致此服務部署出錯。

在多節點的叢集部署Router元件需要注意預先規劃好Router執行的目標節點。Router元件是以容器的形式執行在Openshift平臺上的。Openshift平臺上所有指向具體應用的域名最終都要指向Router所在Node的IP地址。如果無法確定Router所在的Node節點,就無法建立相關的域名解析。

這裡因為已經安裝完成,故選擇手動給node1打上標籤。

# oc label node node1.com region=infra

因為之前的安裝禁用了docker_image_availability,這裡會下載openshift需要的映象檔案,映象檔案較大,需要下載一段時間。已修改此部分上面的hosts內容。建議手動pull,不然因為網路原因,這裡容易出錯。

這裡寫圖片描述

等映象檔案下載完成之後。瀏覽器訪問https://192.168.121.149:8443即可檢視openshift的web console。

驗證etcd叢集

etcdctl --ca-file=/etc/etcd/ca.crt --cert-file=/etc/etcd/peer.crt --key-file=/etc/etcd/peer.key --endpoints=https://10.126.3.210:2379 cluster-health
etcdctl --ca-file=/etc/etcd/ca.crt --cert-file=/etc/etcd/peer.crt --key-file=/etc/etcd/peer.key --endpoints=https://10.126.3.210:2379 member list

安裝後的配置

對接使用者身份資訊庫

安裝的時候,在Ansible的hosts檔案中定義了HTPasswd檔案作為後端的使用者身份資訊庫。

安裝程式自動生成了資料檔案/etc/origin/master/htpasswd。但是此時該檔案還是一個空檔案,並沒有任何使用者資訊。

需要通過htpasswd命令來建立使用者。建立賬號為dev密碼為dev的使用者。

# [root@master ~]# htpasswd -b /etc/origin/master/htpasswd dev dev

檢視/etc/origin/master/htpasswd檔案內容。以加密的形式儲存了賬號密碼。

dev:$apr1$DH.7689R$g6azQwmLcSnK1MlrpEEnx0

給dev新增叢集管理員許可權

# oc login -u system:admin
# oc adm policy add-cluster-role-to-user cluster-admin dev

其他配置

Ansible安裝模式下,已自動的匯入了Image Stream、Template、Router和Registry,之後的內容會手動部署這些元件進行研究。