安裝前的准備
最低系統要求
1. master最低要求
- 最小4 vCPU
- 最小16 GB RAM
- /var/最小40 GB硬盤空間
- /usr/local/bin/最小1 GB硬盤空間
- 臨時目錄最小1 GB硬盤空間
2. node最低要求
- 1 vCPU
- 最小8 GB RAM
- /var/最小15 GB硬盤空間
- /usr/local/bin/最小1 GB硬盤空間
- 臨時目錄最小1 GB硬盤空間
3. 磁盤要求
- /var/lib/etcd Less than 20 GB
- /var/lib/docker 50GB
- /var/lib/containers 50GB
這是openshift官方給出的最小要求,也是openshift-ansible檢測環境時的最小要求,實際上,我們的實驗環境滿足不了最小要求,但仍然可以安裝。但是需要我們在做openshift-ansible的配置預檢時忽略這些檢查
實驗環境說明
主機名 | 角色 |
---|---|
master1.example.com | master, etcd |
node1.example.com | node |
node2.example.com | node |
軟件環境說明:
- RHEL/CentOS 7.x
- Ansible 2.6.14
- openshift: OKD 3.11
- docker: 1.13
- kubernetes: 1.11
預配置
1. 配置yum源
# 包含CentOS 7和epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2. 安裝基礎環境依賴包
yum install -y wget git net-tools bind-utils yum-utils iptables-services bridge-utils bash-completion kexec-tools sos psacct
# 安裝NetworkManager,openshift在配置dns時需要依賴NetworkManager
yum install -y NetworkManager
systemctl start NetworkManager
3. 安裝docker
yum install -y docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://o0o4czij.mirror.aliyuncs.com"]
}
systemctl start docker
systemctl enable docker
當前官方宣稱openshift v3.11只支持docker 1.13(事實上,在我的測試當中docker-ce也能用),為避免不必要的麻煩,這里直接使用docker 1.13版本
安裝openshift
1. 安裝openshift-ansible
yum install -y centos-release-openshift-origin311
yum install -y openshift-ansible*
2. 關閉selinux檢查
openshift-ansible的代碼中,強制開啟了針對selinux的檢查,要求其必須開啟,否則安裝報錯。而事實上,在生產環境中,selinux基本都是關閉的,這里通過修改其源代碼以忽略針對selinux的檢查:
# vim /usr/share/ansible/openshift-ansible/roles/openshift_node/tasks/selinux_container_cgroup.yml
- name: Setting sebool container_manage_cgroup
seboolean:
name: container_manage_cgroup
state: yes
persistent: yes
when:
ansible_selinux.status == 'enabled'
3. 修改openshift-ansible代碼中使用的yum源為國內源
cd /usr/share/ansible/openshift-ansible
grep -nr mirror.centos.org * | awk -F':' '{print $1}' | xargs sed -i 's/mirror.centos.org/mirrors.aliyun.com/g'
4. 配置inventory
vim /etc/ansible/hosts
[OSEv3:children]
masters
nodes
etcd
new_nodes
new_masters
new_etcd
nfs
[OSEv3:vars]
# if your target hosts are Fedora uncomment this
#ansible_python_interpreter=/usr/bin/python3
ansible_ssh_user=root
openshift_deployment_type=origin
openshift_image_tag=v3.11
#openshift_portal_net=172.30.0.0/16
# localhost likely doesn't meet the minimum requirements
#openshift_disable_check=disk_availability,memory_availability,docker_image_availability
#openshift_node_groups=[{'name': 'node-config-all-in-one', 'labels': ['node-role.kubernetes.io/master=true', 'node-role.kubernetes.io/infra=true', 'node-role.kubernetes.io/compute=true']}]
openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider'}]
#openshift_master_htpasswd_file=/root/openshift-passwd
openshift_disable_check=disk_availability,memory_availability,docker_image_availability,docker_storage
openshift_master_api_port = 443
openshift_master_console_port = 443
#os_sdn_network_plugin_name=redhat/openshift-ovs-multitenant
os_sd_network_plugin_name=redhat/openshift-ovs-subnet
#deployment_subtype=registry
#openshift_hosted_infra_selector=""
openshift_hosted_router_replicas=1
openshift_hosted_registry_replicas=1
#
openshift_master_cluster_hostname=master.lab.example.com
openshift_master_cluster_public_hostname=master.lab.example.com
openshift_master_default_subdomain=apps.lab.example.com
openshift_enable_service_catalog=false
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_hosted_etcd_storage_kind = nfs
#openshift_hosted_etcd_storage_nfs_options = '*(rw,root_squash,sync,no_wdelay)'
#openshift_hosted_etcd_storage_nfs_directory = /exports
#openshift_hosted_etcd_storage_volume_name = etcd-vol2
#openshift_hosted_etcd_storage_access_modes = ['ReadWriteOnce']
#openshift_hosted_etcd_storage_volume_size = 1G
#openshift_hosted_etcd_storage_labels={'storage': 'etcd'}
#openshift_master_cluster_method=native
#openshift_public_ip=192.168.0.157
# false
#ansible_service_broker_install=false
#openshift_enable_service_catalog=false
#template_service_broker_install=false
#openshift_logging_install_logging=false
#openshift_docker_options="--log-driver json-file --log-opt max-size=1M --log-opt max-file=3 --exec-opts native.cgroupdriver=systemd"
[masters]
192.168.0.43
[etcd]
192.168.0.43
[nfs]
192.168.0.43
[nodes]
# openshift_node_group_name should refer to a dictionary with matching key of name in list openshift_node_groups.
192.168.0.43 openshift_node_group_name="node-config-all-in-one"
192.168.0.157 openshift_node_group_name="node-config-all-in-one"
192.168.0.187 openshift_node_group_name="node-config-master-infra"
[new_nodes]
[new_masters]
[new_etcd]
一些配置項說明:
openshift_deployment_type
: 指定openshift的版本,openshift同時有開源版和商業版,這里的origin即開源版openshift_image_tag
:指定使用的openshift的版本openshift_master_identity_providers
:指定openshift的認證方式openshift_disable_check
:openshift-ansible在執行安裝時會對系統做預檢,這里可以指定預檢時跳過的檢查項:- disk_availability:推薦master磁盤空間剩余量大於40GB。測試環境無法滿足,跳過檢測。
- memory_availability:推薦master內存為16GB,node內存為8GB,測試環境無法滿足,跳過檢測。
- docker_image_availability:需要的幾個鏡像未找到,選擇跳過,裝完集群后,在使用的時候再自行下載。
- docker_storage:推薦選擇一塊磁盤空間存儲鏡像,這里選擇跳過。采用docker默認的方式存儲鏡像。
事實上,部署前預檢查配置還有專門的配置檢查腳本:
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml
5. 執行部署
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
至此,部署完成
6. 卸載
如果安裝后需要卸載,可執行如下操作:
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/adhoc/uninstall.yml
7. 訪問
可通過兩種方式訪問openshift集群,一個是命令行,即oc命令集,如下:
# 查看當前集群中的節點
oc get nodes
# 查看當前集群默認項目下的pod
oc get pods
如果通過oc命令操作無權限,則需要將master節點上/etc/origin/master目錄下的admin.kubeconfig文件拷貝至用戶家目錄下的一個隱藏目錄.kube目錄下,並命名為config:
mkdir ~/.kube
cp /etc/origin/master/admin.kubeconfig ~/.kube/config
另一種則可通過openshift提供的強大的圖形界面功能:
curl https://master1.example.com:8443/console
這個時候,需要通過帳號密碼登錄,但我們剛安裝好的openshift默認沒有帳號密碼。所以如果需要登錄圖形界面,需要先添加相關帳號。
openshift使用/etc/origin/master/htpasswd文件來保存帳號密碼,下面我們創建一個超級管理員帳號:
# 創建admin用戶
htpasswd -m /etc/origin/master/htpasswd admin
# 為用戶授予超級管理員權限
oc adm policy add-cluster-role-to-user cluster-admin admin
然后即可通過該帳號登入web界面
注意事項及常見故障
注意事項
- 操作系統語言不能為中文
- lb節點和router節點不能放一塊(即infra節點不能同時部署router和lb,因為它們都會占據80端口),同理,lb不要和master放一塊
- 需要開啟networkmanager,openshift基於此配置網絡
- openshift-ansible也要求開啟selinux,但可通過修改其源代碼關閉此項檢查
- 確保master節點和node節點能夠聯網(需要從互聯網下載軟件包及拉取鏡像)
- 生產環境中,建議etcd和master放同一節點,或者獨立部署,不建議又放master節點又放node節點(從openshift 4.1開始,強制要求etcd和master部署在同一節點)
其他安裝說明
在我們的實驗環境中,使用了單master單etcd節點,事實上,在生產環境中,推薦使用至少三master三etcd的配置。那么針對不同的集群部署方案,/etc/ansible/hosts的配置也有相應區別。具體可參考紅帽官方文檔
另外還需要說明的是,openshift的所有組件的部署其實都是基於容器的方式部署,而容器鏡像都來自docker官方,所以需要確保網絡的連通性和穩定性。好在當前國內有眾多的加速器可用。
常見錯誤
在安裝openshift-service-catalog時大概率失敗,在失敗后,打出的日志中顯示etcd無法連接,在node節點上拿不到連接etcd的證書,錯誤忘記復制,在這里就不貼了。
直接說原因,因為這個證書只在主節點上存在,這一點確實很奇怪,至於什么原因,暫時不明,一個簡單的解決辦法是從主節點上直接復制etcd證書至所有node節點:
scp master:/etc/origin/master/master.etcd-c* node:/etc/origin/master/
當然也可以直接選擇不安裝openshift-service-catalog組件,在inventory中添加如下配置項即可:
openshift_enable_service_catalog=false
附錄
參考: