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

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

本部分内容是3.6.0,可能不适用3.6.1

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

  1. 主机准备。准备openshift集群需要的主机。
  2. 安装前预配置。准备相应的系统配置与软件依赖。
  3. 执行安装。使用Ansible Playbook进行自动化安装。
  4. 安装后配置。添加相应的组件以及修改配置。如导入模板等。

主机准备

类型

主机名

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

官方文档推荐开启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
  • 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文件,添加下面的内容。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

使用密码记录工具keepass来保存密码

在第一章,曾经给过您建议,密码不要保存在文档中,那样不安全,如果密码很多而且又很复杂,人的大脑是不可能很容易记住的,只能记录下来,如果不能记在文档中那记在哪里呢...

46290
来自专栏Jerry的SAP技术分享

将Java应用部署到SAP云平台neo环境的两种方式

Eclipse里选择要部署的项目,右键->Run as Server, 选择上一步创建的Server即完成部署。

23020
来自专栏十月梦想

node读取html文件

node和Apache是没有web容器的,node的目录下的同级文件是无法使用/filename进行访问的,因为node没有根目录门也没用web容器!

20620
来自专栏编程

Windows下PHP环境搭建——WAMP分享

01 导语 学习一门语言,就得从搭建开发环境开始。PHP学习者时常会接触到一个词WAMP,那么WAMP是什么意思呢?Windows系统下的Apache+Mysq...

73180
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

前言   前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识!   主要是些基础的东西...   如何去创建...

36070
来自专栏Java帮帮-微信公众号-技术文章全总结

RocketMQ入门案例【面试+工作】

79330
来自专栏后端技术探索

nginx 授权资源跨站访问

最近一h5前端同事反馈说某个字体库连接(类似于http://www.example.com/test.ttf)无法访问。

11120
来自专栏游戏杂谈

React-Native android在windows下的踩坑记

你需要先安装最新版本的node.js(我最后使用的是v4.1.2),前往官网下载>>

12230
来自专栏Youngxj

emlog插件微信推送最新文章

31920
来自专栏DeveWork

WordPress 开发之让浏览器自动加载最新的CSS、JS文件(免刷新缓存)

在开发WordPress 主题的时候,如果频繁更新主题的CSS、JS文件但主题已经上线,如何让访客的浏览器获取最新的CSS、JS文件而非等到浏览器删除缓存后?下...

26680

扫码关注云+社区

领取腾讯云代金券