共计 6552 个字符,预计需要花费 17 分钟才能阅读完成。
1. 引言
在过来,咱们在进行程序部署的时候,是间接将环境和程序对立配置部署到主机上,然而这样做容易造成程序与程序之间的混同,所以为了解决这种问题,咱们能够搭建一台不可变的虚拟机镜像,将环境和程序配置部署到虚拟机镜像中,然而虚拟机镜像部署存在体量过于宏大并且不可挪动的问题,所以容器技术应运而生,容器技术是基于操作系统级别的虚拟化技术,各个容器与宿主机是隔离的,各个容器之间也是是隔离的,它比虚拟机镜像更容易搭建,并且能够很不便在不同的主机上挪动。然而随着分布式、集群等技术在理论利用中越来越多,在理论的生产环境中,咱们可能会波及到多个容器,而这些容器可能会逾越多个服务器主机进行部署,所以一个基于容器技术的分布式架构解决方案利用而生,它就是 Kubernetes。
2. Kubernetes 的概念
Kubernetes(k8s)是一个基于容器技术的的分布式架构解决方案,是 Google 开源的容器集群管理系统,Google 外部称为 Borg, 次要用于主动部署、扩大和治理容器化的应用程序,是以 Docer 为根底的分布式系统架构。Kubernetes 能够对分布式系统进行完满的撑持,它具备欠缺的集群控制能力,内建有智能的负载均衡器,领有弱小的故障发现和自我修复能力。同时还针对开发、部署测试、运维监控等提供了欠缺的管理工具。
Kubernetes 的核心思想是:所有以服务为核心,依据这一核心思想,Kubernetes 能够让在其上构建的零碎独立运行在物理机、虚拟机群或者云上,所以,Service(服务)是 Kubernetes 进行分布式集群构建的外围,必须领有如下要害特色:
- 领有一个惟一指定的名称。
- 领有一个虚构 IP 和端口。
- 可能提供某种近程服务能力。
- 能够被映射到提供这种近程服务能力的一组容器利用上。
3. Kubernetes 的术语
3.1 Master
Kubernetes 的集群管制节点,负责整个集群的治理和管制,领有一个 etcd 服务,用来保留所有资源对象的数据,咱们执行的所有管制命令会发给他,他负责具体的执行过程,Master 节点通常会独占一个服务器,在其上会运行以上一组要害的过程:
- Kubernetes API Server: 提供 Http Rest 接口的要害服务过程,是 Kubernetes 中增、删、改、查等操作的惟一入口,是集群管制的入口过程。
- Kubernetes Controller Manager:Kubernetes 中所有资源对象的自动化控制中心。
- Kubernetes Scheduler: 负责资源调度的过程。
3.2 Node
Kubernetes 集群中的其余机器被称为 Node 节点,Node 节点能够是一台物理主机,也能够是一台虚拟机,每个 Node 节点会被 Master 节点调配一些负载,所以 Node 节点是 Kubernetes 集群中工作负载节点,当某个 Node 节点宕机时,工作负载会被 Master 主动转移到其余节点。Node 节点之上会运行一组要害过程:
- kubelet: 负责 Pod 对应容器的创立,启动、进行等工作。
- kube-proxy: 实现 Kubernetes Service 通信与负载平衡机制的重要组件。
- Docker Engine:Docker 引擎,负责容器的创立和治理
3.3 Pod
Pod 是 Kurbernetes 进行创立、调度和治理的最小单位,Pod 运行在 Node 节点之上,其中蕴含多个业务容器,这些业务容器之间共享网络命名空间、Ip 地址、端口,能够通过 localhost 进行通信。Pod 有两种类型:一般 Pod 和动态 Pod。
3.4 Replication Controller
Kurbernetes 用来治理和保障集群中领有的 Pod。
4. Kubernetes 的架构
Kubernetes 的一切都是基于分布式的,上面这张图就是 Kubernetes 的架构图
通过这张架构图咱们发现 Kurbernetes 次要由以下几个外围组件组成:
- Etcd: 保留整个集群的状态。
- API Server: 提供认证、受权、访问控制、API 注册和发现等机制,是资源操作的惟一入口。
- Kurbernetes Controller:负责保护集群的状态。
- Scheduler:负责资源的调度。
- kubelet:负责保护容器的生命周期,同时治理 Volume 和网络。
- Container:负责镜像治理以及 Pod 和容器的真正运行。
- kube-proxy:负责为 Service 提供 cluster 外部的服务发现和负载平衡。
5. Kubernetes 的搭建
5.1 筹备工作
因为 Kubernetes 的一切都是基于分布式的,那么,要想搭建 Kubernetes 就须要筹备多台服务器主机,因为条件无限,这里我采纳搭建多台虚拟机零碎的形式进行,所以须要将虚拟机和镜像零碎筹备好。
- 虚拟机:这里的虚拟机我采纳的是 VMware, 当然也能够采纳 VirtualBox,VMware 下载地址如下:https://www.vmware.com/cn.html
- 镜像零碎:虚拟机的镜像零碎我采纳的是:CentOS-7-x86_64-DVD-1810,下载地址如下:http://mirrors.zju.edu.cn/cen…
5.2 虚拟机环境搭建
咱们筹备装置三个虚拟机节点,一个为 Kubernetes 的 Master 节点,剩下两个为 Kubernetes 的 Node 节点,这里咱们只演示第一个装置第一个节点,剩下的两个节点,采纳 VMware 复制镜像的形式进行。
5.2.1 虚拟机环境要求
搭建 Kubernetes,虚拟机环境至多要满足以下要求:
- 操作系统 CentOS 7
- 内存 2G【至多】
- CPU 2 核【至多】
- 硬盘 20G【至多】
5.2.2 创立虚拟机
关上 VMware,抉择“文件”菜单“新建虚拟机”选项,或者间接点击界面上的“创立新的虚拟机”选项,创立新的虚拟机,如下图所示:
在弹出的弹窗中抉择“经典”选项,点击“下一步”按钮,如下图所示:
在弹出的新的弹窗中抉择“稍后装置操作系统”选项,点击“下一步”按钮,如下图所示:
在弹出的新的弹窗中抉择客户机操作系统为“Linux”,版本为“CentOS 64 位”,点击“下一步”按钮,如下图所示:
在弹出的新的弹窗中设置虚拟机名称为“K8S_Node1”, 抉择虚拟机零碎的装置地位,点击“下一步”按钮,如下图所示:
在弹出的新的弹窗中设置最大磁盘大小为 20G, 抉择“将虚构磁盘存储为单个文件”,点击“下一步”按钮,如下图所示:
在弹出的新的弹窗中抉择“自定义硬件”选项
在弹出的硬件配置弹窗中,内存设置为 2048M,如下图所示:
处理器设置为 2 个,如下图所示:
镜像文件抉择本地下载好的镜像文件,如下图所示:
设置完内存、解决、镜像文件之后,点击“敞开”按钮,回到新建虚拟机向导页面,点击“实现”按钮,实现新建虚拟机。
5.2.3 装置操作系统
在新建好虚拟机之后,在 VMware 主界面,抉择对应的虚拟机,点击“开启此虚拟机”选项,启动虚拟机,如下图所示:
在关上的零碎界面中抉择“Install CentOS 7”, 进行 CentOS 7 零碎的装置,如下图所示:
在关上的界面中抉择中文语言环境,点击“持续”按钮,持续进行装置,如下图所示:
在关上的界面中进行装置配置,如下图所示:
留神:” 软件抉择”倡议抉择最初一个“开发及生产工作站”,“装置地位”抉择默认“主动分区”,禁用 Kdump,关上网络,让你的虚拟机能够连贯到互联网。
在新关上的页面中设置 Root 明码,进行装置 CentOS 7 零碎
装置实现后,会进入到零碎的根本配置操作页面,能够进行语言环境的配置,如下图所示:
零碎键盘布局和输出形式抉择配置,如下图所示:
最初点击“开始应用 CentOS Linux(s)”按钮,开始进入到 CentOS 7 零碎中,如下图所示:
进入零碎之后,应用“ifconfig”指令查看零碎的 ip 地址,发现没有 ip 地址,如下图所示:
没有 ip 地址的起因,查看之前 2.2.8 的配置步骤,发现曾经配置了网络适配器为 NAT,那没有 ip 地址的起因可能就是零碎在启动的时候没有加载网卡造成的,所以应用“vi”指令关上“/etc/sysconfig/network-scripts/ifcfg-ens33”文件,将其中的“ONBOOT=no”改为“ONBOOT=yes”, 应用“wq”指令保留文件,如下图所示:
批改文件之后,须要通过“service network restart”重启网络服务,之后再应用“ifconfig”指令查看,就会发现 ip 地址就有了,如下图所示:
5.2.4 近程操作操作系统
因为在操作系统的终端中间接操作指令不太不便,比拟好的办法是应用第三方的终端模仿软件,比方 Xshell、SecureCRT 登录,我这里应用的是 SecureCRT 进行操作。关上 SecureCRT 软件,配置一个连贯,连贯 CentOS 7 操作系统,如下图所示:
在近程连贯胜利之后,咱们还须要配置 CentOS 7 的 yum 源,因为应用 CentOS 7 自带的 yum 源,在装置软件和下载依赖的时候会十分的慢,甚至有时候还会超时失败,所以这里不倡议应用 CentOS 7 自带的 yum 源,咱们能够执行如下命令,应用阿里云的源替换 CentOS 7 自带的 yum 源,如下图所示:
思考到后续咱们须要装置 Kubernetes 集群须要各种网络,所以须要将防火墙敞开,防止因为防火墙的问题导致连网失败,如下图所示:
在装置 Kubernetes 集群的时候,为了防止因为内存交互而影响性能以及稳定性,所以这里咱们须要敞开 Swap 内存交互机制。应用“vi”指令关上“/etc/fstab”文件,将其中的 swap 配置正文掉,如下图所示:
5.2.5 装置 Docker
Kubernetes 是以 Docker 为根底的一个全新的分布式系统架构, 装置 Kubernetes 必须先装置 Docker,能够参考 Docker 官网文档进行操作:https://docs.docker.com/insta…
因为应用 yum 装置 Docker 的时候常常会超时失败,所以能够增加阿里云的 Docker 仓库,如下图所示:
应用 yum 装置 Docker 最新版本,如下图所示:
执行如下命令启动 Docker 并激活开机主动启动,如下图所示:
5.3 Kubernetes 集群搭建
虚拟机环境咱们在上边曾经搭建好了,接下来咱们就该搭建 Kubernetes 集群,咱们将当初的虚拟机作为主节点,先装置 Kubernetes,之后再复制出两个虚拟机作为工作节点。
5.3.1 装置 Kubernetes
咱们能够参考 Kubernetes 官网文档进行装置 Kubernetes,上面是官网文档网址:https://kubernetes.io/docs/se… 官网仓库因为被墙的起因咱们无奈应用,所以还是应用阿里云的仓库,执行以下命令增加 kubernetes 仓库:
Linux 会对咱们的拜访进行管制,所以须要敞开,如下图所示:
5.3.2 装置 kubelet、kubeadm、kubectl
执行以下的指令装置 Kubernetes 的 kubelet、kubeadm、kubectl,如下图所示:
执行以下的指令配置 kubelet 的 cgroup drive,要和 docker 的 cgroup drive 保持一致,如下图所示:
执行以下指令,启动 kubelet
然而启动 kubelet 会失败,因为短少证书,然而不必放心,之后咱们在执行 kubeadm init 命令的时候会创立证书,这里不启动也不影响后续的配置。
5.3.3 下载 Kubernetes 的 Docker 镜像
接下来咱们须要应用 Kubernetes 官网提供的 kubeadm 工具来初始化 Kubernetes 集群,然而 kubeadm init 默认会拜访谷歌服务器,应用的 Docker 镜像仓库是 k8s.gcr.io,国内是无法访问的,咱们能够应用 docker.io/mirrorgooglecontainers 直达一下,所以须要执行以下命令,如下图所示:
然而 coredns 没蕴含在 docker.io/mirrorgooglecontainers 中,所以须要手工到 coredns 官网镜像转换下,执行以下命令进行操作,如下图所示:
最初通过“docker images”查看所有的镜像,会发现所有镜像都曾经下载实现,如下图所示:
5.4 复制虚拟机
下面执行实现,Kubernetes 就曾经装置结束了,接下来就须要复制虚拟机将其余节点创立进去。
5.4.1 复制虚拟机
敞开之前的虚拟机,在 VMware 的界面中,右键点击第一个节点,我这里叫做 K8S_Node1, 抉择“治理”选项中的“克隆”选项,开始复制虚拟机,如下图所示:
进入到抉择克隆源的抉择,抉择“虚拟机中的以后状态”选项,而后点击“下一步”按钮,如下图所示:
在弹出的抉择克隆类型的窗口中抉择“创立残缺克隆”选项,点击“下一步”按钮,如下图所示:
在弹出的设置新的虚拟机名称的窗口中设置新的虚拟机的名称为 K8S_Node2, 并设置保留地位,而后点击“实现”按钮,进行复制操作,如下图所示:
反复下面的步骤复制闻名称为 K8S_Node3 的虚拟机。
5.4.2 设置虚拟机网络
复制虚拟机完结之后,咱们会发现三个节点 ip 为:
- K8S_Node1:192.168.149.129
- K8S_Node2:192.168.149.130
- K8S_Node3:192.168.149.131
然而咱们还须要进行一些配置,以便后续操作能够配置连贯,这里以 K8S_Node1 为例:
- 应用“vi”指令编辑“/etc/hostname”文件, 将 hostname 改为 k8s-node1, 留神这里不能大写,不能应用“_”,不然后续的 Kubernetes 配置会出问题,如下图所示:
- 应用“vi”指令编辑“/etc/hosts”文件,在其最初增加 192.168.149.129 k8s-node1,如下图所示:
配置结束之后,重启失效,剩下的两个节点也是如此的配置,这里不再演示。
5.5 创立 Kubernetes 集群
后面的筹备工作都曾经筹备好了,接下来咱们就能够开始创立 Kubernetes 集群了,这里咱们应用之前装置的 kubeadm 来疾速、不便的创立一个 Kubernetes 集群。
5.5.1 初始化 Kubernetes 集群
在主节点 (K8S_Node1) 上执行以下的命令,如下图所示:
当看到如下信息时,就示意 Kubernetes 集群初始化胜利了,如下图所示:
咱们须要将初始化胜利的提示信息中的 kubeadm join 记录下来(之后会应用到),同时须要执行提示信息中对于以下的几个指令,如下图所示:
5.5.2 创立网络
当初始化好 Kubernetes 集群之后,咱们还须要配置网络,以便实现各个节点之间的通信,设置网络能够应用 Calico 或者是 flannel,这里咱们采纳 flannel 来设置网络,如下图所示:
5.6 配置 Kubernetes 集群
当 Kubernetes 集群初始化胜利并设置好网络之后,咱们就须要将 Pod 调度到 Master 上,因为 Kubernetes 默认是不会将 Pod 调度到 Master 中,所以咱们须要手动设置。
5.6.1 将 Master 作为工作节点
能够执行以下命令,将 Master 节点作为工作节点,如下图所示:
5.6.2 将其余节点增加到集群
在 K8S_Node2 和 K8S_Node3 的节点上执行 K8S_Node1 节点进行 kubeadm init 初始化集群胜利之后提醒的 kubeadm join 指令,将 K8S_Node2 和 K8S_Node3 增加到集群中,如下图所示:
如果 kubeadm join 指令失败了,能够执行 kubeadm reset 进行重置,而后再次执行 kubeadm join。
最初咱们通过“kubectl get nodes”查看节点是否增加到集群中,如下图所示:
到此,Kubernetes 集群就搭建结束了。
6. 总结
通过上述的案例,咱们就能够把 Kubernetes 集群搭建实现,之后咱们能够在此基础上持续搭建 Kubernetes 的 Dashboard,也能够在 Kubernetes 部署 nginx、redis 等软件。总之,通过 Kubernetes 咱们能够很不便的进行分布式、集群操作,很不便的实现在物理机、虚拟机或者是云上进行我的项目的部署和迁徙。