Kubernetes 之一特性与 Kubeadm 方式搭建集群
Kubernetes 概述
Kubernetes 简介
Kubernetes 是 Google 开源的一个容器编排引擎,简称 K8s,是用 8 代替 8 个字符 ubernete
而成的缩写。Kubernetes 可用于管理云平台中多个主机上的容器化的应用,支持自动化部署、大规模扩缩容、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。Kubernetes 提供了应用部署、规划、更新、维护的一种机制。在 Kubernetes 中,可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
各种部署方式的区别
传统的应用部署方式是通过插件或脚本来安装应用,这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新、回滚等操作;当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能够快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在 build
或 release
的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更 “透明”,这更便于监控和管理。
Kubernetes 功能介绍
- 自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器
- 自我修复:当容器运行失败时,会对容器进行重启;当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
- 水平扩展:通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
- 服务发现:用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
- 滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
- 版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
- 密钥和配置管理:在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
- 存储编排:自动实现存储系统挂载及应用,这特别对有状态应用实现数据持久化非常重要;存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
- 批处理:提供一次性任务,定时任务,满足批量数据处理和分析的场景
Kubernetes 架构
应用部署架构分类
- 无中心节点架构:GlusterFS
- 有中心节点架构:HDFS、K8S
Kubernetes 集群架构
Kubernetes 集群架构节点角色
Master(主控节点)
:Kubernetes 集群控制节点,负责对集群进行调度管理,接受集群外的用户去集群操作请求。Master 由 API Server、Scheduler、ClusterState Store(ETCD 存储系统)和 Controller MangerServer 组成- Scheduler:节点调度,选择 Node 节点来应用部署
- API Server:集群统一入口,以 RESTful 接口将数据交给 ETCD 存储系统
- Controller MangerServer:处理集群中的常规后台任务,一个资源对应一个控制器
Node(工作节点)
:Kubernetes 集群工作节点,负责运行用户业务应用容器,Node 由 Kubelet、Kube-Proxy 和 ContainerRuntime 组成- Kubelet:负责 Pod 对应的容器的创建、启停管理,与 Master 节点协作,实现集群管理的基本功能
- Kube-Proxy:提供 Kubernetes 的通信与负载均衡功能的重要组件
Kubernetes 核心概念
Kubernetes 集群搭建
集群搭建方式
目前生产环境搭建 Kubernetes 集群主要有以下两种方式:
Kubeadm
:Kubeadm 是一个 Kubernetes 部署工具,提供kubeadm init
和kubeadm join
命令,可用于快速搭建 Kubernetes 集群二进制包
:从 Github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。Kubeadm 虽然降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,生产环境推荐使用二进制包搭建 Kubernetes 集群,虽然手动部署比较麻烦,但期间可以学习很多工作原理,也利于后期维护
集群搭建要求
搭建 Kubernetes 集群需要满足以下几个条件:
- 一台或多台机器,建议操作系统 CentOS 7.x86_64
- Master 节点的硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 20GB 或更多
- Node 节点的硬件配置:4GB 或更多 RAM,4 个 CPU 或更多 CPU,硬盘 40GB 或更多
- 集群中所有机器之间的网络可以互通
- 系统内可以访问外网,需要拉取镜像
- 禁用 swap 分区
集群搭建规划
Kubernetes 集群搭建规划分为单 Master 集群和多 Master 集群两种,为了提高集群的高可用性,生产环境一般采用后者的规划方案,如下图所示:
Kubeadm 方式搭建单 Master 集群
搭建目标
-(1)在所有节点上安装 Docker 和 kubeadm
-(2)部署 Kubernetes Master
-(3)部署容器网络插件
-(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
-(5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
软件环境
软件 | 版本 | 安装方式 |
---|---|---|
CentOS 7.9 | 3.10.0-1160.15.2.el7.x86_64 | 虚拟机 |
Docker | docker-ce-18.06.1.ce-3.el7 | YUM |
Kubelet | 1.18.0 | YUM |
Kubeadm | 1.18.0 | YUM |
Kubectl | 1.18.0 | YUM |
Dashboard | 2.0.3 | Kubernetes |
服务器规划
Host Name | 角色 | IP | CPU | Memory | Disk |
---|---|---|---|---|---|
k8s-master | master | 192.168.31.61 | >= 2C | >=2G | >=20G |
k8s-node1 | node | 192.168.31.62 | >= 4C | >=4G | >=40G |
k8s-node2 | node | 192.168.31.63 | >= 4C | >=4G | >=40G |
k8s-node3 | node | 192.168.31.64 | >= 4C | >=4G | >=40G |
系统初始化
值得一提的是,以下系统初始化操作都必须在所有节点上执行一次,重点包括在所有节点里安装 Docker、Kubelet、Kubeadm。这里要求 Kubelet、Kubeadm、Kubectl 的版本与 Docker 的版本互相匹配(兼容),不建议安装最新版本的 Docker,因为 Kubernetes 对最新版的 Docker 兼容不够及时,容易导致 Kubeadm 方式搭建 Kubernetes 集群失败。
关闭防火墙
1 | # 临时关闭 |
关闭 selinux
1 | # 临时关闭 |
关闭 swap
1 | # 临时关闭 |
系统时间同步
1 | # 安装时间同步工具 |
安装 Docker,这是由于 Kubernetes 默认的 CRI(容器运行时)为 Docker
1 | # 添加YUM源 |
安装 Kubelet、Kubeadm、Kubectl
1 | # 添加YUm源 |
将桥接的 IPv4 流量传递到 iptables 的链
1 | # 添加路由规则 |
设置主机名
1 | # hostnamectl set-hostname <hostname> |
添加 hosts(Master 和各 Node 节点都配置)
1 | # 添加hosts |
部署 Master 节点
在 Master 节点执行 Kubeadm 初始化操作,--service-cidr
与 --pod-network-cidr
一般都不需要更改,详细参数说明如下,点击查看详细的安装日志信息
--apiserver-advertise-address
:Master 节点的 IP 地址--kubernetes-version
:Kubernetes 的版本号,必须与上面 Kubelet 的版本号一致--apiserver-advertise-address
:一般指定为 Haproxy + Keepalived 的 VIP--image-repository
:由于默认拉取镜像地址k8s.gcr.io
国内无法访问,指定阿里云镜像仓库地址--pod-network-cidr
:指定 Pod Network 的地址范围,由于 Kubernetes 支持多种网络方案,而且不同网络方案对参数有各自要求,设置为10.244.0.0/16
表示使用 Flannel 网络方案
1 | # 执行初始化 |
在 Master 节点配置 Kubectl 工具
1 | # 创建目录 |
Master 节点安装 Flannel 网络插件
查看集群状态,此时的 Master 处于 “NotReady”(未就绪),这是因为集群中尚未安装 Flannel 网络插件,部署完网络插件后状态会自动变为 Ready
1 | # 查看集群状态 |
安装 Flannel 网络插件,若 kubectl apply -f
命令执行后提示网络连接失败,可留意文章后面给出的解决方案
1 | # 安装Flannel网络插件 |
当 Master 节点处于 Ready
状态,就可以开始将 Node 节点加入集群
1 | # 查看集群状态 |
将 Node 节点加入到 Kubernetes 集群
在各个 Node 节点里执行以下命令,向 Kubernetes 集群添加新节点,该命令是上述 kubeadm init
命令执行完成后在终端记录下来的
1 | # 添加Node节点到集群 |
测试 Kubernetes 集群功能
在 Master 节点执行以下命令,查看集群中所有节点的状态,当它们的状态都为 Ready
时,表示 Kubernetes 集群已经成功搭建起来了。值得一提的是,集群中所有节点的状态变更为 Ready
,这需要花较长时间,可能花十几分钟甚至几十分钟
1 | # 查看集群状态 |
在 Master 节点里创建一个 Nginx 容器,验证 Kubernetes 集群是否正常运行
1 | # 创建Nginx容器 |
Kubeadm 部署 Dashboard 可视化插件
在 Kubeadm 部署 Dashboard 可视化插件的流程中,以下所有操作都是直接在 Master 节点里执行,后续不再累述。
Dashboard 简介
在 Kubernetes 社区中,有一个很受欢迎的 Dashboard 项目,它可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
- Dashboard 官方参考文档
- Dashboard Github 项目地址
- Dashboard 各版本说明,Dashboard 版本与 Kubernetes 版本必须匹配(兼容)
Dashboard 部署
执行 YAML 文件直接部署 Dashboard,这里的 Kubernetes 1.8 版本对应的 Dashboard 版本为 v2.0.3,两者的版本号必须匹配
1 | # 部署 |
查看 Dashboard 的运行状态,可以看到以 deployment
方式部署,运行了 2 个 Pod 及 2 个 Service
1 | # 查看Pod的状态 |
Dashboard 暴露服务
这里作为演示,使用 NodePort 方式将 Dashboard 的服务暴露在集群外,指定使用 30443 端口(可自定义)
1 | # 暴露Service |
或者下载 YAML 文件,手动更改 Service 部分的端口,并以为 NodePort 方式进行部署
1 | # 下载YAML文件 |
Dashboard 认证方式登录
Dashboard 支持 Kubeconfig 和 Token 两种认证方式,这里选择 Token 认证方式登录,首先执行以下操作创建登录用户
1 | # 创建YAML配置文件,复制下面的内容到文件中 |
YAML 配置文件 dashboard-adminuser.yaml
的完整内容如下,指定了一个名称为 admin-user
的服务账号,并放在 kubernetes-dashboard
命名空间下,并将 cluster-admin
角色绑定到 admin-user
账户,这样 admin-user
账户就有了管理员的权限。默认情况下,Kubeadm 创建集群时已经创建了 cluster-admin
角色,只需直接绑定即可
1 |
|
查看 admin-user
账户的 Token
1 | # 查看Token |
使用火狐浏览器打开 https://<any_node_ip>:30443
,访问 Dashboard 的登录界面,由于谷歌浏览器会强制使用 HTTPS 协议,这将导致无法访问 Dashboard 的登录页面,因此建议使用火狐浏览器进行访问
将获取到的 Token 复制到登录界面的 Token 输入框中,成功登陆 Dashboard
Dashboard 登录超时
Dashboard 默认登录超时时间是 15min,可以为 Dashboard 容器增加 --token-ttl
参数来自定义超时时间,配置示例如下:
1 | # 下载YAML文件 |
Kubeadm 搭建集群问题总结
1 | [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2 |
执行 kubeadm init
命令,提示 CPU 核心数少于 2,可以添加命令参数 --ignore-preflight-errors=NumCPU
忽略警告
1 | [ERROR Swap]: running with swap on is not supported. Please disable swap |
执行 kubeadm init
命令,提示启用了 swap 分区,可以添加命令参数 --ignore-preflight-errors 'Swap'
忽略错误
1 | [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.1. Latest validated version: 18.09 |
执行 kubeadm init
命令,提示 Docker 的版本过高,可能与 Kubernetes 的版本不兼容
1 | The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port? |
执行 kubectl apply -f
命令,提示网络链接失败,这是国内无法访问 raw.githubusercontent.com
导致,临时解决方法如下:
- 在
https://www.ipaddress.com
网站上查询raw.githubusercontent.com
域名的真实 IP 地址 - 更改系统的
/etc/hosts
配置文件,添加一行内容185.199.108.133 raw.githubusercontent.com
,将185.199.108.133
替换为查询到真实的 IP 地址 - 重新执行
kubectl apply -f
命令即可