为什么要有Kubernetes
单体应用
在过去,多数的应用都是大型单体应用,以单个进程或几个进程的方式,运行于几台服务器之上。
单体应用由很多个组件组成,这些组件紧密地耦合在一起,由于它们在同一个操作系统进程中运行,所以在开发、部署、管理的时候必须以同一个实体进行。对单体应用来说,即使是某个组件中一个小的修改,都需要重新部署整个应用。组件间缺乏严格的边界定义,相互依赖,日积月累导致系统复杂度提升,整体质量也急剧恶化。
微服务应用
为了解决上述单体应用面临的问题,出现了微服务技术。微服务技术把原先的大型单体应用分解成小的、可独立运行的组件,我们称之为微服务。微服务彼此之间解耦,所以它们可以被独立开发、部署、升级、伸缩。这使得我们可以对每一个微服务实现快速迭代,并且迭代的速度可以和市场需求变化的速度保持一致。
但是,随着部署组件的增多和数据中心的增长,配置、管理并保持系统的正常运行变得越来越困难。如果我们想要获得足够高的资源利用率并降低硬件成本,把组件部署在什么地方变得越来越难以决策。手动做所有的事情,显然不太可行。
另外,不同组件可能需要不同的、可能存在冲突的依赖库版本,或者是其他的不同环境需求。如果这些组件需要部署在同一台服务器上,就变得很困难。而且后续增加新的组件也可能会影响到已有的组件。
容器技术
在同一台服务器上运行不同的组件可能需要不同的、可能存在冲突的依赖库版本,或者是其他的不同环境需求。
当一个应用程序仅由较少数量的大组件构成时,完全可以接受给每个组件分配专用的虚拟机,以及通过给每个组件提供自己的操作系统实例来隔离它们的环境。
但是当一个应用程序由大量的小组件构成时,用虚拟机就会浪费硬件资源,这时就可以用容器技术。
容器允许你在同 一 台服务器上运行多个组件,可以提供不同的环境给每个组件, 而且将它们互相隔离。 容器类似虚拟机, 但开销小很多。
容器里的进程是和其他进程隔离的。所以对于容器内进程本身而言,就好像是在机器和操作系统上运行的唯一一个进程。
容器与虚拟机的区别
- 容器更加轻量,开销更小。虚拟机的开销更大。
- 容器是共用宿主机的Linux内核。虚拟机有独立的Linux内核。
- 容器运行的进程实际上运行在宿主机的操作系统上,就像所有其他进程一样,只是进程是和其他进程隔离。虚拟机的进程是运行在不同的虚拟机操作系统上的。
Docker
docker是一种容器技术。
docker的三个主要概念:
- 镜像:Docker镜像里**包含了你打包的应用程序及其所依赖的环境**。它包含应用程序可用的文件系统和其他元数据,如镜像运行时的可执行文件路径。
- 镜像仓库:Docker镜像仓库用于存放Docker镜像。当你编译你的镜像时,要么可以在编译它的电脑上运行,要么可以先上传镜像到一个镜像仓库,然后下载到另外一台电脑上并运行它。某些仓库是公开的,允许所有人从中拉取镜像,同时也有一些是私有的,仅部分人和机器可接入。
- 容器:Docker容器基于Docker镜像被创建。一个运行中的容器是一个运行在Docker主机上的进程,但它和主机,以及所有运行在主机上的其他进程都是隔离的。这个进程也是资源受限的,意味着它只能访问和使用分配给它的资源(CPU、内存等)
构建、分发和运行Docker镜像
下图显示了这三个概念以及它们之间的关系。
- 开发人员发起构建和推送docker镜像命令。
- docker在后台构建镜像
- docker推送镜像到镜像仓库中。
- 开发人员发起运行镜像命令
- docker从镜像仓库中拉取镜像。
- docker基于镜像创建容器并运行。
Kubernetes介绍
把微服务组件变成容器解决了同一服务器部署多个组件的问题。但是随着系统可部署组件的数量增长,相应的容器数量也在增长,管理它们也越来越困难。Kubernetes(简称k8s)可以解决这样的问题。
Kubernetes集群架构
- k8s集群由N个主节点(Master)(N一般为奇数)和M个工作节点(Worker)组成。
- Master节点主要负责管理和控制。多个主节点(Master)可以组成高可用集群,一旦有个Master节点宕机了,高可用集群通过投票产生1个新的Master。
- Worker节点是工作负载节点,包含具体的容器,主要负责运行用户实际部署的应用。
- 一般,最小的集群是1个Master,2个Node。
注
master,负责集群控制,所以对机器性能要求不高。
worker,可以是虚拟机或物理计算机。因为任务都在这里跑,所以对机器性能要求较高;而且通常都有很多个,可以不断加机器扩大集群。
Kubernetes 组件
下图是官方的k8s架构图。直接看架构图,比较难理解。下面我们把k8s集群类比为生活中的一个集团公司。通过这个方式理解k8s的组件。
控制面板组件(Controller Plane Components)
Master节点的组件。(类比为集团公司总部)
- API Server(kube-apiserver):提供对外的接口,用来控制集群。其他节点想访问Master的组件,一定要先到API Server。Master的组件要访问其他组件,也要通过API Server。(类比为集团公司的秘书部)
- sched(kube-scheduler):控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。根据Worker节点的特性调度pod到哪个节点中运行。(类比为集团公司的调度者)
- etcd:etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。(类比为集团公司的资料库)
- c-m(kube-controller-manager):在主节点上运行控制器组件。(类比为集团公司的决策层)
- c-c-m(cloud-controller-manager):云控制平台,用于跟云平台/云服务提供商做交互。(类比为集团公司的决策层与外部交互的窗口,外联部)
Worker节点的组件
Worker节点的组件。(类比为集团的分子公司)
- kubelet:管理当前节点上运行的容器。保证容器都运行在Pod中。(类比为集团分子公司的总负责人)
- kube-proxy:集群中每个节点上运行的网络代理。kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。(类比为集团分子公司的前台)
- 容器:Docker、rtk或其他的容器类型。(类比为集团分子公司的具体干活的打工仔)
类比后的架构图如下:
基于Kind搭建k8s环境
1. 准备Linux虚拟机
- Centos7
2. 安装docker
2.1.卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
2.2.安装docker
首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
然后输入命令:
yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
2.3.启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
通过命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
然后输入命令,可以查看docker版本:
docker -v
如图:
2.4.配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
https://blog.csdn.net/elong490/article/details/114627211
2.5.设置docker开机自启动
systemctl enable docker.service
3. 安装Kind
# 在本地路径下创建文件夹kind
mkdir -p kind
# 将Kind的二进制文件下载到本地
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.12.0/kind-linux-amd64
# 授权给当前用户执行权限
chmod +x ./kind
# 将可执行文件移动到路径/usr/bin/下(该路径下的二进制文件是全局可执行的)
mv ./kind /usr/bin/kind
# 检查kind版本
kind version
4. 使用Kind创建一个k8s集群
4.1. 创建一个3节点集群(一个Master节点,两个Worker节点)
创建集群配置文件multi.yaml,1个master node,2个worker node。
# three node (two wokers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
# 创建集群
kind create cluster --name kind --config=multi.yaml
# 查询集群
kind get clusters
# 用docker也可以看到两个集群节点的容器
docker ps
#查看节点信息
kubeclt get nodes
4.2. 删除集群
# 查询刚刚新建的集群名
kind get clusters
# 根据集群名称删除集群
kind delete cluster --name k8s-local-dev
5. 安装集群客户端
5.1. 安装kubectl
# 下载最新版本的kubectl命令二进制文件
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 授权二进制文件已执行权限(如果是root用户操作,可以不用sudo)
sudo chmod 777 ./kubectl
# 将kubectl命令移动到/usr/local/bin目录下(这样就可以全局执行了)
mv ./kubectl /usr/local/bin/
# 验证kubectl
kubectl version
查看新集群的信息
# 查看kubectl版本信息
kubectl version
# 查看当前版本
kubectl cluster-info
# 查看集群信息
kubectl config get-clusters
# 查看当前context
kubectl config get-contexts
# 查看当前context
kubectl config current-context
# 查看kubectl访问k8s集群的配置
kubectl config view
# 这是一个配置文件,可以直接打开文件进行修改
cat ~/.kube/config
6. 配置k8s集群
6.1. 为kubectl配置别名和命令行补齐
安装bashcompletion
# 1. 进root权限,安装epel
yum install -y epel-release
# 2. 安装 bash-completion, bash-completion-extras
yum install -y bash-completion bash-completion-extras
# 3. 查看bash_completion.sh
find / -name bash_completion.sh
#结果:/etc/profile.d/bash_completion.sh
# 4. 执行
source /etc/profile
参考资料
- 搭建k8s环境
https://blog.csdn.net/cn_lyg/article/details/132421251
- kind部署集群
https://zhuanlan.zhihu.com/p/589599203
- 《Kubernetes in Action》