openshift/origin学习记录——Ansible安装多节点openshift集群
2018-03-07 13:13
811 查看
本节内容是基于Ansible Playbook自动部署openshift集群,之后几节内容会通过一个AllInOne的集群手动添加组件,研究实现的流程。本部分内容是适用3.6.1本部分openshift集群的部署分为以下几个阶段:主机准备。准备openshift集群需要的主机。
安装前预配置。准备相应的系统配置与软件依赖。
执行安装。使用Ansible Playbook进行自动化安装。
安装后配置。添加相应的组件以及修改配置。如导入模板等。
第一次节点内存分配1G,安装失败,报错信息大致是由于内存不足导致的。之后修改每个节点,分配2G内存。
官方文档推荐开启SELINUX,否则会导致安装失败。
修改/etc/selinux/config
有些参考我博客的朋友安装失败,我帮着解决的时候发现是他们的网络默认没有激活,这里添加一下激活网络的设置。所有主机都要执行。
启用EPEL仓库以安装Ansible
openshift安装以Ansible为基础,需要启用EPEL仓库以安装Ansible。
在master节点上执行以下命令。
Ansible是基于Agentless架构实现的,即不需要在远程的目标主机上预先安装Agent程序。Ansible对远程主机命令的执行依赖SSH等远程控制协议。因为将在Master上执行Ansible Playbook安装openshift,所以需要配置Master到各个节点的互信,包括Master到Master的互信。
在Master节点上执行:
在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
创建/etc/ansible/hosts文件,添加下面的内容。
可参考https://docs.openshift.org/latest/install_config/install/advanced_install.html官网内容进行编写。
安装过程是完全自动化的,无需手动干预。在绝大多数情况下,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打上标签。
因为之前的安装禁用了docker_image_availability,这里会下载openshift需要的镜像文件,镜像文件较大,需要下载一段时间。已修改此部分上面的hosts内容。建议手动pull,不然因为网络原因,这里容易出错。
等镜像文件下载完成之后。浏览器访问https://192.168.121.149:8443即可查看openshift的web console。验证etcd集群
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
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*
1. Hosts: node3, node4, node5, node6
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'FAILED - RETRYING: Wait for Node Registration (2 retries left).
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
安装前预配置。准备相应的系统配置与软件依赖。
执行安装。使用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 |
安装前预配置
配置主机名
确实主机名配置正确。如有需要,可采用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[/code]
# sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo # yum -y --enablerepo=epel install ansible pyOpenSSLmaster节点上生成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,之后的内容会手动部署这些组件进行研究。删除openshiftansible-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
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*
1. Hosts: node3, node4, node5, node6
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
相关文章推荐
- openshift/origin学习记录(0)——Ansible安装多节点openshift集群
- openshift/origin学习记录(8)——基于镜像安装多节点集群(Containerized Installer)
- openshift/origin学习记录(13)——集群节点扩容(Master/node/etcd)
- openshift/origin学习记录(6)——集群节点管理
- openshift/origin学习记录(12)——离线安装集群
- openshift/origin学习记录(11)——赋予用户集群管理员权限
- openshift/origin学习记录(1)——基于二进制文件的安装(单机版)
- ansible学习记录之ansible安装
- elasticsearch 2.4.6 集群+kibana 4.6安装部署学习记录
- openshift/origin学习记录(4)——添加Image Stream
- openshift/origin学习记录(5)——添加Template(模板)并基于模板部署应用
- Hadoop学习记录(5)|集群搭建|节点动态添加删除
- openshift/origin学习记录(7)——集成Jenkins服务
- openshift/origin学习记录(3)——添加Registry
- openshift/origin学习记录(10)——基于已有镜像部署应用
- zookeeper学习记录-04 Zookeeper安装(linux系统,伪集群)
- kubernetes学习记录(2)——基于Centos7.2的kubernetes集群自动安装与配置
- 高可用mongodb集群的学习记录(一安装配置MongoDB)
- openshift/origin工作记录(5)——node节点系统资源预留
- Hadoop笔记之一:安装单节点集群