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


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

本部分内容是适用3.6.1

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

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

主机准备

类型主机名IP操作系统内存
Mastermaster.example.com192.168.121.149CentOS 7.32G
Nodenode1.example.com192.168.121.151CentOS 7.32G
Nodenode2.example.com192.168.121.152CentOS 7.32G


第一次节点内存分配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*

  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

相关内容

    暂无相关文章