一个计算机技术爱好者与学习者

0%

好好学K8S:K8S入门篇

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
2
sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=https://wrqtu3hz.mirror.aliyuncs.com |g" /var/lib/boot2docker/profile
exit

4、验证配置

1
2
docker-machine restart default
docker info

如果出现Registry Mirrors和加速地址,则表明设置成功。

常用命令:

1
2
3
4
5
6
# 重启电脑后,需要手动启动default虚拟机
docker-machine start default
# default虚拟机IP发生变动时,需要重新生成配置
docker-machine regenerate-certs default
docker-machine env
eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env)

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
2
3
minikube start
# or
minikube start --vm-driver=virtualbox --registry-mirror=https://registry.docker-cn.com

4、验证启动
minikube status

5、启动minikube dashboard
minikube dashboard

其他安装方式参考Install Minikube

3.4. 安装kubectl

1、下载kubectl,同样放到k8s目录。

2、验证安装
kubectl version

4. Hello Minikube

参考Hello Minikube,目标:

  • 将部署hello world应用程序部署到Minikube。
  • 运行应用程序。
  • 查看应用日志。

1、使用git bash启动minikube
minikube start

2、准备镜像

1
2
3
4
5
6
7
8
9
10
# 准备文件
docker pull node:6.14.2
vi server.js
vi Dockerfile
# 创建镜像
docker build -t voidking/hello-node .
# 登录上传
# docker login
winpty docker login
docker push voidking/hello-node

其中server.js写入内容为:

1
2
3
4
5
6
7
8
9
var http = require('http');

var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);

Dockerfile写入内容为:

1
2
3
4
FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD node server.js

3、创建管理Pod的Deployment,Pod根据提供的Docker镜像运行容器。

1
kubectl create deployment hello-node --image=voidking/hello-node

4、查看Deployments和Pods

1
2
3
kubectl get deployments
kubectl get pods
kubectl describe pod hello-node


由上图可以看出,创建pod的过程中,花费时间最长的是下载镜像的步骤,大约10分钟。这里有个疑问,为什么没有使用本地的镜像?

5、创建服务,将Pod公开到公共Internet

1
2
3
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
kubectl get services
minikube service hello-node


在支持负载均衡器的云提供商上,将配置外部IP地址以访问服务。在Minikube上,LoadBalancer类型通过minikube service命令使服务可访问。
打开浏览器,访问:http://192.168.99.103:30378/ ,可以看到 Hello World!

6、查看Pod和Service
kubectl get pod,svc -n kube-system

7、删除service和deployment(可选)

1
2
kubectl delete service hello-node
kubectl delete deployment hello-node

8、关闭集群,删除集群(可选)

1
2
minikube stop
minikube delete

5. minikube常用命令

1
2
3
4
5
6
7
8
9
10
# 进入节点服务器
minikube ssh

# 执行节点服务器命令,例如查看节点 docker info
minikube ssh -- docker info

# 查看插件,启用插件
minikube addons list
minikube addons enable heapster
minikube addons disable heapster

6. 后记

至此,跑通了Minikube的第一个Deployment,k8s的万里长征开始了第一步。接下来继续深入学习,目标是拿到双证:Certified Kubernetes Administrator (CKA) ProgramCertified Kubernetes Application Developer (CKAD) Program,具体要求参考curriculum

7. 书签

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-k8s-start/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~