本节内容是基于Ansible Playbook自动部署openshift集群,之后几节内容会通过一个AllInOne的集群手动添加组件,研究实现的流程。
本部分内容是适用3.6.1
本部分openshift集群的部署分为以下几个阶段:
- 主机准备。准备openshift集群需要的主机。
- 安装前预配置。准备相应的系统配置与软件依赖。
- 执行安装。使用Ansible Playbook进行自动化安装。
- 安装后配置。添加相应的组件以及修改配置。如导入模板等。
主机准备
类型 | 主机名 | 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
- 启用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
- 在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
配置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官网内容进行编写。
[all]
node2 ansible_host=172.22.156.171 ip=172.22.156.171 ansible_user=root ansible_become=false
node5 ansible_host=172.22.156.172 ip=172.22.156.172 ansible_user=root ansible_become=false
node4 ansible_host=172.22.156.173 ip=172.22.156.173 ansible_user=root ansible_become=false
node3 ansible_host=172.22.156.174 ip=172.22.156.174 ansible_user=root ansible_become=false
node6 ansible_host=172.22.156.175 ip=172.22.156.175 ansible_user=root ansible_become=false
[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=v3.6.1
openshift_image_tag=v3.6.1
openshift_public_hostname=console.demo.com
openshift_master_default_subdomain=apps.demo.com
openshift_hosted_metrics_deploy=true
enable_excluders=false
containerized=True
openshift_master_cluster_method=native
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]
node2
node3
# host group for nodes, includes region info
[nodes]
node2 openshift_schedulable=True openshift_node_labels="{'region': 'infra'}"
node3 openshift_schedulable=True openshift_node_labels="{'region': 'infra'}"
node4 openshift_node_labels="{'region': 'infra', 'zone': 'east'}"
node5 openshift_node_labels="{'region': 'infra', 'zone': 'west'}"
node6 openshift_node_labels="{'region': 'infra', 'zone': 'west'}"
[etcd]
node2
node3
node4
执行安装
# 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,之后的内容会手动部署这些组件进行研究。
删除openshift
ansible-playbook ~/openshift-ansible/playbooks/adoc/uninstall.yml
1. Hosts: node2, node3, node4, node5, node6
Play: Configure nodes
Task: openshift_node_dnsmasq : fail
Message: Currently, NetworkManager must be installed and enabled prior to installation.
1. Hosts: node2, node3, node4, node5, node6
Play: Configure nodes
Task: Install Ceph storage plugin dependencies
Message: Error unpacking rpm package python-urllib3-1.10.2-3.el7.noarch
STDOUT:
Trying to pull repository docker.io/openshift/origin ...
STDERR:
manifest unknown: manifest unknown
Currently, NetworkManager must be installed and enabled prior to installation.
yum install -y NetworkManager
systemctl enable NetworkManager
systemctl start NetworkManger
'htpasswd' is unavailable. Please install httpd-tools on the control node
Failure summary:
STDOUT:
Using default tag: latest
Trying to pull repository registry.access.redhat.com/rhel7/etcd ...
STDERR:
open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory
yum install *rhsm*
Play: Initialize cluster facts
Task: Gather Cluster facts
Message: MODULE FAILURE
2. Hosts: node2
Play: Create etcd server certificates for etcd hosts
Task: Retrieve etcd cert tarball
Message: Unable to create local directories(/tmp/node2/etc/etcd/generated_certs): [Errno 20] Not a directory: '/tmp/node2/etc'
# Ansible和系统自带的urllib3有冲突, 卸载之: Error unpacking rpm package python-urllib3-1.10.2-3.el7.noarch
pip uninstall urllib3 每个节点都要这么做
FAILED - RETRYING: Wait for Node Registration (2 retries left).
FAILED - RETRYING: Wait for Node Registration (2 retries left).
FAILED - RETRYING: Wait for Node Registration (1 retries left).
FAILED - RETRYING: Wait for Node Registration (1 retries left).
FAILED - RETRYING: Wait for Node Registration (1 retries left).
FAILED - RETRYING: Wait for Node Registration (1 retries left).
FAILED - RETRYING: Wait for Node Registration (1 retries left).
fatal: [node5 -> 172.22.156.171]: FAILED! => {
"attempts": 50,
"changed": false,
"results": {
"cmd": "/usr/bin/oc get node node5 -o json -n default",
"results": [
{}
],
"returncode": 0,
"stderr": "Error from server (NotFound): nodes \"node5\" not found\n",
"stdout": ""
},
"state": "list"
}
创建用户
htpasswd -b /etc/origin/master/htpasswd dev dev
以集群管理员登录
oc login -u system:admin
给DEV账号添加集群管理员角色
oc adm policy add-cluster-role-to-user cluster-admin dev
动态增加节点 :playbooks/byo/openshift-node/scaleup.yml
rm -f /etc/sysconfig/docker-storage
echo “DOCKER_STORAGE_OPTIONS= -s overlay” > /etc/sysconfig/docker-storage
[root@node5 ~]# vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
ln -s /usr/libexec/docker/docker-runc-current /usr/local/bin/docker-runc
yum install java-1.8.0-openjdk-headless
每个节点都要装
安装日志分析工具:
ansible-playbook -i ~/openshift-ansible-openshift-ansible-3.6.173.0.81-1/inventory/inventory.cfg -b -v /root/openshift-ansible-openshift-ansible-3.6.173.0.81-1/playbooks/byo/openshift-cluster/openshift-logging.yml