三 集群部署
为简单上手体验功能,可以先利用kubeadm安装测试,生产环境建议二进制或者一些成熟的集群高可用安装方式,Kubeadm 是 K8S 官方提供的快速部署工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践,本章节说明了使用 kubeadm 来部署 K8S 集群的过程。
项目 | 说明 |
---|
集群规模 | Master、node1、node2 |
系统 | CentOS 7.3 |
网络规划 | POD:10.244.0.0/16、Service:10.96.0.0/12 |
3.1 一般部署
本小节的所有的操作,在所有的节点上进行
3.1.1 关闭 firewalld 和 selinux
3.1.2 加载 ipvs 内核模块
- 如果集群已经部署在了 iptables 模式下,可以通过下面命令修改,修改 mode 为 ipvs 重启集群即可。
3.1.3 下载 Docker 和 K8S
- 安装 docker-ce 和 kubernetes
3.1.4 设置内核及 K8S 参数
- 设置 kubelet 忽略 swap,使用 ipvs
3.2 部署 Master
本小节的所有的操作,只在 Master 节点上进行
3.2.1 提前拉取镜像
宿主机最好能访问国外资源,在kubeadm init 在初始化的时候会到谷歌的 docker hub 拉取镜像,如果宿主机测试无法访问 k8s.gcr.io 可以在服务器所以我们要提前部署好代理软件,本例中监听个本机 9666 进行部署。
如果条件不允许可以参考: https://blog.csdn.net/jinguangliu/article/details/82792617 来解决镜像问题。
- 配置 Docker 拉取镜像时候的代理地址,vim /usr/lib/systemd/system/docker.service。
3.2.2 初始化Master
- 下面是最后执行成功显示的结果,需要保存这个执行结果,以让 node 节点加入集群
- 查看 kube-system 命名空间中运行的 pods
3.3 部署 Node
本小节的所有的操作,只在 Node 节点上进行。
3.3.1 加入集群
- 加入集群,注意在命令尾部加上 —ignore-preflight-errors=Swap ,以忽略 k8s 对主机 swap 的检查(k8s为了性能所以要求进制 swap )
3.3.2 查看进度
当 node 节点加入 K8S 集群中后,Master 会调度到 Node 节点上一些组件,用于处理集群事务,这些组件没有下载完成之前 Node 节点在集群中还是未就绪状态
- 在 node 执行下面命令,可以查看镜像的下载进度,下面是最终结果显示
- 可以在 Master 上使用下面命令来查看新加入的节点状态
如果嫌网络pull镜像慢可以在一台上面将镜像打包发送至其他node节点
- 查看 kube-system 这个 k8s 命名空间中有哪些组件,分别运行在哪个节点,-o wide 是以详细方式显示。
3.3.3 镜像下载太慢
node 节点需要翻墙下载镜像太慢,建议使用 docker 镜像的导入导出功能
先将master的三个镜像打包发送到node节点,load后再jion
3.4 jio本部署
3.4.1 预先准备
环境:
角色 | IP |
---|
master | 172.16.1.129 |
node01 | 172.16.1.133 |
修改当前的主机名,确保不是 localhost
:
为各节点添加主机名解析, 编辑/etc/hosts
:
确保任意节点上 Kubelet
使用的 IP 地址可互通(无需 NAT 映射即可相互访问),且没有防火墙、安全组隔离
关闭防火墙
和SElinux
:
安装 docker
以及 kubelet
:
:warning: WARNING
如果此时执行 service status kubelet
命令,将得到 kubelet 启动失败的错误提示,请忽略此错误,因为必须完成后续步骤中 kubeadm init
的操作,kubelet 才能正常启动
赋予权限及运行:
3.4.2 初始化 master 节点
关于初始化时用到的环境变量
APISERVER_NAME
不能是 master 的 hostname
APISERVER_NAME
必须全为小写字母、数字、小数点,不能包含减号
POD_SUBNET
所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16
命令,不做修改
在 master
节点上运行:
在master
节点上添加以下脚本:
执行该脚本:
检查master
初始化结果:
3.4.3 初始化 node 节点
3.4.3.1 获得 join命令参数
在master
节点上获取join
命令行:
:information_source: 有效时间
该 token
的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点。
3.4.3.2 初始化 node 节点
编辑本地主机解析文件/etc/hosts
:
执行从master
节点上获取的join
命令:
3.4.4 检查初始化结果
在master
节点上执行:
3.5 使用 Kubespray 部署
3.5.1 Kubespray 简介
Kubespray 是 Kubernetes incubator 中的项目,目标是提供 Production Ready Kubernetes 部署方案,该项目基础是通过 Ansible Playbook 来定义系统与 Kubernetes 集群部署的任务,具有以下几个特点:
- 可以部署在 AWS, GCE, Azure, OpenStack 以及裸机上.
- 部署 High Available Kubernetes 集群.
- 可组合性 (Composable),可自行选择 Network Plugin (flannel, calico, canal, weave) 来部署.
- 支持多种 Linux distributions(CoreOS, Debian Jessie, Ubuntu 16.04, CentOS/RHEL7).
Kubespray 由一系列的 Ansible playbook、生成 inventory 的命令行工具以及生成 OS/Kubernetes 集群配置管理任务的专业知识构成。
3.5.2 初始化环境
主机环境:
角色 | IP |
---|
master | 172.16.1.128 |
node01 | 172.16.1.129 |
编辑/etc/hosts
文件,使各主机之间可以通过主机名互相通信:
关闭 SELinux 和防火墙:
Kubernetes 1.8 开始要求关闭系统的 Swap 交换分区,方法如下:
Docker 从 1.13 版本开始调整了默认的防火墙规则,禁用了 iptables filter
表中FOWARD
链,这样会引起 Kubernetes 集群中跨 Node 的 Pod 无法通信,在各个 Docker 节点执行下面的命令:
配置 SSH Key 认证。确保本机也可以 SSH 连接,否则下面部署失败。
更新系统内核为 4.4.x , CentOS 默认为 3.10.x 。
重启系统:reboot
增加内核配置,编辑/etc/sysctl.conf
文件:
使其内核配置生效:
3.5.3 安装 Kubespray
安装 Centos 的 EPEL 源:
更新缓存:
安装相关软件(Ansible 版本必须 >= 2.7):
下载源码,当前 Kubespray 项目的 Master 分支默认安装 K8s 1.13.1 版本:
安装 Kubespray 依赖,若无特殊说明,后续操作均在 ~/kubespray `目录下执行:
配置 Kubespray:
修改配置文件 inventory/mycluster/hosts.ini
:
:information_source:此处也可以用:kubespray prepare --masters master1 --etcds master1 --nodes node1 node2 node3
来自动生成inventory
文件
修改配置文件 inventory/mycluster/group_vars/all/all.yml
:
修改镜像默认的 Repo 地址,使用 Calico 三层网络,同时可以指定安装的 K8s版本,参数为 kube_version
。编辑文件inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
(在这里我能够科学上网就不做修改了):
如需设置代理,在 cluster.yml
中编辑 default 值即可:
如需设置docker pull
代理,新建/etc/systemd/system/docker.service.d/http-proxy.conf
文件,添加以下内容:
修改./roles/kubernetes-apps/ansible/templates/dashboard.yml.j2
文件,使用 NodePort
方式访问 Dashboard:
:warning: 注意:如果是单节点部署 K8s,Kubespray 默认会创建 2 个 coredns Pod,但 Deployment 中又用到了 podAntiAffinity,因此会导致其中一个 coredns pod pending,所以需要修改./roles/kubernetes-apps/ansible/templates/coredns-deployment.yml.j2
代码如下:
最后执行部署命令:
3.5.4 登录 Dashboard
登陆 Dashboard 支持 kubeconfig 和 token 两种认证方式,kubeconfig 也依赖 token 字段,所以生成 token 这一步是必不可少的。此处,我们获取集群管理员(拥有所有命名空间的 admin 权限)的 token。
查看 kubernetes-dashboard 暴露的端口,如下所示,这里是31777端口。
获取 admin 的 token
在 dashboard 登录页面上使用上面输出中的那个非常长的字符串作为 token 登录,即可以拥有管理员权限操作整个 kubernetes 集群中的对象。当然您也可以将这串 token 加到 admin 用户的 kubeconfig 文件中,继续使用 kubeconfig 登录,两种认证方式任您选择。
登录 dashboard:https://172.16.1.128:30548
注意:由于这里使用的 HTTPS,并未使用证书,因此使用 Google 等浏览器会终止访问。
3.5.5 验证 K8s 集群
3.5.6 其他
增加 node 节点(提前在hosts.ini
文件中增加主机节点):
将 hosts.ini
文件中的 master 和 etcd 的机器增加到多台,执行部署命令:
刪除节点,如果不指定节点就是刪除整个集群:
如果需要卸载,可以执行以下命令:
升级 K8s 集群,选择对应的 K8s 版本信息,执行升级命令。涉及文件为 upgrade-cluster.yml
:
参考链接