K8S入门篇

K8S简介

之前浅薄地研究过Docker容器相关技术,我们知道Docker最开始是一个管理容器的工具,后来发展成为容器云。容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。当容器云专注于资源共享与隔离、容器编排与部署时,它更接近传统的IaaS;当容器云渗透到应用支撑与运行时环境时,它是一种PaaS。

但是,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。于是,Kubernetes出现了,缩写为K8S,8代表“ubernete”这8个字符。

更多内容,参考10分钟看懂Docker和K8S和浙大SEL实验室的《Docker 容器与容器云》。

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 架构原理

Minikube安装

Minikube是在个人计算机上的虚拟机中运行单节点Kubernetes集群的工具。因为minikube要启动virtualbox虚拟机,在虚拟机中运行k8s集群。所以这里有两个安装思路:
思路一、在centos7虚拟机中安装virtualbox,以及minikube。
思路二、在本机win10中安装virtualbox,以及minikube。

对于思路一,经过尝试(详见扩展学习),发现virtualbox不支持Intel处理器的嵌套虚拟化,因此minikube无法在centos7虚拟机中再启动虚拟机,该思路不可行。

本文接下来使用思路二进行安装,默认virtualbox已经安装完成。安装方法主要参考Install Minikube and Docker with VirtualBox on Windows 10 HomeKubernetes 学习笔记之 MiniKube 安装

安装Docker Toolbox

1、下载Docker Toolbox,双击安装。

2、启动Docker Toolbox
打开Docker quickstart terminal,Docker会进行初始化。

镜像加速器

参考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)

安装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

安装kubectl

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

2、验证安装
kubectl version

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

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看集群的所有资源
kubectl get all
kubectl get all -o wide

# 查看集群事件
kubectl get events

# 查看kubectl配置
kubectl config view

# 指定配置文件
kubectl get pods --kubeconfig=/root/.kube/config

# 进入节点服务器
minikube ssh

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

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

更多命令,参考Overview of kubectl

后记

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

扩展学习

CentOS7中安装VBox

在centos7中安装virtualbox,如下流程:

1、添加安装源

1
2
3
4
yum install epel-release
wget -P /etc/yum.repos.d/ http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
yum makecache fast
yum list | grep virtualbox

2、安装virtualbox
yum install VirtualBox-5.2

3、验证安装
vboxmanage -V
报错:

1
2
3
4
5
6
7
8
WARNING: The vboxdrv kernel module is not loaded. Either there is no module
available for the current kernel (3.10.0-957.el7.x86_64) or it failed to
load. Please recompile the kernel module and install it by

sudo /sbin/vboxconfig

You will not be able to start VMs until this problem is fixed.
5.2.32r132073

4、修复
(1)安装gcc等
yum install gcc perl make

(2)安装kernel header
yum install kernel-devel

(3)安装rcvboxdrv
rcvboxdrv setup
如果依然缺少依赖,那么按照提示继续安装,比如
yum install kernel-devel-3.10.0-957.el7.x86_64

(4)再次验证安装
vboxmanage -V

centos7安装minikube

1、安装kubectl
(1)下载最新版kubectl

1
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl

或者下载指定版本kubectl

1
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl

(2)添加执行权限
chmod +x ./kubectl

(3)移动kubectl到bin目录
mv ./kubectl /usr/local/bin/kubectl

(4)验证安装
kubectl version

2、安装minikube
(1)下载minikube

1
2
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
&& chmod +x minikube

(2)移动minikub到bin目录
install minikube /usr/local/bin

(3)验证安装
minikube version

(4)启动minikube
minikube start
如果报错machine does not exist,那么需要清空本地状态:minikube delete

书签

Learn Kubernetes Basics

Interactive Tutorial - Creating a Cluster

Installing Kubernetes with Minikube

Kubernetes 学习路径

学习 Kubernetes 和容器技术体系的最佳方法

0%