k8s-集群安装

1-Kubernetes 是什么?

1.1常见的云平台

IaaS(Infrastructure as a Service):基础设施服务,常见平台阿里云。

PaaS(platform as a service):平台即服务,常见平台如新浪云。

SaaSSoftware as a Service):软件即服务,常见平台Office365。

Kubernetes(PaaS)是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验 的基础上,结合了社区中最好的想法和实践。

1.2 为什么 Kubernetes 如此有用?

k8s-集群安装_第1张图片

传统部署:

早期,各个组织机构在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展, 并且维护许多物理服务器的成本很高。

虚拟化部署:

作为解决方案,引入了虚拟化。虚拟化技术允许你在单个物理服务器的 CPU 上运行多个虚拟机(VM)。 虚拟化允许应用程序在 VM 之间隔离,并提供一定程度的安全,因为一个应用程序的信息 不能被另一应用程序随意访问。

虚拟化技术能够更好地利用物理服务器上的资源,并且因为可轻松地添加或更新应用程序 而可以实现更好的可伸缩性,降低硬件成本等等。

每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器化部署:

容器类似于 VM,但是它们具有被放宽的隔离属性,可以在应用程序之间共享操作系统(OS)。 因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。容器因具有许多优势而变得流行起来。容器化部署的好处:

  • 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),支持可靠且频繁的 容器镜像构建和部署。
  • 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像, 从而将应用程序与基础架构分离。
  • 可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  • 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
  • 资源隔离:可预测的应用程序性能,资源利用:高效率和高密度。

2-kubernetes vs Docker Swarm

Docker是一种容器管理服务,帮助开发人员设计应用程序,使用容器能更容易地创建、部署和运行应用程序。Docker有一个用于集群容器的内置机制,称为集群模式(swarm mode)。使用集群模式,可以使用Docker引擎在多台机器上启动应用程序。Docker Swarm是Docker自己针对Docker容器的原生集群解决方案,它的优点是紧密集成到Docker的生态系统中,并且使用自己的API。它监视跨服务器集群的容器数量,是创建集群docker应用程序的最方便的方法,不需要额外的硬件。它为Dockerized应用程序提供了一个小型但有用的编排系统。

2.1 Docker Swarm优点

1、更快的运行速度: 使用虚拟环境时,可能已经意识到它需要很长时间,并且包含了启动和启动您想要运行的应用程序的冗长过程。对于Docker Swarm来说,这不再是一个问题。DockerSwarm不需要启动一个完整的虚拟机,就可以让应用程序在虚拟和软件定义的环境中快速运行,并有助于DevOps的实现。

2、文档提供了所有的信息: Docker团队在文档方面非常突出! Docker正在快速发展,并且非常受欢迎。如果平台的一个版本在短时间间隔内发布,有些平台可能不维护文档。但是Docker Swarm从不这样,如果一些信息只适用于Docker Swarm的特定版本,那么相应文档将确保更新了所有信息。

3、快速简单的配置: Docker Swarm的一个主要优点是它简化了问题。Docker Swarm使用户可以自己配置,将其放入代码中并轻松部署。由于Docker Swarm可以在各种环境中使用,因此需求不受应用程序环境的约束。

4、确保程序独立(容器间低耦合):Docker Swarm负责将每个容器与其他容器隔离,并拥有自己的资源。可以部署各种容器,以便在不同的堆栈中运行单独的应用程序。除此之外,Docker Swarm将在每个应用程序在自己的容器上运行时清除应用程序的删除。如果不再需要应用程序,可以删除它的容器。它不会在您的主机OS上留下任何临时文件或配置文件。

5、版本控制和组件重用:使用Docker Swarm,可以跟踪容器的连续版本、检查差异或回滚到前面的版本。容器重用来自前一层的组件,这使得它们非常轻量级。

2.2 Docker Swarm缺点

1、Docker依赖于平台: Docker Swarm是一个为Linux设计的平台。虽然Docker支持Windows和MacOS X,但它使用虚拟机在非linux平台上运行。设计为在Windows上的Docker容器中运行的应用程序不能在Linux上运行,反之亦然。

2、不提供存储选项: Docker Swarm不提供将容器连接到存储的简便方法,这是主要缺点之一。它的数据量需要对主机和手动配置进行大量的改进。如果想要Docker Swarm解决存储问题,也能办到,但是方式并不高效,且这种方式对用户并不友好。

3、监控不良: Docker Swarm提供关于容器的基本信息,如果正在寻找基本的监控解决方案,那么使用Stats命令就足够了。如果正在寻找先进的监控,那么Docker集群不是好的选择。虽然有像CAdvisor这样的第三方工具可以提供更多的监控,但是使用Docker本身实时收集更多关于容器的数据是不可行的。

为了避免这些不足,这个时刻Kubernetes横空出世,当在多台机器上的多个容器中使用不同组件开发应用程序时,需要一个工具来管理和协调容器。这个时刻
在Kubernetes的帮助下解决问题!!!

2.3 Kubernetes优点

Kubernetes 提供了一个可弹性运行分布式系统的框架,Kubernetes 会满足扩展要求、故障转移、部署模式等。

  • 服务发现和负载均衡

    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚

    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算

    Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。

  • 自我修复

    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

2.4 Kubernetes缺点

Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。 由于 Kubernetes 在容器级别而不是在硬件级别运行,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡、日志记录和监视。 但是,Kubernetes 不是单体系统,默认解决方案都是可选和可插拔的。 Kubernetes 提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。

  • 不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。

  • 不部署源代码,也不构建应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。

  • 不提供应用程序级别的服务作为内置服务。例如中间件(例如,消息中间件)、 数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存、集群存储系统 (例如,Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制来访问。

  • 不要求日志记录、监视或警报解决方案。 它提供了一些集成作为概念证明,并提供了收集和导出指标的机制。

  • 不提供或不要求配置语言/系统。它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。

  • 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 相比之下,Kubernetes 包含一组独立的、可组合的控制过程, 这些过程连续地将当前状态驱动到所提供的所需状态。 如何从 A 到 C 的方式无关紧要,也不需要集中控制,这使得系统更易于使用 且功能更强大、系统更健壮、更为弹性和可扩展。

2.5 Swarm vs Kubernetes 小结

Docker Swarm Kubernetes
开发者 Docker 公司 谷歌
发布年份 2013 2014
公司使用 Bugsnag,Bluestem Brands,
Hammerhead,Code Picnic,Dialonce。
Asana,Buffer,CircleCI,
Evernote,Harvest,Intel,
Starbucks,Shopify。
Controller Manager Master
Storage Volumes Persistent and Epherma
公共云服务提供商 Google,Azure,AWS,OTC Azure
兼容性 不那么广泛和可定制 更广泛和高度可定制
安装 易于设置 需要时间安装
容差率 低容错性 高容错性
大集群 对于强集群状态考虑速度 在不考虑速度的情况下,即使在大型
集群中也提供容器部署和扩展
负载均衡(Loading Balancing) 当容器中的pod定义为服务时,提供负载平衡 通过集群中的任何节点提供自动的内部负载平衡
部署单位 Task Pod
Port Published Port Endpoint
社区 活跃的用户群,定期更新各种应用程序的映像 获得开源社区和谷歌,亚马逊,微软和IBM等大公司的大力支持
缺点 没有供应商的认证计划。大多数组织需要商业认证版本 倾向于开发人员而不是中央IT。
优点 主要由可以决定产品方向的单一供应商控制。 明确的市场领导者 最高的采用率。
Slave Worker Nodes
容器设置 功能由Docker API提供并受其限制 客户端API和YAML, 在Kubernetes中是唯一的。
可扩展性 即使在大型容器中也可以快速部署容器。 以牺牲速度为代价为集群状态提供强有力的保证。

无论选择Kubernetes还是Docker,两者都被认为是最好的,并且有相当大的差异。在这两者之间做出选择的最好方法可能是考虑哪一个您已经比较熟悉,或者哪一个适合现有的软件堆栈。如果需要开发复杂的应用程序,请使用Kubernetes如果希望开发小型应用程序,请使用Docker Swarm。此外,选择正确的项目是一项非常全面的任务,完全取决于项目需求和目标受众。

3-Kubernetes组件

1、一个 Kubernetes 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点。

工作节点托管作为应用负载的组件的 Pod ,控制平面管理集群中的工作节点和 Pod 。 为集群提供故障转移和高可用性,这些控制平面一般跨多主机运行,集群跨多个节点运行。

k8s-集群安装_第2张图片

3.1 官方文档

1、kubernetes官网地址:https://kubernetes.io/

k8s-集群安装_第3张图片

2、kubernets中文社区地址:https://www.kubernetes.org.cn/

k8s-集群安装_第4张图片

3.2 控制平面组件(Control Plane Components)

控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas 字段时,启动新的 pod)。
控制平面组件可以在集群中的任何节点上运行。然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。

1、kube-apiserver(所有服务访问统一入口)

  • 主节点上负责提供 Kubernetes API 服务的组件,它是 Kubernetes 控制面的前端,kube-apiserver是Kubernetes最重要的核心组件之一。
  • 提供集群管理的REST API接口,包括认证授权,数据校验以及集群状态变更等
  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
  • 生产环境可以为apiserver做LA或LB。在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩。 参见构造高可用集群。

2、etcd(键值对数据库 储存K8S集群所有重要信息(持久化)

  • etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。Kubernetes 集群的 etcd 数据库通常需要有个备份计划,也可以使用外部的ETCD集群。

  • kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等。都需要持久化。etcd就是它的数据中心。生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点。

  • 这里只部署一个节点在master,etcd也可以部署在kubernetes每一个节点,组成etcd集群。如果已经有etcd外部的服务,kubernetes直接使用外部etcd服务。

3、 kube-scheduler(负责介绍任务,选择合适的节点进行分配任务)

  • 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。
  • kube-scheduler负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。

4、kube-controller-manager(在主节点上运行控制器的组件)

  • Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。
  • kube-controller-manager由一系列的控制器组成,像Replication Controller控制副本,Node Controller节点控制,Deployment Controller管理deploymentcloud-controller-manager在Kubernetes启用Cloud Provider的时候才需要,用来配合云服务提供商的控制。

5、云控制器管理器-(cloud-controller-manager)

  • cloud-controller-manager 运行与基础云提供商交互的控制器,cloud-controller-manager 二进制文件是 Kubernetes 1.6 版本中引入的 alpha 功能。
  • cloud-controller-manager 仅运行云提供商特定的控制器循环。必须在 kube-controller-manager 中禁用这些控制器循环,可以通过在启动 kube-controller-manager 时将 --cloud-provider 参数设置为external 来禁用控制器循环。
  • cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展。在以前的版本中,核心的 Kubernetes 代码依赖于特定云提供商的代码来实现功能。在将来的版本中,云供应商专有的代码应由云供应商自己维护,并与运行 Kubernetes 的云控制器管理器相关联。

6、kubectl(主节点上的组件)

  • kubectl是Kubernetes的命令行工具,是Kubernetes用户和管理员必备的管理工具。
  • kubectl提供了大量的子命令,方便管理Kubernetes集群中的各种功能。

3.3 Node 组件

节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

1、kubelet(直接跟容器引擎交互实现容器的生命周期管理)

  • 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。
  • 一个在集群中每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。
  • 每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源。

2、kube-proxy(负责写入规则至 IPTABLES、IPVS 实现服务映射访问的)

  • 一个在集群中每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,是让我们的服务在集群外可以被访问到的重要方式。

3、 容器运行环境(Container Runtime)

  • 容器运行环境是负责运行容器的软件。
  • Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI(容器运行环境接口)。

3.4 插件(Addons)

插件使用 Kubernetes 资源 (DaemonSet, Deployment等) 实现集群功能。因为这些提供集群级别的功能,所以插件的命名空间资源属于 kube-system 命名空间。
所选的插件如下所述:有关可用插件的扩展列表,请参见插件 (Addons)。

1、KUBE-DNS

kube-dns为Kubernetes集群提供命名服务,主要用来解析集群服务名和Pod的hostname。目的是让pod可以通过名字访问到集群内服务。它通过添加A记录的方式实现名字和service的解析。普通的service会解析到service-ip,headless service会解析到pod列表。

2、用户界面(Dashboard)
Dashboard 是 Kubernetes 集群的通用基于 Web 的 UI。它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。

3、容器资源监控
容器资源监控将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。

4、 集群层面日志
集群层面日志 机制负责将容器的日志数据保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。

4-Kubernetes安装与配置

4.1 硬件要求

序列号 硬件 基本要求
1 CPU 至少2核
2 内存 至少4G
3 硬盘 至少40G

购买5台阿里云服务器(镜像推荐centos7.8),推荐按量付费!!!

购买阿里云服务器,参考文档:https://blog.csdn.net/hxy1625309592/article/details/118062280

k8s-集群安装_第5张图片

服务器名称和私服地址

主机名 IP地址
k8s-master01 172.21.251.255
harbor-01 172.21.251.254
k8s-node01 172.21.252.0
k8s-node02 172.21.252.1
k8s-node03 172.21.252.2

4.2 CentOS源配置

1、查看centos系统版本命令

cat /etc/centos-release

2、配置阿里云yum源

1.下载安装wget
yum install -y wget

2.备份默认的yum
mv /etc/yum.repos.d /etc/yum.repos.d.backup

3.设置新的yum目录
mkdir -p /etc/yum.repos.d

4.下载阿里yum配置到该目录中,选择对应版本
wget -O /etc/yum.repos.d/CentOS-Base.repo \http://mirrors.aliyun.com/repo/Centos-7.repo

5.更新epel源为阿里云epel源
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

6.重建缓存
yum clean all
yum makecache

3、升级Linux系统内核。

1、rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm 
2、yum --enablerepo=elrepo-kernel install -y kernel-lt 
3、grep initrd16 /boot/grub2/grub.cfg 
4、grub2-set-default 0
5、重启系统: reboot

k8s-集群安装_第6张图片

4、查看centos系统内核

uname -r
uname -a

5、更新一下软件包

yum repolist
yum update

6、阿里云实例关机以后,内核会从新回到旧内核,所以需要从新设置centos7切换启动内核。

# 查看当前系统内核
[root@k8smaster01 ~]# uname -r
3.10.0-1160.31.1.el7.x86_64

# 查看可使用的内核列表
[root@k8smaster01 ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (3.10.0-1160.31.1.el7.x86_64) 7 (Core)
1 : CentOS Linux (5.4.127-1.el7.elrepo.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-20200914151306980406746494236010) 7 (Core)
# 查看当前默认内核启动项
[root@k8smaster01 ~]# grub2-editenv list

# 即系统当前启动时默认加载的内核是 CentOS Linux (3.10.0-1160.31.1.el7.x86_64) 7 (Core)
saved_entry=CentOS Linux (3.10.0-1160.31.1.el7.x86_64) 7 (Core)

# 更改默认启动内核项
[root@k8smaster01 ~]# grub2-set-default 1

# 再次查看默认内核启动项,发现saved_entry字段变为1
[root@k8smaster01 ~]# grub2-editenv list
saved_entry=1

# 重启系统
[root@k8smaster01 ~]# reboot

## 查看当前系统内核,可以看到当前系统的内核已经更改!!!
[root@k8smaster01 ~]# uname -r
5.4.127-1.el7.elrepo.x86_64

k8s-集群安装_第7张图片

4.3 docker安装前置条件

1、查看内存命令

free
free -h

2、查看硬盘信息

fdisk -l 

k8s-集群安装_第8张图片
3、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

4、关闭selinux

[root@k8smaster01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
[root@k8smaster01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@k8smaster01 ~]# 

5、网桥过滤

vim /etc/sysctl.conf
# 添加以下网桥
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward=1
net.ipv4.ip_forward_use_pmtu = 0
# 生效命令
sysctl --system
# 查看效果
sysctl -a|grep "ip_forward"

k8s-集群安装_第9张图片
6、开启IPVS

# 安装IPVS
yum -y install ipset ipvsdm

# 编译ipvs.modules文件
vi /etc/sysconfig/modules/ipvs.modules

# 文件内容如下
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

# 赋予权限并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack_ipv4

k8s-集群安装_第10张图片

# 重启电脑,检查是否生效
reboot
# 查看结果
lsmod | grep ip_vs_rr


7、同步时间

#安装软件
yum -y install ntpdate

# 向阿里云服务器同步时间
ntpdate time1.aliyun.com

# 删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 查看时间
date -R || date


8、命令补全

#安装bash-completion
yum -y install bash-completion bash-completion-extras

#使用bash-completion
source /etc/profile.d/bash_completion.sh

9、关闭swap分区

# 临时关闭
swapoff -a

# 永久关闭
vi /etc/fstab

# 将文件中的/dev/mapper/centos-swap这行代码注释掉
#/dev/mapper/centos-swap swap swap  defaults    0 0

# 确认swap已经关闭:若swap行都显示 0 则表示关闭成功
free -m

10、hosts配置

[root@k8smaster01 ~]# vim /etc/hosts
[root@k8smaster01 ~]# cat /etc/hosts
::1	localhost	localhost.localdomain	localhost6	localhost6.localdomain6
127.0.0.1	localhost	localhost.localdomain	localhost4	localhost4.localdomain4

172.21.251.255	k8smaster01	k8smaster01
172.21.251.254	harbor-01   harbor-01
172.21.252.0	k8s-node01  k8s-node01
172.21.252.1	k8s-node02  k8s-node02
172.21.252.2	k8s-node03  k8s-node03
## 再次重新启动
[root@k8smaster01 ~]# reboot

4.4 安装docker

1、yum安装gcc相关环境

yum -y install gcc
yum -y install gcc-c++

2、yum 包更新到最新

yum update

3、安装需要的软件包,提供yum-config-manager功能,另外两个是devicemapper驱动依赖的。

yum install -y yum-utils device-mapper-persistent-data lvm2

4、添加阿里源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

5、查看docker更新版本

yum list docker-ce --showduplicates | sort -r 

6、安装docker最新版本

yum -y install docker-ce

7、安装后查看docker版本

docker -v

8、启动docker

systemctl start docker

9、开机启动

systemctl enable docker

k8s-集群安装_第11张图片

4.5 阿里云镜像加速

1、先注册一个阿里云账号。

2、查看阿里云,官方文档: https://cr.console.aliyun.com/cn-qingdao/instances/mirrors

3、进入管理控制台设置密码,开通。

4、查看属于自己的加速器

k8s-集群安装_第12张图片

5、配置镜像加速

可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://5bsomu6l.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

6、测试 HelloWorld

docker run hello-world
k8s-集群安装_第13张图片

7、修改Cgroup Driver

# 修改daemon.json,新增文件
[root@k8smaster01 ~]# vim /etc/docker/daemon.json 
[root@k8smaster01 ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://5bsomu6l.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
[root@k8smaster01 ~]# systemctl daemon-reload
[root@k8smaster01 ~]# systemctl restart docker
[root@k8smaster01 ~]# docker info | grep Cgroup
 Cgroup Driver: systemd
 Cgroup Version: 1
[root@k8smaster01 ~]# docker info

注意: 修改cgroupdriver是为了消除安装k8s集群时的告警!!!!

[WARNING IsDockerSystemdCheck]:
detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”.
Please follow the guide at https://kubernetes.io/docs/setup/cri/......

4.6 kubeadm快速安装

1、安装yum源

软件名称 kubeadm kubelet kubectl docker-ce
软件版本 初始化集群管理集群 版本:1.17.5 用于接收api-server指令,对pod生命周期进行管理版本:1.17.5 集群命令行管理工具 版本1.17.5 Docker version 20.10.7

新建repo文件

vim /etc/yum.repos.d/kubernates.repo 

2、文件内容

[root@k8smaster01 ~]# vim /etc/yum.repos.d/kubernates.repo 
[root@k8smaster01 ~]# cat /etc/yum.repos.d/kubernates.repo 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@k8smaster01 ~]# 

3、更新缓存

yum clean all
yum -y makecache

4、验证源是否可用

[root@k8smaster01 ~]# yum list | grep kubeadm
kubeadm.x86_64                           1.21.2-0                      kubernetes
[root@k8smaster01 ~]


5、查看k8s版本

yum list kubelet --showduplicates | sort -r 

6、安装k8s-1.17.5

yum install -y kubelet-1.17.5-0 kubeadm-1.17.5-0 kubectl-1.17.5-0

报错!!!
k8s-集群安装_第14张图片
7、解决方案

[root@k8smaster01 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
--2021-06-22 17:32:32--  https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 14.215.172.221, 14.215.172.219, 14.215.172.216, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|14.215.172.221|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3516 (3.4K) [application/octet-stream]
Saving to: ‘yum-key.gpg’

100%[=================================================================>] 3,516       --.-K/s   in 0.005s  

2021-06-22 17:32:32 (722 KB/s) - ‘yum-key.gpg’ saved [3516/3516]

[root@k8smaster01 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
--2021-06-22 17:32:46--  https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 14.215.172.219, 14.215.172.216, 14.215.172.221, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|14.215.172.219|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 975 [application/octet-stream]
Saving to: ‘rpm-package-key.gpg’

100%[=================================================================>] 975         --.-K/s   in 0s      

2021-06-22 17:32:46 (118 MB/s) - ‘rpm-package-key.gpg’ saved [975/975]

[root@k8smaster01 ~]# rpm --import yum-key.gpg
[root@k8smaster01 ~]# rpm --import rpm-package-key.gpg

重新执行命令,安装成功!!!

yum install -y kubelet-1.17.5 kubeadm-1.17.5 kubectl-1.17.5

k8s-集群安装_第15张图片

4.7 设置kubelet

1、增加配置信息

注意: 如果不配置kubelet,可能会导致K8S集群无法启动。为实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性

[root@k8smaster01 ~]# vim /etc/sysconfig/kubelet
[root@k8smaster01 ~]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
[root@k8smaster01 ~]# 

2、设置开机自行启动

systemctl enable kubelet 

4.8 初始化镜像

1、查看安装集群需要的镜像

kubeadm config images list

k8s-集群安装_第16张图片
2、编写执行镜像的脚本

# 创建data文件夹
[root@k8smaster01 home]# mkdir data
[root@k8smaster01 home]# ls
data
[root@k8smaster01 home]# cd data/
# 创建init.h脚本
[root@k8smaster01 data]# vim init.sh
# 给脚本授权
[root@k8smaster01 data]# chmod 777 init.sh 
[root@k8smaster01 data]# ls
init.sh
[root@k8smaster01 data]# cat init.sh
#!/bin/bash
images=(
 kube-apiserver:v1.17.5
 kube-controller-manager:v1.17.5
 kube-scheduler:v1.17.5
 kube-proxy:v1.17.5
 pause:3.1
 etcd:3.4.3-0
 coredns:1.6.5
)
for imageName in ${images[@]} ;
do
 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
 docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
[root@k8smaster01 data]# ls
init.sh
## 执行脚本
[root@k8smaster01 data]# ./init.sh 

k8s-集群安装_第17张图片

3、打包Kubernetes集群所需的镜像!!!

[root@k8smaster01 data]# docker save -o k8s.1.17.5.tar \
k8s.gcr.io/kube-proxy:v1.17.5 \
k8s.gcr.io/kube-apiserver:v1.17.5 \
k8s.gcr.io/kube-controller-manager:v1.17.5 \
k8s.gcr.io/kube-scheduler:v1.17.5 \
k8s.gcr.io/coredns:1.6.5 \
k8s.gcr.io/etcd:3.4.3-0 \
k8s.gcr.io/pause:3.1
[root@k8smaster01 data]# ls
init.sh  k8s.1.17.5.tar
[root@k8smaster01 data]# 

4.9 导入镜像

1、导入k8s-master01相关镜像

[root@k8s-master01 data]# ls
init.sh  k8s.1.17.5.tar
[root@k8s-master01 data]# docker load -i k8s.1.17.5.tar 
Loaded image: k8s.gcr.io/kube-scheduler:v1.17.5
Loaded image: k8s.gcr.io/coredns:1.6.5
Loaded image: k8s.gcr.io/etcd:3.4.3-0
Loaded image: k8s.gcr.io/pause:3.1
Loaded image: k8s.gcr.io/kube-proxy:v1.17.5
Loaded image: k8s.gcr.io/kube-apiserver:v1.17.5
Loaded image: k8s.gcr.io/kube-controller-manager:v1.17.5
[root@k8s-master01 data]# docker images
REPOSITORY                           TAG       IMAGE ID       CREATED         SIZE
k8s.gcr.io/kube-proxy                v1.17.5   e13db435247d   14 months ago   116MB
k8s.gcr.io/kube-controller-manager   v1.17.5   fe3d691efbf3   14 months ago   161MB
k8s.gcr.io/kube-apiserver            v1.17.5   f640481f6db3   14 months ago   171MB
k8s.gcr.io/kube-scheduler            v1.17.5   f648efaff966   14 months ago   94.4MB
k8s.gcr.io/coredns                   1.6.5     70f311871ae1   20 months ago   41.6MB
k8s.gcr.io/etcd                      3.4.3-0   303ce5db0e90   20 months ago   288MB
k8s.gcr.io/pause                     3.1       da86e6ba6ca1   3 years ago     742kB
[root@k8s-master01 data]# 

2、导入所有node节点相关镜像

  • docker load -i k8s.1.17.5.node.tar
  • 所有node节点只需要kube-proxy:v1.17.5pause:3.1这两个镜像。
[root@k8s-node01 data]# ls
k8s.1.17.5.node.tar
[root@k8s-node01 data]# docker -v
Docker version 20.10.7, build f0df350
[root@k8s-node01 data]# docker load -i k8s.1.17.5.node.tar 
fc4976bd934b: Loading layer  53.88MB/53.88MB
682fbb19de80: Loading layer  21.06MB/21.06MB
2dc2f2423ad1: Loading layer  5.168MB/5.168MB
ad9fb2411669: Loading layer  4.608kB/4.608kB
597151d24476: Loading layer  8.192kB/8.192kB
0d8d54147a3a: Loading layer  8.704kB/8.704kB
b5d12e5fbf44: Loading layer  37.81MB/37.81MB
Loaded image: k8s.gcr.io/kube-proxy:v1.17.5
e17133b79956: Loading layer  744.4kB/744.4kB
Loaded image: k8s.gcr.io/pause:3.1
[root@k8s-node01 data]# docker images
REPOSITORY              TAG       IMAGE ID       CREATED         SIZE
k8s.gcr.io/kube-proxy   v1.17.5   e13db435247d   14 months ago   116MB
k8s.gcr.io/pause        3.1       da86e6ba6ca1   3 years ago     742kB
[root@k8s-node01 data]# 

4.10 初始化集群

1、calico官网地址

官网下载地址: https://docs.projectcalico.org/v3.14/manifests/calico.yaml

calico github地址:https://github.com/projectcalico/calico

相关镜像下载

docker pull calico/cni:v3.14.2
docker pull calico/pod2daemon-flexvol:v3.14.2
docker pull calico/node:v3.14.2
docker pull calico/kube-controllers:v3.14.2

2、主节点(k8s-master01)所需的镜像

[root@k8s-master01 data]# docker images
REPOSITORY                           TAG       IMAGE ID       CREATED         SIZE
calico/node                          v3.14.2   780a7bc34ed2   11 months ago   262MB
calico/pod2daemon-flexvol            v3.14.2   9dfa8f25b51c   11 months ago   22.8MB
calico/cni                           v3.14.2   e6189009f081   11 months ago   119MB
calico/kube-controllers              v3.14.2   4815e4106d26   11 months ago   52.8MB
k8s.gcr.io/kube-proxy                v1.17.5   e13db435247d   14 months ago   116MB
k8s.gcr.io/kube-controller-manager   v1.17.5   fe3d691efbf3   14 months ago   161MB
k8s.gcr.io/kube-apiserver            v1.17.5   f640481f6db3   14 months ago   171MB
k8s.gcr.io/kube-scheduler            v1.17.5   f648efaff966   14 months ago   94.4MB
k8s.gcr.io/coredns                   1.6.5     70f311871ae1   20 months ago   41.6MB
k8s.gcr.io/etcd                      3.4.3-0   303ce5db0e90   20 months ago   288MB
k8s.gcr.io/pause                     3.1       da86e6ba6ca1   3 years ago     742kB
[root@k8s-master01 data]#

配置hostname

hostnamectl set-hostname k8s-master01

配置ip地址

[root@k8s-master01 data]# hostnamectl set-hostname k8s-master01
[root@k8s-master01 data]# cat /etc/hosts
::1	localhost	localhost.localdomain	localhost6	localhost6.localdomain6
127.0.0.1	localhost	localhost.localdomain	localhost4	localhost4.localdomain4

172.21.252.3	k8s-master01	k8s-master01
172.21.252.4	k8s-node01      k8s-node01
172.21.252.5	k8s-node02      k8s-node02
172.21.252.6	k8s-node03      k8s-node03
172.21.252.7	harbor-01       harbor-01
172.21.252.8    jenkins-01      jenkins-01
172.21.252.9    gitlab-01       gitlab-01
172.21.252.10   jenkinsagent-01 jenkinsagent-01
[root@k8s-master01 data]# 

导入calico.yaml文件到/home/data目录

k8s-集群安装_第18张图片
3、初始化集群信息calico网络

kubeadm init --apiserver-advertise-address=172.21.252.3 \
--kubernetes-version v1.17.5 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.81.0.0/16

k8s-集群安装_第19张图片

4、执行配置命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5、所有的node节点加入集群信息

kubeadm join 172.21.252.3:6443 --token regn8z.k0staauvkkwbm1xs \
    --discovery-token-ca-cert-hash sha256:cb4f75aa0e08d1ae4f65b972ebf04ff9ba5836a1d42248c9d453fd85e7ed46d9 
k8s-集群安装_第20张图片

加入成功,查看所有集群节点!!!

kubectl get nodes

k8s-集群安装_第21张图片
6、初始化网络。

kubectl  apply -f 

查看网络状态

[root@k8s-master01 data]# kubectl  apply -f  calico.yml 
serviceaccount/calico-kube-controllers created
## 查看节点
[root@k8s-master01 data]# kubectl get nodes
NAME           STATUS   ROLES    AGE    VERSION
k8s-master01   Ready    master   113m   v1.17.5
k8s-node01     Ready    <none>   103m   v1.17.5
k8s-node02     Ready    <none>   98m    v1.17.5
k8s-node03     Ready    <none>   98m    v1.17.5
## 监控状态!!!!
[root@k8s-master01 data]# kubectl get nodes -w
NAME           STATUS   ROLES    AGE    VERSION
k8s-master01   Ready    master   113m   v1.17.5
k8s-node01     Ready    <none>   103m   v1.17.5
k8s-node02     Ready    <none>   98m    v1.17.5
k8s-node03     Ready    <none>   98m    v1.17.5
k8s-node01     Ready    <none>   103m   v1.17.5

7、kubectl命令自动补全

[root@k8s-master01 data]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@k8s-master01 data]# source ~/.bash_profile
[root@k8s-master01 data]# 

你可能感兴趣的:(#,K8S)