1. K8S简介
Docker最开始是一个管理容器的工具,后来发展成为容器云。容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。当容器云专注于资源共享与隔离、容器编排与部署时,它更接近传统的IaaS;当容器云渗透到应用支撑与运行时环境时,它是一种PaaS。
但是,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。于是,Kubernetes出现了。Kubernetes这个单词来自于希腊语,含义是舵手或领航员。缩写为K8S,8代表“ubernete”这8个字符。
更多内容,参考10分钟看懂Docker和K8S和浙大SEL实验室的《Docker 容器与容器云》。
2. K8S架构
K8S起源于Borg,Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理。Borg 的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。
Borg 主要由 BorgMaster、Borglet、borgcfg 和 Scheduler 组成。
- BorgMaster 是整个集群的大脑,负责维护整个集群的状态,并将数据持久化到 Paxos 存储中;
- Scheduer 负责任务的调度,根据应用的特点将其调度到具体的机器上去;
- Borglet 负责真正运行任务(在容器中);
- borgcfg 是 Borg 的命令行工具,用于跟 Borg 系统交互,一般通过一个配置文件来提交任务。
K8S借鉴了Borg的设计理念,整体架构跟 Borg 非常像,一个K8S系统,通常称为一个K8S集群(Cluster)。这个集群主要包括两个部分:一个Master节点(主节点)和一群Node节点(计算节点)。Master节点主要还是负责管理和控制。Node节点是工作负载节点,里面是具体的容器。
Master节点包括API Server、Scheduler、Controller manager、Etcd等。
- API Server提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
- Scheduler负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- Controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- Etcd保存了整个集群的状态。
Node节点包括Docker、Kubelet、Proxy、Pod等。
- Docker负责管理容器。
- Kubelet负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
- Proxy负责为Pod对象提供代理。
- Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口。
除了核心组件,还有一些推荐的 Add-ons:
- kube-dns 负责为整个集群提供 DNS 服务
- Ingress Controller 为服务提供外网入口
- Heapster 提供资源监控
- Dashboard 提供 GUI
- Federation 提供跨可用区的集群
- Fluentd-elasticsearch 提供集群日志采集、存储与查询
更多内容,参考Kubernetes 架构原理。
3. Minikube安装
Minikube是在个人计算机上的虚拟机中运行单节点Kubernetes集群的工具。因为minikube要启动virtualbox虚拟机,在虚拟机中运行k8s集群。所以这里有两个安装思路:
思路一:在centos7虚拟机中安装virtualbox,以及minikube。
思路二:在本机win10中安装virtualbox,以及minikube。
对于思路一,因为virtualbox不支持Intel处理器的嵌套虚拟化,因此minikube无法在centos7虚拟机中再启动虚拟机,该思路不可行。
本文接下来使用思路二进行安装,默认virtualbox已经安装完成。安装方法参考
3.1. 安装Docker Toolbox
1、下载Docker Toolbox,双击安装。
2、启动Docker Toolbox
打开Docker quickstart terminal,Docker会进行初始化。
3.2. 镜像加速器
参考《Docker镜像站的配置和使用》配置镜像加速器,本文中使用阿里云的镜像加速器。
1、访问阿里云镜像加速器,得到一个专属的加速地址。
2、对于Docker Toolbox用户,首先进入default虚拟机docker-machine ssh default
3、设置加速地址
1 | sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=https://wrqtu3hz.mirror.aliyuncs.com |g" /var/lib/boot2docker/profile |
4、验证配置
1 | docker-machine restart default |
如果出现Registry Mirrors和加速地址,则表明设置成功。
常用命令:
1 | # 重启电脑后,需要手动启动default虚拟机 |
3.3. 安装Minikube
1、下载阿里云版minikube v1.2.0,放入k8s目录,重命名为minikube.exe,并加入环境变量。其他版本修改下载的url即可,版本号可以在github aliyun minikube中找到。
之所以使用阿里云版minikube,是因为原版的minikube在国内启动失败,无法下载Minikube ISO镜像。
2、验证安装
右键+Shift打开Powershell,输入minikube version
3、启动minikube
1 | minikube start |
4、验证启动minikube status
5、启动minikube dashboardminikube dashboard
其他安装方式参考Install Minikube。
3.4. 安装kubectl
1、下载kubectl,同样放到k8s目录。
2、验证安装kubectl version
4. Hello Minikube
参考Hello Minikube,目标:
- 将部署hello world应用程序部署到Minikube。
- 运行应用程序。
- 查看应用日志。
1、使用git bash启动minikubeminikube start
2、准备镜像
1 | # 准备文件 |
其中server.js写入内容为:
1 | var http = require('http'); |
Dockerfile写入内容为:
1 | FROM node:6.14.2 |
3、创建管理Pod的Deployment,Pod根据提供的Docker镜像运行容器。
1 | kubectl create deployment hello-node --image=voidking/hello-node |
4、查看Deployments和Pods
1 | kubectl get deployments |
由上图可以看出,创建pod的过程中,花费时间最长的是下载镜像的步骤,大约10分钟。这里有个疑问,为什么没有使用本地的镜像?
5、创建服务,将Pod公开到公共Internet
1 | kubectl expose deployment hello-node --type=LoadBalancer --port=8080 |
在支持负载均衡器的云提供商上,将配置外部IP地址以访问服务。在Minikube上,LoadBalancer类型通过minikube service
命令使服务可访问。
打开浏览器,访问:http://192.168.99.103:30378/ ,可以看到 Hello World!
6、查看Pod和Servicekubectl get pod,svc -n kube-system
7、删除service和deployment(可选)
1 | kubectl delete service hello-node |
8、关闭集群,删除集群(可选)
1 | minikube stop |
5. minikube常用命令
1 | # 进入节点服务器 |
6. 后记
至此,跑通了Minikube的第一个Deployment,k8s的万里长征开始了第一步。接下来继续深入学习,目标是拿到双证:Certified Kubernetes Administrator (CKA) Program和Certified Kubernetes Application Developer (CKAD) Program,具体要求参考curriculum。