參考官方文檔https://docs.okd.io/3.10/install/index.html,基於Ansible安裝3.10版openshift集羣。openshift origin已改名爲openshift OKD。
特注:本文僅供初學者參考!生產環境請結合實際並參照官方文檔!
遇到的坑以及未完善的地方總結
由於我是在自己筆記本上建了兩臺虛機,資源有限,這裏就拿雙節點模擬一下集羣,其中master節點也是計算節點、infra節點,運行etcd和nfs。node節點運行etcd和lb。
官網推薦使用GlusterFS作爲存儲,我直接用的nfs。有關GlusterFS作爲存儲的做法,官網寫的很清楚,想用GlusterFS可以參考官網https://docs.okd.io/3.10/install/configuring_inventory_file.html#advanced-install-glusterfs-persistent-storage。
如果lb和master在一個節點上,會有8443端口已被佔用的問題,嘗試在Inventory文件中修改API 8443端口爲3443端口,安裝還是有問題,故選擇把lb不放在master節點上。建議安裝時lb不要放在master節點上
如果etcd放在master節點上,會以靜態pod形式啓動。如果放在node節點上,會以系統服務的形式啓動。我在安裝過程中,一個etcd放在了master上,另一個放在了node上,導致etcd啓動失敗。解決方案是在master節點上yum安裝了一個etcd(這個etcd實際並沒有使用,不確定是否是這個原因解決了),最終仍是以靜態pod起的etcd。建議安裝時etcd要麼全放在master節點上,要麼全放在node節點上。
我在安裝過程中,直接安裝了帶有nfs持久存儲的監控,需要提前安裝java-1.8.0-openjdk-headless python-passlib,這一點官網沒有提及,不提前裝安裝會報錯。
系統與環境要求
系統要求
以下部分確定了集羣所有主機的硬件規格和系統級要求。
master系統要求
- 最低操作系統版本:Fedora 21、CentOS 7.4、RHEL 7.4、RHEL Atomic Host 7.4.5。
- 最低4 vCPU。
- 最小16GB RAM。
- 包含/var/的文件系統最小40GB硬盤空間。
- 包含/usr/local/bin/的文件系統最小1GB硬盤空間。
- 包含系統臨時目錄的文件系統最小1GB硬盤空間。
Etcd和Master在同一節點的,需要至少4核,2核系統將無法工作。
node系統要求
- 最低操作系統版本:Fedora 21、CentOS 7.4、RHEL 7.4、RHEL Atomic Host 7.4.5。
- NetworkManager 1.0或更新。
- 最低1 vCPU。
- 最小8GB RAM。
- 包含/var/的文件系統最小15GB硬盤空間。
- 包含/usr/local/bin/的文件系統最小1GB硬盤空間。
- 包含系統臨時目錄的文件系統最小1GB硬盤空間。
- 額外至少15GB未分配空間,用於Docker存儲。
etcd系統要求
- 最小20GB硬盤空間存儲etcd數據。
SELinux要求
在安裝OKD之前,必須在所有服務器上啓用SELinux,否則安裝程序將失敗。
/etc/selinux/config配置如下:
環境要求
DNS要求
在每臺主機的/etc/hosts文件中添加條目是不夠的。此文件不會被複制到平臺上運行的容器中。建議配置單獨的DNS服務器。
- 默認情況下,容器從其所在主機接收DNS配置文件(/etc/resolv.conf)。
- 然後,OKD將pod的第一個nameserver設置爲主機節點的IP地址。
從OKD 1.2開始,所有Master和node上會自動配置dnsmasq。pod使用所在主機節點作爲DNS,主機節點轉發請求。默認情況下, 在主機節點上配置dnsmasq(端口53),因此主機節點無法運行任何其他類型的DNS應用程序。
節點需要安裝NetworkManager。
NM_CONTROLLED 默認設置爲yes,如果設置爲no,則NetworkManager調度腳本不會創建相關的origin-upstream-dns.conf文件,需要手動配置dnsmasq。
配置主機使用DNS
主機DNS解析的配置取決於是否啓用了DHCP。
- 如果禁用了DHCP,設置靜態IP,並將DNS nameservers添加到NetworkManager。
- 如果啓用了DHCP,NetworkManager調度腳本會根據DHCP配置自動配置DNS。
我的主機都是靜態IP。禁用了DHCP。
這裏,我暫時選用的是在每臺主機節點上修改/etc/hosts文件。
安裝規劃
個人電腦資源有限,這裏採用雙節點集羣(基於Centos7.4的虛擬機),具體分配如下。
類型 | 主機名 | IP | 操作系統 | 內存 |
---|---|---|---|---|
master,node,etcd,nfs | master1.example.com | 192.168.121.195 | CentOS 7.4 | 4G |
node,etcd,lb | node1.example.com | 192.168.121.196 | CentOS 7.4 | 2G |
我是因爲筆記本資源不夠,所以做了妥協,拿雙節點做了模擬,官網的示例主機分配如下。
可以看出官網的示例中,etcd要麼全部放在master節點上,要麼全部沒放在master節點上
主機準備
主機互信
在將調用安裝過程的主機上生成SSH密鑰:
# ssh-keygen
一直按回車。
分發SSH密鑰。
# for host in master1.example.com node1.example.com ; do ssh-copy-id -i ~/.ssh/id_rsa.pub $host; done
安裝基礎包
每臺主機上都執行:
# yum install -y wget git net-tools bind-utils yum-utils iptables-services bridge-utils bash-completion kexec-tools sos psacct java-1.8.0-openjdk-headless python-passlib
安裝Ansible
在將調用安裝過程的主機上執行:
- 安裝EPEL存儲庫:
# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
- 全局禁用EPEL存儲庫,以便在以後的安裝步驟中不會意外使用它:
# sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo
- 安裝Ansible包:
# yum -y --enablerepo=epel install ansible pyOpenSSL
- 從GitHub 克隆openshift / openshift-ansible存儲庫,它提供所需的playbooks和配置文件
# cd ~
# git clone https://github.com/openshift/openshift-ansible
# cd openshift-ansible
# git checkout release-3.10
安裝Docker
手動安裝,可以在安裝OKD之前配置Docker存儲選項。
每臺主機上執行:
# yum install -y docker-1.13.1
驗證:
此時docker還未啓動,需要配置docker存儲之後再啓動docker。
docker存儲配置
關於這一塊可以參考官方文檔https://docs.okd.io/3.10/install/host_preparation.html#configuring-docker-storage,選擇適合自己的存儲方式。
由於我是自己電腦創建的虛擬機,這裏選用的是掛載一塊新的硬盤作爲docker存儲。
- 配置Docker鏡像服務器。
選擇中國科技大學的鏡像服務器進行加速。修改/etc/sysconfig/docker文件,在OPTIONS變量中追加--registry-mirror=https://docker.mirrors.ustc.edu.cn
。
啓動docker
# systemctl enable docker
# systemctl start docker
# systemctl is-active docker
編寫Inventory文件
# mv -f /etc/ansible/hosts /etc/ansible/hosts.org
# vim /etc/ansible/hosts
[OSEv3:children]
masters
nodes
etcd
lb
nfs
[OSEv3:vars]
openshift_deployment_type=origin
ansible_ssh_user=root
openshift_enable_unsupported_configurations=True
openshift_hosted_registry_storage_kind=nfs
openshift_hosted_registry_storage_access_modes=['ReadWriteMany']
openshift_hosted_registry_storage_nfs_directory=/exports
openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)'
openshift_hosted_registry_storage_volume_name=registry
openshift_hosted_registry_storage_volume_size=10Gi
openshift_metrics_install_metrics=true
openshift_metrics_hawkular_hostname=hawkular-metrics.example.com
openshift_metrics_storage_kind=nfs
openshift_metrics_storage_access_modes=['ReadWriteOnce']
openshift_metrics_storage_nfs_directory=/exports
openshift_metrics_storage_nfs_options='*(rw,root_squash)'
openshift_metrics_storage_volume_name=metrics
openshift_metrics_storage_volume_size=10Gi
openshift_ca_cert_expire_days=3650
openshift_node_cert_expire_days=3650
openshift_master_cert_expire_days=3650
etcd_ca_default_days=3650
openshift_enable_service_catalog=false
template_service_broker_install=false
ansible_service_broker_install=false
debug_level=4
openshift_clock_enabled=true
openshift_master_cluster_method=native
openshift_master_cluster_hostname=node1.example.com
openshift_master_cluster_public_hostname=node1.example.com
openshift_pkg_version=-3.10.0
openshift_disable_check=disk_availability,docker_storage,memory_availability,docker_image_availability
os_sdn_network_plugin_name=redhat/openshift-ovs-multitenant
openshift_master_identity_providers=[{'name': 'htpasswd_auth','login': 'true', 'challenge': 'true','kind': 'HTPasswdPasswordIdentityProvider'}]
[nfs]
master1.example.com
[masters]
master1.example.com
[lb]
node1.example.com
[nodes]
master1.example.com openshift_schedulable=True openshift_node_group_name='node-config-all-in-one'
node1.example.com openshift_node_group_name='node-config-compute'
[etcd]
master1.example.com
node1.example.com
安裝集羣
注意調整以下命令中的文件路徑,以滿足自己的要求。
# ansible-playbook -i /etc/ansible/hosts ~/openshift-ansible/playbooks/prerequisites.yml
# ansible-playbook -i /etc/ansible/hosts ~/openshift-ansible/playbooks/deploy_cluster.yml
安裝完成之後可以查看pod的狀態。
圖中運行失敗的幾個pod,一部分是監控的pod,因爲我沒有提前下載鏡像導致啓動失敗,還有一個是openshift鏡像庫的web界面,失敗原因大體相同,因爲電腦太卡,這部分坑就不填了。影響不大。