参考官方文档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,这一点官网没有提及,不提前装安装会报错。
以下部分确定了集群所有主机的硬件规格和系统级要求。
Etcd和Master在同一节点的,需要至少4核,2核系统将无法工作。
在安装OKD之前,必须在所有服务器上启用SELinux,否则安装程序将失败。
/etc/selinux/config配置如下:
在每台主机的/etc/hosts文件中添加条目是不够的。此文件不会被复制到平台上运行的容器中。建议配置单独的DNS服务器。
从OKD 1.2开始,所有Master和node上会自动配置dnsmasq。pod使用所在主机节点作为DNS,主机节点转发请求。默认情况下, 在主机节点上配置dnsmasq(端口53),因此主机节点无法运行任何其他类型的DNS应用程序。
节点需要安装NetworkManager。
NM_CONTROLLED 默认设置为yes,如果设置为no,则NetworkManager调度脚本不会创建相关的origin-upstream-dns.conf文件,需要手动配置dnsmasq。
主机DNS解析的配置取决于是否启用了DHCP。
我的主机都是静态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 |
我是因为笔记本资源不够,所以做了妥协,拿双节点做了模拟,官网的示例主机分配如下。
可以看出官网的示例中,etcd要么全部放在master节点上,要么全部没放在master节点上
在将调用安装过程的主机上生成SSH密钥:
# ssh-keygen
# for host in master1.example.com node1.example.com ; do ssh-copy-id -i ~/.ssh/id_rsa.pub $host; done
每台主机上都执行:
# 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
在将调用安装过程的主机上执行:
# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo
# yum -y --enablerepo=epel install ansible pyOpenSSL
# cd ~
# git clone https://github.com/openshift/openshift-ansible
# cd openshift-ansible
# git checkout release-3.10
手动安装,可以在安装OKD之前配置Docker存储选项。
每台主机上执行:
# yum install -y docker-1.13.1
验证:
此时docker还未启动,需要配置docker存储之后再启动docker。
关于这一块可以参考官方文档https://docs.okd.io/3.10/install/host_preparation.html#configuring-docker-storage,选择适合自己的存储方式。
由于我是自己电脑创建的虚拟机,这里选用的是挂载一块新的硬盘作为docker存储。
选择中国科技大学的镜像服务器进行加速。修改/etc/sysconfig/docker文件,在OPTIONS变量中追加--registry-mirror=https://docker.mirrors.ustc.edu.cn
。
# systemctl enable docker
# systemctl start docker
# systemctl is-active docker
# 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
# ansible-playbook -i /etc/ansible/hosts ~/openshift-ansible/playbooks/deploy_cluster.yml
安装完成之后可以查看pod的状态。
图中运行失败的几个pod,一部分是监控的pod,因为我没有提前下载镜像导致启动失败,还有一个是openshift镜像库的web界面,失败原因大体相同,因为电脑太卡,这部分坑就不填了。影响不大。