openshift/origin学习记录(0)——Ansible安装多节点openshift集群,ansibleopenshift


本节内容是基于Ansible Playbook自动部署openshift集群,之后几节内容会通过一个AllInOne的集群手动添加组件,研究实现的流程。

本部分内容是3.6.0,可能不适用3.6.1,另外本文写于2017年9月,最新版本安装建议参考官方文档。

新更新了一篇3.10.0的安装博客,链接https://blog.csdn.net/huqigang/article/details/82351972。

本部分openshift集群的部署分为以下几个阶段:

主机准备

类型 主机名 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

  • 在Master节点上下载Openshift的Ansible Playbook(预定义好的一组Ansible执行逻辑)。
    wget https://github.com/openshift/openshift-ansible/archive/openshift-ansible-3.7.0-0.126.0.tar.gz
    tar zxvf openshift-ansible-3.7.0-0.126.0.tar.gz
# 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文件,添加下面的内容。

可参考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_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,之后的内容会手动部署这些组件进行研究。

相关内容

    暂无相关文章