openshift 3.10多节点集群安装(基于Ansible和Centos7.4)

参考官方文档https://docs.okd.io/3.10/install/index.html,基于Ansible安装3.10版openshift集群。openshift origin已改名为openshift OKD。

特注:本文仅供初学者参考!生产环境请结合实际并参照官方文档!

遇到的坑以及未完善的地方总结

由于我是在自己笔记本上建了两台虚机,资源有限,这里就拿双节点模拟一下集群,其中master节点也是计算节点、infra节点,运行etcd和nfs。node节点运行etcd和lb。

  • 官网推荐使用GlusterFS作为存储,我直接用的nfs。有关GlusterFS作为存储的做法,官网写的很清楚,想用GlusterFS可以参考官网https://docs.okd.io/3.10/install/configuring_inventory_file.html#advanced-install-glusterfs-persistent-storage。

  • 如果lb和master在一个节点上,会有8443端口已被占用的问题,尝试在Inventory文件中修改API 8443端口为3443端口,安装还是有问题,故选择把lb不放在master节点上。建议安装时lb不要放在master节点上

  • 如果etcd放在master节点上,会以静态pod形式启动。如果放在node节点上,会以系统服务的形式启动。我在安装过程中,一个etcd放在了master上,另一个放在了node上,导致etcd启动失败。解决方案是在master节点上yum安装了一个etcd(这个etcd实际并没有使用,不确定是否是这个原因解决了),最终仍是以静态pod起的etcd。建议安装时etcd要么全放在master节点上,要么全放在node节点上。

  • 我在安装过程中,直接安装了带有nfs持久存储的监控,需要提前安装java-1.8.0-openjdk-headless python-passlib,这一点官网没有提及,不提前装安装会报错。

系统与环境要求

系统要求

以下部分确定了集群所有主机的硬件规格和系统级要求。

master系统要求

  • 最低操作系统版本:Fedora 21、CentOS 7.4、RHEL 7.4、RHEL Atomic Host 7.4.5。
  • 最低4 vCPU。
  • 最小16GB RAM。
  • 包含/var/的文件系统最小40GB硬盘空间。
  • 包含/usr/local/bin/的文件系统最小1GB硬盘空间。
  • 包含系统临时目录的文件系统最小1GB硬盘空间。

Etcd和Master在同一节点的,需要至少4核,2核系统将无法工作。

node系统要求

  • 最低操作系统版本:Fedora 21、CentOS 7.4、RHEL 7.4、RHEL Atomic Host 7.4.5。
  • NetworkManager 1.0或更新。
  • 最低1 vCPU。
  • 最小8GB RAM。
  • 包含/var/的文件系统最小15GB硬盘空间。
  • 包含/usr/local/bin/的文件系统最小1GB硬盘空间。
  • 包含系统临时目录的文件系统最小1GB硬盘空间。
  • 额外至少15GB未分配空间,用于Docker存储。

etcd系统要求

  • 最小20GB硬盘空间存储etcd数据。

SELinux要求

在安装OKD之前,必须在所有服务器上启用SELinux,否则安装程序将失败。
/etc/selinux/config配置如下:
openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第1张图片

环境要求

DNS要求

在每台主机的/etc/hosts文件中添加条目是不够的。此文件不会被复制到平台上运行的容器中。建议配置单独的DNS服务器。

  • 默认情况下,容器从其所在主机接收DNS配置文件(/etc/resolv.conf)。
  • 然后,OKD将pod的第一个nameserver设置为主机节点的IP地址。

从OKD 1.2开始,所有Master和node上会自动配置dnsmasq。pod使用所在主机节点作为DNS,主机节点转发请求。默认情况下, 在主机节点上配置dnsmasq(端口53),因此主机节点无法运行任何其他类型的DNS应用程序。

节点需要安装NetworkManager。
NM_CONTROLLED 默认设置为yes,如果设置为no,则NetworkManager调度脚本不会创建相关的origin-upstream-dns.conf文件,需要手动配置dnsmasq。

配置主机使用DNS

主机DNS解析的配置取决于是否启用了DHCP。

  • 如果禁用了DHCP,设置静态IP,并将DNS nameservers添加到NetworkManager。
  • 如果启用了DHCP,NetworkManager调度脚本会根据DHCP配置自动配置DNS。

我的主机都是静态IP。禁用了DHCP。
这里,我暂时选用的是在每台主机节点上修改/etc/hosts文件。

安装规划

个人电脑资源有限,这里采用双节点集群(基于Centos7.4的虚拟机),具体分配如下。

类型 主机名 IP 操作系统 内存
master,node,etcd,nfs master1.example.com 192.168.121.195 CentOS 7.4 4G
node,etcd,lb node1.example.com 192.168.121.196 CentOS 7.4 2G

我是因为笔记本资源不够,所以做了妥协,拿双节点做了模拟,官网的示例主机分配如下。
openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第2张图片
openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第3张图片
可以看出官网的示例中,etcd要么全部放在master节点上,要么全部没放在master节点上

主机准备

主机互信

在将调用安装过程的主机上生成SSH密钥:

# ssh-keygen

一直按回车。
openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第4张图片
分发SSH密钥。

# for host in master1.example.com node1.example.com ; do ssh-copy-id -i ~/.ssh/id_rsa.pub $host;  done

openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第5张图片

安装基础包

每台主机上都执行:

# yum install -y wget git net-tools bind-utils yum-utils iptables-services bridge-utils bash-completion kexec-tools sos psacct java-1.8.0-openjdk-headless python-passlib

安装Ansible

在将调用安装过程的主机上执行:

  • 安装EPEL存储库:
# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • 全局禁用EPEL存储库,以便在以后的安装步骤中不会意外使用它:
# sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo
  • 安装Ansible包:
# yum -y --enablerepo=epel install ansible pyOpenSSL
  • 从GitHub 克隆openshift / openshift-ansible存储库,它提供所需的playbooks和配置文件
# cd ~
# git clone https://github.com/openshift/openshift-ansible
# cd openshift-ansible
# git checkout release-3.10

安装Docker

手动安装,可以在安装OKD之前配置Docker存储选项。
每台主机上执行:

# yum install -y docker-1.13.1

验证:
openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第6张图片
此时docker还未启动,需要配置docker存储之后再启动docker。

docker存储配置

关于这一块可以参考官方文档https://docs.okd.io/3.10/install/host_preparation.html#configuring-docker-storage,选择适合自己的存储方式。
由于我是自己电脑创建的虚拟机,这里选用的是挂载一块新的硬盘作为docker存储。

  • 配置Docker镜像服务器。

选择中国科技大学的镜像服务器进行加速。修改/etc/sysconfig/docker文件,在OPTIONS变量中追加--registry-mirror=https://docker.mirrors.ustc.edu.cn

启动docker

# systemctl enable docker
# systemctl start docker
# systemctl is-active docker

编写Inventory文件

# mv -f /etc/ansible/hosts /etc/ansible/hosts.org
# vim /etc/ansible/hosts
[OSEv3:children]
masters
nodes
etcd
lb
nfs

[OSEv3:vars]
openshift_deployment_type=origin
ansible_ssh_user=root
openshift_enable_unsupported_configurations=True
openshift_hosted_registry_storage_kind=nfs
openshift_hosted_registry_storage_access_modes=['ReadWriteMany']
openshift_hosted_registry_storage_nfs_directory=/exports
openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)'
openshift_hosted_registry_storage_volume_name=registry
openshift_hosted_registry_storage_volume_size=10Gi

openshift_metrics_install_metrics=true
openshift_metrics_hawkular_hostname=hawkular-metrics.example.com
openshift_metrics_storage_kind=nfs
openshift_metrics_storage_access_modes=['ReadWriteOnce']
openshift_metrics_storage_nfs_directory=/exports
openshift_metrics_storage_nfs_options='*(rw,root_squash)'
openshift_metrics_storage_volume_name=metrics
openshift_metrics_storage_volume_size=10Gi

openshift_ca_cert_expire_days=3650
openshift_node_cert_expire_days=3650
openshift_master_cert_expire_days=3650
etcd_ca_default_days=3650

openshift_enable_service_catalog=false
template_service_broker_install=false
ansible_service_broker_install=false

debug_level=4
openshift_clock_enabled=true
openshift_master_cluster_method=native
openshift_master_cluster_hostname=node1.example.com
openshift_master_cluster_public_hostname=node1.example.com

openshift_pkg_version=-3.10.0
openshift_disable_check=disk_availability,docker_storage,memory_availability,docker_image_availability
os_sdn_network_plugin_name=redhat/openshift-ovs-multitenant
openshift_master_identity_providers=[{'name': 'htpasswd_auth','login': 'true', 'challenge': 'true','kind': 'HTPasswdPasswordIdentityProvider'}]

[nfs]
master1.example.com

[masters]
master1.example.com

[lb]
node1.example.com

[nodes]
master1.example.com openshift_schedulable=True openshift_node_group_name='node-config-all-in-one'
node1.example.com openshift_node_group_name='node-config-compute' 

[etcd]
master1.example.com
node1.example.com

安装集群

注意调整以下命令中的文件路径,以满足自己的要求。

# ansible-playbook -i /etc/ansible/hosts ~/openshift-ansible/playbooks/prerequisites.yml

openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第7张图片

# ansible-playbook -i /etc/ansible/hosts ~/openshift-ansible/playbooks/deploy_cluster.yml

openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第8张图片
安装完成之后可以查看pod的状态。
openshift 3.10多节点集群安装(基于Ansible和Centos7.4)_第9张图片
图中运行失败的几个pod,一部分是监控的pod,因为我没有提前下载镜像导致启动失败,还有一个是openshift镜像库的web界面,失败原因大体相同,因为电脑太卡,这部分坑就不填了。影响不大。

你可能感兴趣的:(openshift,Kubernetes,docker,从零学习云计算)