什么是容器编排
不使用容器编排启动容器组
要了解kubernetes
之前,我们要先看下,什么是容器编排,假设我们需要多个容器来完成我们的业务的时候,我们如何去启动和管理呢?
假设我们有一个博客系统,分为前端和后端业务,我们分别运行在容器中,若我们不使用容器编排,我们可将系统这样布置
我们直接使用容器部署,会产生如下问题
- 需要手动管理容器A、容器B
- 若容器B挂了,容器A并不知晓
关于第一条,手动管理容器,这个可是一个大活儿,如何判断,它两是一个组合? 靠命名规则判断么?
关于第二条,若我们想后端(容器B)若挂了,则一起将前端关闭掉(后端没了,前端毫无意义,除了输出502),若我们自行部署,这个点,很难达到。
使用容器编排启动容器组
好的,以上不足,都可以通过容器编排来解决该问题,可将如上架构修改为
我们将上述自行管理的容器,交由kubernetes
进行管理,利用pod
可以管理其下的所有容器,即容器A和容器B通过探针,可以定时判断后端是否访问不通,若访问不通,则关闭前端。即可解决上述产生的问题。
容器编排工具
容器编排工具,不仅仅有大名鼎鼎的kubernetes
,还有其他的,例如 docker swarm
、docker compose
、Mesosphere Marathon
、以及rancher
等。
容器编排支持哪些容器
这个已经在行业内有了标准,一般而言,只要容器遵守了CRI
规范,则即可被支持。例如,docker
出现的时候,容器还没有规范,所以,docker
就没有遵守CRI
规范,而容器编排工具想要使用的话,则需要安装一个额外的服务才行,例如,kubernetes
要想使用docker
作为运行时,则需要安装插件cri-dockerd
(unix:///var/run/cri-dockerd.sock
)才行。
kubernetes简介
什么是kubernetes
kubernetes
是由谷歌开源出来的一套容器编排工具,其原型为谷歌内部的一个系统: Borg
,k8s
其主要作用为基于容器的分布式解决方案,不仅具有集群管理能力,还有故障发现、自动修复、在线扩容等等高大上的技术实现。
我们可以粗略的认为这是一种容器编排技术即可。
为什么要用kubernetes
我认为其大概有以下一个原因
kubernetes
已经被各大云厂商支持,已经有了生态,包括国内的像 阿里云、腾讯云 等, 海外的 谷歌云、亚马逊 等,相比于传统上线,在k8s
中只用将服务描述文件推出即可,无需考虑负载、负载均衡等。kubernets
特有的功能,如 弹性伸缩、服务监控、负载均衡等,都是由该工具完成的,开发者,更主要注重业务逻辑即可。
安装kubernetes
首先,k8s
作为一种容器编排技术,所以,我们需要提前安装容器,例如 docker
、podman
等。甚至于,你可以直接安装 CRI-O
,不过需要注意下,k8s
是通过如下unix socket
连接他们的。
运行时 | unix socket |
containerd | unix:///var/run/containerd/containerd.sock |
CRI-O | unix:///var/run/crio/crio.sock |
Docker Engine | unix:///var/run/cri-dockerd.sock |
我们使用docker
来做测试
其流程大概可以归纳为如下步骤
我们准备3台机器做安装k8s
,1台master
,2台node
准备工作,需要重命名主机名,且在hosts写入映射
ip | 主机名 |
192.168.11.180 | master |
192.168.11.181 | node1 |
192.168.11.182 | node2 |
安装docker以及cri-docker
安装docker
# yum install docker-ce -y
启动docker 并且查看版本
安装cri-docker
这个直接从github拉包下载即可
目前最新版本为 0.2.1 (2022年5月26日)
# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.1/cri-dockerd-0.2.1.amd64.tgz # tar xf cri-dockerd-0.2.1.amd64.tgz # mv cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerd
查看版本
检查完毕后,直接使用cri-dockerd
启动即可
利用kubeadm安装kubernetes
基础环境安装
由于网络环境因素,按正常逻辑,我们应该直接在google获取源,我们可以在阿里镜像同样获取
需要提前关闭防火墙/selinux等
新增kubernetes.repo文件
安装 kubeadm kuectl kubelet 包
# yum install kubeadm kubectl kubelet -y
关闭swap
# swapoff -a
开启bridge-nf-call-iptables
# modprobe br_netfilter # echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
启动kubelet
# systemctl start kubelet
安装master
使用kubeadm安装k8s
在此过程中,若拉取不到 k8s.gcr.io/pause:3.6 镜像,可以从阿里云拉取,然后给该镜像打个tag就成
# kubeadm init \ --apiserver-advertise-address=192.168.11.180 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.24.0 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16 \ --cri-socket /var/run/cri-dockerd.sock
安装完毕后,会提示如下信息,这个后面加入k8s集群所需的
安装完毕后,需要根据提示操作下kube
配置文件
安装node
将基础环境安装完毕后,直接使用 kubeadm join
加入节点即可
命令
# kubeadm join 192.168.11.180:6443 --token 1itlhu.qnmr6qe13977463x \ --discovery-token-ca-cert-hash sha256:ce5dcd46acddc63b638c25a7fd6fd54b2bf786568e61bb6ba1b9d15119f9f193 \ --cri-socket /var/run/cri-dockerd.sock
执行成功后会显示如下输出
环境校验
总结
kubernetes
是众多容器编排工具的一种,运行时支持3种,containerd
、CRI-O
以及 cri-docker
,注意: 在kubernetes v1.24.0
版本中,Dockershim
已经被弃用了,请选择cri-docker
作为kubernetes
和docker
的中间件,我们之所以用k8s
,一方面在于它强大的服务功能,例如 扩缩容、故障治愈 ,其次在于其生态,目前国内网主流云厂商,基本上都有kubernetes
服务,我们仅需将 产品镜像 和yaml
描述文件 丢上去即可运行,很大程度上解决了环境初始化 和 部署的问题。