为什么要有Kubernetes

单体应用

在过去,多数的应用都是大型单体应用,以单个进程或几个进程的方式,运行于几台服务器之上。

单体应用由很多个组件组成,这些组件紧密地耦合在一起,由于它们在同一个操作系统进程中运行,所以在开发、部署、管理的时候必须以同一个实体进行。对单体应用来说,即使是某个组件中一个小的修改,都需要重新部署整个应用。组件间缺乏严格的边界定义,相互依赖,日积月累导致系统复杂度提升,整体质量也急剧恶化。

微服务应用

为了解决上述单体应用面临的问题,出现了微服务技术。微服务技术把原先的大型单体应用分解成小的、可独立运行的组件,我们称之为微服务。微服务彼此之间解耦,所以它们可以被独立开发、部署、升级、伸缩。这使得我们可以对每一个微服务实现快速迭代,并且迭代的速度可以和市场需求变化的速度保持一致。

但是,随着部署组件的增多和数据中心的增长,配置、管理并保持系统的正常运行变得越来越困难。如果我们想要获得足够高的资源利用率并降低硬件成本,把组件部署在什么地方变得越来越难以决策。手动做所有的事情,显然不太可行。

另外,不同组件可能需要不同的、可能存在冲突的依赖库版本,或者是其他的不同环境需求。如果这些组件需要部署在同一台服务器上,就变得很困难。而且后续增加新的组件也可能会影响到已有的组件。

容器技术

在同一台服务器上运行不同的组件可能需要不同的、可能存在冲突的依赖库版本,或者是其他的不同环境需求。

当一个应用程序仅由较少数量大组件构成时,完全可以接受给每个组件分配专用的虚拟机,以及通过给每个组件提供自己的操作系统实例来隔离它们的环境。

但是当一个应用程序由大量小组件构成时,用虚拟机就会浪费硬件资源,这时就可以用容器技术。

容器允许你在同 一 台服务器上运行多个组件,可以提供不同的环境给每个组件, 而且将它们互相隔离。 容器类似虚拟机, 但开销小很多。

容器里的进程是和其他进程隔离的。所以对于容器内进程本身而言,就好像是在机器和操作系统上运行的唯一一个进程。

容器与虚拟机的区别

  • 容器更加轻量,开销更小。虚拟机的开销更大。
  • 容器是共用宿主机的Linux内核。虚拟机有独立的Linux内核。
  • 容器运行的进程实际上运行在宿主机的操作系统上,就像所有其他进程一样,只是进程是和其他进程隔离。虚拟机的进程是运行在不同的虚拟机操作系统上的。

Docker

docker是一种容器技术。

docker的三个主要概念:

  • 镜像:Docker镜像里**包含了你打包的应用程序及其所依赖的环境**。它包含应用程序可用的文件系统和其他元数据,如镜像运行时的可执行文件路径。
  • 镜像仓库:Docker镜像仓库用于存放Docker镜像。当你编译你的镜像时,要么可以在编译它的电脑上运行,要么可以先上传镜像到一个镜像仓库,然后下载到另外一台电脑上并运行它。某些仓库是公开的,允许所有人从中拉取镜像,同时也有一些是私有的,仅部分人和机器可接入。
  • 容器:Docker容器基于Docker镜像被创建。一个运行中的容器是一个运行在Docker主机上的进程,但它和主机,以及所有运行在主机上的其他进程都是隔离的。这个进程也是资源受限的,意味着它只能访问和使用分配给它的资源(CPU、内存等)

构建、分发和运行Docker镜像

下图显示了这三个概念以及它们之间的关系。

  1. 开发人员发起构建和推送docker镜像命令。
  2. docker在后台构建镜像
  3. docker推送镜像到镜像仓库中。
  4. 开发人员发起运行镜像命令
  5. docker从镜像仓库中拉取镜像。
  6. 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》
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐