openshift OKD v3.11安装
安装前的准备
最低系统要求
1. master最低要求
- 最小4 vCPU
- 最小16 GB RAM
- /var/最小40 GB硬盘空间
- /usr/local/bin/最小1 GB硬盘空间
- 临时目录最小1 GB硬盘空间
2. node最低要求
- 1 vCPU
- 最小8 GB RAM
- /var/最小15 GB硬盘空间
- /usr/local/bin/最小1 GB硬盘空间
- 临时目录最小1 GB硬盘空间
3. 磁盘要求
- /var/lib/etcd Less than 20 GB
- /var/lib/docker 50GB
- /var/lib/containers 50GB
这是openshift官方给出的最小要求,也是openshift-ansible检测环境时的最小要求,实际上,我们的实验环境满足不了最小要求,但仍然可以安装。但是需要我们在做openshift-ansible的配置预检时忽略这些检查
实验环境说明
主机名 | 角色 |
---|---|
master1.example.com | master, etcd |
node1.example.com | node |
node2.example.com | node |
软件环境说明:
- RHEL/CentOS 7.x
- Ansible 2.6.14
- openshift: OKD 3.11
- docker: 1.13
- kubernetes: 1.11
预配置
1. 配置yum源
# 包含CentOS 7和epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2. 安装基础环境依赖包
yum install -y wget git net-tools bind-utils yum-utils iptables-services bridge-utils bash-completion kexec-tools sos psacct
# 安装NetworkManager,openshift在配置dns时需要依赖NetworkManager
yum install -y NetworkManager
systemctl start NetworkManager
3. 安装docker
yum install -y docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://o0o4czij.mirror.aliyuncs.com"]
}
systemctl start docker
systemctl enable docker
当前官方宣称openshift v3.11只支持docker 1.13(事实上,在我的测试当中docker-ce也能用),为避免不必要的麻烦,这里直接使用docker 1.13版本
安装openshift
1. 安装openshift-ansible
yum install -y centos-release-openshift-origin311
yum install -y openshift-ansible*
2. 关闭selinux检查
openshift-ansible的代码中,强制开启了针对selinux的检查,要求其必须开启,否则安装报错。而事实上,在生产环境中,selinux基本都是关闭的,这里通过修改其源代码以忽略针对selinux的检查:
# vim /usr/share/ansible/openshift-ansible/roles/openshift_node/tasks/selinux_container_cgroup.yml
- name: Setting sebool container_manage_cgroup
seboolean:
name: container_manage_cgroup
state: yes
persistent: yes
when:
ansible_selinux.status == 'enabled'
3. 修改openshift-ansible代码中使用的yum源为国内源
cd /usr/share/ansible/openshift-ansible
grep -nr mirror.centos.org * | awk -F':' '{print $1}' | xargs sed -i 's/mirror.centos.org/mirrors.aliyun.com/g'
4. 配置inventory
vim /etc/ansible/hosts
[OSEv3:children]
masters
nodes
etcd
new_nodes
new_masters
new_etcd
nfs
[OSEv3:vars]
# if your target hosts are Fedora uncomment this
#ansible_python_interpreter=/usr/bin/python3
ansible_ssh_user=root
openshift_deployment_type=origin
openshift_image_tag=v3.11
#openshift_portal_net=172.30.0.0/16
# localhost likely doesn't meet the minimum requirements
#openshift_disable_check=disk_availability,memory_availability,docker_image_availability
#openshift_node_groups=[{'name': 'node-config-all-in-one', 'labels': ['node-role.kubernetes.io/master=true', 'node-role.kubernetes.io/infra=true', 'node-role.kubernetes.io/compute=true']}]
openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider'}]
#openshift_master_htpasswd_file=/root/openshift-passwd
openshift_disable_check=disk_availability,memory_availability,docker_image_availability,docker_storage
openshift_master_api_port = 443
openshift_master_console_port = 443
#os_sdn_network_plugin_name=redhat/openshift-ovs-multitenant
os_sd_network_plugin_name=redhat/openshift-ovs-subnet
#deployment_subtype=registry
#openshift_hosted_infra_selector=""
openshift_hosted_router_replicas=1
openshift_hosted_registry_replicas=1
#
openshift_master_cluster_hostname=master.lab.example.com
openshift_master_cluster_public_hostname=master.lab.example.com
openshift_master_default_subdomain=apps.lab.example.com
openshift_enable_service_catalog=false
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_hosted_etcd_storage_kind = nfs
#openshift_hosted_etcd_storage_nfs_options = '*(rw,root_squash,sync,no_wdelay)'
#openshift_hosted_etcd_storage_nfs_directory = /exports
#openshift_hosted_etcd_storage_volume_name = etcd-vol2
#openshift_hosted_etcd_storage_access_modes = ['ReadWriteOnce']
#openshift_hosted_etcd_storage_volume_size = 1G
#openshift_hosted_etcd_storage_labels={'storage': 'etcd'}
#openshift_master_cluster_method=native
#openshift_public_ip=192.168.0.157
# false
#ansible_service_broker_install=false
#openshift_enable_service_catalog=false
#template_service_broker_install=false
#openshift_logging_install_logging=false
#openshift_docker_options="--log-driver json-file --log-opt max-size=1M --log-opt max-file=3 --exec-opts native.cgroupdriver=systemd"
[masters]
192.168.0.43
[etcd]
192.168.0.43
[nfs]
192.168.0.43
[nodes]
# openshift_node_group_name should refer to a dictionary with matching key of name in list openshift_node_groups.
192.168.0.43 openshift_node_group_name="node-config-all-in-one"
192.168.0.157 openshift_node_group_name="node-config-all-in-one"
192.168.0.187 openshift_node_group_name="node-config-master-infra"
[new_nodes]
[new_masters]
[new_etcd]
一些配置项说明:
openshift_deployment_type
: 指定openshift的版本,openshift同时有开源版和商业版,这里的origin即开源版openshift_image_tag
:指定使用的openshift的版本openshift_master_identity_providers
:指定openshift的认证方式openshift_disable_check
:openshift-ansible在执行安装时会对系统做预检,这里可以指定预检时跳过的检查项:- disk_availability:推荐master磁盘空间剩余量大于40GB。测试环境无法满足,跳过检测。
- memory_availability:推荐master内存为16GB,node内存为8GB,测试环境无法满足,跳过检测。
- docker_image_availability:需要的几个镜像未找到,选择跳过,装完集群后,在使用的时候再自行下载。
- docker_storage:推荐选择一块磁盘空间存储镜像,这里选择跳过。采用docker默认的方式存储镜像。
事实上,部署前预检查配置还有专门的配置检查脚本:
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml
5. 执行部署
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
至此,部署完成
6. 卸载
如果安装后需要卸载,可执行如下操作:
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/adhoc/uninstall.yml
7. 访问
可通过两种方式访问openshift集群,一个是命令行,即oc命令集,如下:
# 查看当前集群中的节点
oc get nodes
# 查看当前集群默认项目下的pod
oc get pods
如果通过oc命令操作无权限,则需要将master节点上/etc/origin/master目录下的admin.kubeconfig文件拷贝至用户家目录下的一个隐藏目录.kube目录下,并命名为config:
mkdir ~/.kube
cp /etc/origin/master/admin.kubeconfig ~/.kube/config
另一种则可通过openshift提供的强大的图形界面功能:
curl https://master1.example.com:8443/console
这个时候,需要通过帐号密码登录,但我们刚安装好的openshift默认没有帐号密码。所以如果需要登录图形界面,需要先添加相关帐号。
openshift使用/etc/origin/master/htpasswd文件来保存帐号密码,下面我们创建一个超级管理员帐号:
# 创建admin用户
htpasswd -m /etc/origin/master/htpasswd admin
# 为用户授予超级管理员权限
oc adm policy add-cluster-role-to-user cluster-admin admin
然后即可通过该帐号登入web界面
注意事项及常见故障
注意事项
- 操作系统语言不能为中文
- lb节点和router节点不能放一块(即infra节点不能同时部署router和lb,因为它们都会占据80端口),同理,lb不要和master放一块
- 需要开启networkmanager,openshift基于此配置网络
- openshift-ansible也要求开启selinux,但可通过修改其源代码关闭此项检查
- 确保master节点和node节点能够联网(需要从互联网下载软件包及拉取镜像)
- 生产环境中,建议etcd和master放同一节点,或者独立部署,不建议又放master节点又放node节点(从openshift 4.1开始,强制要求etcd和master部署在同一节点)
其他安装说明
在我们的实验环境中,使用了单master单etcd节点,事实上,在生产环境中,推荐使用至少三master三etcd的配置。那么针对不同的集群部署方案,/etc/ansible/hosts的配置也有相应区别。具体可参考红帽官方文档
另外还需要说明的是,openshift的所有组件的部署其实都是基于容器的方式部署,而容器镜像都来自docker官方,所以需要确保网络的连通性和稳定性。好在当前国内有众多的加速器可用。
常见错误
在安装openshift-service-catalog时大概率失败,在失败后,打出的日志中显示etcd无法连接,在node节点上拿不到连接etcd的证书,错误忘记复制,在这里就不贴了。
直接说原因,因为这个证书只在主节点上存在,这一点确实很奇怪,至于什么原因,暂时不明,一个简单的解决办法是从主节点上直接复制etcd证书至所有node节点:
scp master:/etc/origin/master/master.etcd-c* node:/etc/origin/master/
当然也可以直接选择不安装openshift-service-catalog组件,在inventory中添加如下配置项即可:
openshift_enable_service_catalog=false
附录
参考: