0、什么是k8s

虽然容器技术开启了云原⽣时代,但它也只⾛出了⼀⼩步,再继续前进就⽆能为⼒了,因为这已经不再是隔离⼀两个进程的普通问题,⽽是要隔离数不清的进程,还有它们之间互相通信、互相协作的超级问题,困难程度可以说是指数级别的上升。

这些容器之上的管理、调度⼯作,就是这些年最流⾏的词汇:“容器编排”(Container Orchestration)。

⾯对单机上的⼏个容器,“⼈⾁”编排调度还可以应付,但如果规模上到⼏百台服务器、成千上万的容器,处理它们之间的复杂联系就必须要依靠计算机了,⽽⽬前计算机⽤来调度管理的“事实标准”,就是我们专栏的主⻆:Kubernetes(k8s)

简单来说,Kubernetes就是⼀个⽣产级别的容器编排平台和集群管理系统,不仅能够创建、调度容器,还能够监控、管理服务器,从⽽让中⼩型公司也可以具备轻松运维海量计算节点⸺也就是“云计算”的能⼒。

1、什么是minikube

Kubernetes⼀般都运⾏在⼤规模的计算集群上,管理很严格,这就对我们个⼈来说造成了⼀定的障碍,没有实际操作环境怎么能够学好⽤好呢?
好在Kubernetes充分考虑到了这⽅⾯的需求,提供了⼀些快速搭建Kubernetes环境的⼯具,在官⽹(https://kubernetes.io/zh/docs/tasks/tools/)上推荐的有两个:kind和minikube,它们都可以在本机上运⾏完整的Kubernetes环境。

kind基于Docker,意思是“Kubernetes in Docker”。它功能少,⽤法简单,也因此运⾏速度快,容易上⼿。不过它缺少很多Kubernetes的标准功能,例如仪表盘、⽹络插件,也很难定制化,所以它⽐较适合有经验的Kubernetes⽤户做快速开发测试,不太适合学习研究。

minikube,它是⼀个“迷你”版本的Kubernetes,⾃从2016年发布以来⼀直在积极地开发维护,紧跟Kubernetes的版本更新,同时也兼容较旧的版本(最多只到之前的6个⼩版本)。minikube最⼤特点就是“⼩⽽美”,可执⾏⽂件仅有不到100MB,运⾏镜像也不过1GB,但就在这么⼩的空间⾥却集成了Kubernetes的绝⼤多数功能特性,不仅有核⼼的容器编排功能,还有丰富的插件,例如Dashboard、GPU、Ingress、Istio、Kong、Registry等等,综合来看⾮常完善。

所以我选择minikube来学习k8s。

1.1 搭建minikube环境

官⽹上Linux系统安装的命令如下:

# Intel x86_64
curl -Lo minikube
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

# Apple arm64
curl -Lo minikube
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64

sudo install minikube /usr/local/bin/

安装完成之后,你可以执⾏命令 minikube version ,看看它的版本号,验证是否安装成功:

minikube version

不过minikube只能够搭建Kubernetes环境,要操作Kubernetes,还需要另⼀个专⻔的客户端⼯
具“kubectl”。安装执行命令如下:

minikube kubectl

所以,在minikube环境⾥,我们会⽤到两个客户端:minikube管理Kubernetes集群环境,kubectl操作实际的Kubernetes功能,和Docker⽐起来有点复杂。

1.2 实际验证minikube环境

使⽤命令 minikube start 会从Docker Hub上拉取镜像,以当前最新版本的Kubernetes启动集
群。

#启动minikube
minikube start

#查看集群状态
minikube status
minikube node list

在这里插入图片描述
从截图⾥可以看到,Kubernetes集群⾥现在只有⼀个节点,名字就叫“minikube”,类型是“Control Plane”,⾥⾯有host、kubelet、apiserver三个服务,IP地址是192.168.49.2。

还可以⽤命令 minikube ssh 登录到这个节点上,虽然它是虚拟的,但⽤起来和实机也没什么区别:
在这里插入图片描述
有了集群,接下来我们就可以使⽤kubectl来操作⼀下,初步体会Kubernetes这个容器编排系统,最简单的命令当然就是kubectl version查看版本,不过这条命令还不能直接⽤(从上上个截图可以看到执行kubectl version命令后报错),因为使⽤minikube⾃带的kubectl有⼀点形式上的限制,要在前⾯加上minikube的前缀,后⾯再有个 – 。

为了避免这个麻烦,可以使⽤Linux的“alias”功能,为它创建⼀个别名,另外,kubectl还提供了命令⾃动补全的功能,再加上“kubectl completion”:

alias kubectl="minikube kubectl --"
source <(kubectl completion bash)

在这里插入图片描述
现在就可以直接使用kubectl了:
在这里插入图片描述

2、运行一个简单的k8s集群

下⾯在Kubernetes⾥运⾏⼀个Nginx应⽤,命令与Docker⼀样,也是 run ,不过形式上有点
区别,需要⽤ --image 指定镜像,然后Kubernetes会⾃动拉取并运⾏:

kubectl run ngx --image=nginx:alpine

在这里插入图片描述
这⾥涉及Kubernetes⾥的⼀个⾮常重要的概念:Pod,可以暂时把它理解成是“穿了⻢甲”的容器,查看Pod列表需要使⽤命令 kubectl get pod ,它的效果类似 docker ps :

kubectl get pod

在这里插入图片描述
如果这里失败一般是网络问题或者镜像源问题,排查问题过程如下:
(1)执行命令 ping -c 3 baidu.com,如果不通先修复主机网络问题,确保虚拟机的网络设置是NAT模式。
(2)如果网络没问题,那就是Docker镜像源问题,可以在minikube内部修改Docker镜像源配置:

#先登录minikube
minikube ssh   
 
 #确定minikube内部网络通     
ping -c 3 baidu.com   

#修改内部Docker镜像源配置
sudo tee /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.com"
  ]
}
EOF

# 重启 Docker
sudo systemctl restart docker

# 测试拉取镜像
docker pull nginx:alpine

#退出minikube
exit

在这里插入图片描述
网络和镜像源问题修复好以后,删除刚才创建的pod并重新创建:

kubectl delete pod ngx
kubectl run ngx --image=nginx:alpine
kubectl get pod -w

在这里插入图片描述
命令执⾏之后可以看到,在Kubernetes集群⾥有了⼀个名字叫ngx的Pod正在运⾏,表示单节点minikube环境已经搭建成功。

OK,今天了解了容器编排概念,然后在Linux虚拟机上安装了minikube和kubectl,运⾏了⼀个简单但完整的Kubernetes集群,实现了与云原⽣的“第⼀次亲密接触”。

更多推荐