说明:本篇主要是基于最新的openshift3.9进行的集群安装,安装环境是虚拟机,在本地通过VirtualBox安装centos7.5虚拟机,准备了3台虚拟机,一台作为master,另外两台slave。通过这种方式模拟实际服务器的集群搭建openshift
特别注意 搭建的前提是:虚拟机和主机互通,虚拟机之间互通,虚拟机可上外网,主机可上外网;可参考我的博文:
VirtualBox 虚拟机和宿主机之间的网络连接,虚拟机和主机都可以上网
安装过程分为5部分:
- 集群主从机环境准备
- 安装依赖包,提前安装使用Ansible安装OpenShift集群所依赖的第三方包
- Ansible执行安装:使用Ansible Playbook进行自动化安装
- OpenShift系统配置:在使用Ansible执行安装完成之后的系统配置。
- 测试问题处理
一、环境准备
类型 | IP地址 | 操作系统 | 内存 | 硬盘 |
master | 192.168.10.179 | centos7.5 | 2G | 20G |
node1 | 192.168.10.142 | centos7.5 | 2G | 20G |
node2 | 192.168.10.47 | centos7.5 | 2G | 20G |
为了在安装的时候方便修改所有主机host文件:
vi /etc/hosts
保存退出,并且重启所有主机,这时会发现连接名称已经变了,这样方便了解当前的主机
- 所有主机开启SELINUX
vi /etc/selinux/config
官方文档推荐开启SELINUX,否则会导致安装失败
- 配置所有主机ssh免密访问
在所有节点上以root账号登陆,并进入到/root的主目录 在所有节点上生成密钥对
ssh-keygen -t rsa
一路按回车即可
所有主机执行以下命令
cd ~/.ssh
然后执行以下命令共享ssh免密登陆密钥:注意逐条执行
ssh-copy-id master
ssh-copy-id node1
ssh-copy-id node2
验证:
验证结果:master不用密码可以直接ssh到node1,根据以上实例验证所有主机之间的ssh免密登陆,确保所有主机之间ssh不需要密码再进行以下步骤
二、安装依赖包
- 所有主机执行更新操作
yum install -y update
若有更新,则等待更新完后重启系统生效!
- 所有的主机下执行以下命令安装OpenShift依赖的软件包。
yum install wget git net-tools bind-utils iptables-services bridge-utils bash-completion kexec-tools sos psacct bash-completion.noarch bash-completion-extras.noarch python-passlib NetworkManager -y
- 所有主机安装docker:
yum install docker-1.13.1 -y
- 配置docker使用的存储
echo DEVS=/dev/sdb > /etc/sysconfig/docker-storage-setup
echo VG=DOCKER >> /etc/sysconfig/docker-storage-setup
echo SETUP_LVM_THIN_POOL=yes >> /etc/sysconfig/docker-storage-setup
echo DATA_SIZE="100%FREE">> /etc/sysconfig/docker-storage-setup
rm -rf /var/lib/docker
wipefs --all /dev/sdb
docker-storage-setup
- 添加阿里云镜像加速器
登陆阿里云,没有的自己可以注册 ,进行加速器页面https://cr.console.aliyun.com/#/accelerator,如下操作
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{ "registry-mirrors": ["https://03l3dkhb.mirror.aliyuncs.com"],
"insecure-registries": ["172.30.0.0/16"]
} EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
启动docker
systemctl enable docker
systemctl start docker
启用EPEL仓库以安装Ansible、Master主机上执行Ansible集群安装
yum -y install epel-release
- 全局禁用EPEL存储库,以便在以后的安装步骤中不会意外使用它:
sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo
下载ansible2.5版本,因为3.9对应的ansible版本必须是2.5
下载地址:https://releases.ansible.com/ansible
下载后解压到 /home/ansible中
执行安装
cd ansible-2.5.5
python setup.py install
执行:
yum -y --enablerepo=epel install ansible pyOpenSSL
说明 #opshift3.9 必须匹配 ansible2.5版本
输入:
ansible --version
cd /home/openshift
获取3.9版本的openshift-ansible:
wget https://github.com/openshift/openshift-ansible/archive/openshift-ansible-3.9.32-1.tar.gz
解压:
tar -xvzf openshift-ansible-3.9.32-1.tar.gz
重命名:
mv openshift-ansible-openshift-ansible-3.9.32-1 openshift-ansible
由于目前OpenShift-ansible还没有添加3.9的源,所以需要自行修改下,方法如下:
进行openshift-ansible/roles/openshift_repos/templates/ 复制一份 CentOS-OpenShift-Origin37.repo.j2 为 CentOS-OpenShift-Origin39.repo.j2。
修改CentOS-OpenShift-Origin39.repo.j2中的源修改为国内的,比如阿里云。
进入openshift-ansible/roles/openshift_repos/templates/ 修改CentOS-OpenShift-Origin9.repo.j2 中的源修改为国内的,比如阿里云。
编写Inventory文件
- 新建 ansible inventory 文件,保存到 /etc/ansible/inventory.ini文件中,内容如下:
# 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
#使用origin社区版
openshift_deployment_type=origin
#指定安装版本
openshift_release=3.9
#openshift_node_group_name= master
#指定默认域名,访问的时候需要使用该域名,没有dns服务器,需要手动添加本地hosts文件
openshift_master_default_subdomain=master
#禁止磁盘、内存和镜像检查
openshift_disable_check=disk_availability,docker_storage,memory_availability,docker_image_availability
#disk_availability:报错信息是推荐的master磁盘空间剩余量大于40GB。测试环境无法满足,跳过检测。
#memory_availability:报错信息是推荐的master内存为16GB,node内存为8GB,测试环境无法满足,跳过检测。
#docker_image_availability:报错信息是需要的几个镜像未找到,选择跳过,装完集群后,在使用的时候再自行下载。
#docker_storage:报错信息是推荐选择一块磁盘空间存储镜像,这里选择跳过。采用docker默认的方式存储镜像。
# 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'}]
#ntp时间同步
openshift_clock_enabled=true
#节点配额
openshift_node_kubelet_args={'pods-per-core': ['10']}
# host group for masters
[masters]
master openshift_schedulable=True
# host group for nodes, includes region info
[nodes]
master openshift_node_labels="{'region': 'infra'}"
node1 openshift_node_labels="{'region': 'infra', 'zone': 'default'}"
node2 openshift_node_labels="{'region': 'infra', 'zone': 'default'}"
master openshift_node_group_name='node-config-master'
node1 openshift_node_group_name='node-config-compute'
node2 openshift_node_group_name='node-config-compute'
[etcd]
master
标红的方需要特别注意
- 修改脚本问题
openshift-ansible/roles/lib_utils/filter_plugins/openshift_master.py 的第487行
执行:
cd /home/openshift/
ansible-playbook -i /etc/ansible/inventory.ini openshift-ansible/playbooks/prerequisites.yml
执行以下命令:
ansible-playbook -i /etc/ansible/inventory.ini openshift-ansible/playbooks/deploy_cluster.yml
- 安装结果检查
oc get nodes
其实在安装完成之后 第二个节点和第三个节点的roles类型为空,需要将其打上compute标签,命令如下:
oc label node node1 node-role.kubernetes.io/compute=true
oc label node node2 node-role.kubernetes.io/compute=true
- OpenShift系统配置
安装的时候,在Ansible的hosts文件中定义了HTPasswd文件作为后端的用户身份信息库。
安装程序自动生成了数据文件/etc/origin/master/htpasswd。但是此时该文件还是一个空文件,并没有任何用户信息。
需要通过htpasswd命令来创建用户。创建账号为dev密码为dev的用户
htpasswd -b /etc/origin/master/htpasswd dev dev
- 给dev添加集群管理员权限
oc adm policy add-cluster-role-to-user cluster-admin dev
- 重启服务
systemctl restart origin-master-api
配置虚拟机的宿主机的hosts文件,
- 访问页面,https://master:8443
安装过程出现以下问题:
则主要是因为python的字符串编码问题
解决办法:
进入python环境:
#python
然后执行以下代码:
import sys
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
即可
cd /home/openshift/openshift-ansible/roles/openshift_control_plane/tasks/
rm -rf htpasswd_provider.yml