本节内容是基于Ansible Playbook自动部署openshift集群,之后几节内容会通过一个AllInOne的集群手动添加组件,研究实现的流程。
本部分内容是3.6.0,可能不适用3.6.1
本部分openshift集群的部署分为以下几个阶段:
类型 | 主机名 | IP | 操作系统 | CPU |
---|---|---|---|---|
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,否则会导致安装失败。 修改/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
# yum install -y wget git net-tools bind-utils iptables-services bridge-utils bash-completion
# yum install -y 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
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
# 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
安装单Master的Openshift集群可以不单独安装etcd。这里选择单独安装一个节点的etcd集群。 在实际的生产环境中,推荐配置含有3个或以上成员的etcd集群,保证高可用性。 在Master上执行。
# yum -y install etcd
# systemctl enable etcd
# systemctl start etcd
配置Ansible的hosts配置文件(记录了Ansible需要操作的目标主机信息)。
# mv -f /etc/ansible/hosts /etc/ansible/hosts.org
可参考https://docs.openshift.org/latest/install_config/install/advanced_install.html官网内容进行编写。
# 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_release=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="{'region': 'infra', 'zone': 'east'}"
node2.example.com openshift_node_labels="{'region': 'infra', '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。
安装的时候,在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,之后的内容会手动部署这些组件进行研究。