一、Kubernetes 基础
1.1 Kubernetes 概述
Kubernetes 是什么
Kubernetes(k8s)是Google开源由CNCF基金会管理的容器集群管理系统。为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能。Kubernetes 被称为现在化的数据中心操作系统,大家都知道,操作系统是用来管理硬件资源比如 CPU、内存、磁盘、输入输出设备等资源的,并完成对这些资源的调度。而 Kubernetes 是将数据中心里的物理节点作为管理对象,并对物理节点上的资源进行调度完成编排任务。操作系统的另一个特性就是容易扩展,比如,当 GPU 这种硬件出现后,操作系统应该很容扩展去管理这种资源,Kubernetes 作为数据中心操作系统同样也有这样的特性,它也非常容易扩展。
1.2 Kubernetes 架构
Kubernetes 的架构从宏观层面的来讲分为两个平面,即控制平面和计算平面,控制平面又称为 Master 节点,Master 节点是整个集群的大脑,负责控制、调度集群资源;计算平面又称为 Node 节点,Node 节点负责运行工作负载,是 Master 节点调度的对象。kubectl 作为 Kubernetes 客户端通过和 Master 节点直接进行通信来控制 Kubernetes 集群。
控制节点
- kube-apiserver 对外暴露 Kubernetes API,所有对集群的操作都是通过这组API完成,包括客户端下达应用编排命令给 Kubernetes 集群;kubelet 上报集群资源使用情况;以及各个组件之间的交互都是通过这套 API 完成的。
- kube-controller-manager 负责整个 Kubernetes 的管理工作,保证集群中各种资源处于期望状态,当监控到集群中某个资源状态与期望状态不符时,controller-manager 会触发调度操作。
- kube-scheduler 调度器负责 Kubernetes 集群的具体调度工作,接收来自于controller-manager 触发的调度操作请求,然后根据请求规格、调度约束、整体资源情况进行调度计算,最后将任务发送到目标节点由的kubelet组件执行。
- etcd 是一个高效KV存储系统。在Kubernetes环境中主要用于存储所有需要持久化的数据。
计算节点
kubelet 是 Node 节点上核心组件,负责与 docker daemon 进行交互运行 docker 容器;配置网络和数据卷;监控并上报节点资源使用情况。
kube-proxy 主要负责 Service Endpoint 到 POD 实例的请求转发及负载均衡的规则管理。
1.3 Kubernetes 解决了什么问题
Kubernetes 项目最主要的设计思想是,从更宏观的角度,以统一的方式来定义任务之间的各种关系,更甚至我们可以运用 Kubernetes 扩展能力灵活的自定义任务之间的关系。
比如,Kubernetes 项目对容器间的交互关系进行了分类,首先总结出了一类非常常见的“紧密交互”的关系,即:这些应用之间需要直接通过本地文件进行信息交换。
在常规环境下,这些应用往往会被直接部署在同一台机器上,通过 Localhost 通信,通过本地磁盘上的文件进行交互。而在 Kubernetes 项目中,这些容器则会被划分为一个“Pod”,Pod 里的容器共享同一个 Network Namespace、同一组数据卷,从而达到高效率交换信息的目的。
Pod 是 Kubernetes 项目中最基础的一个对象,下一章中我会重中想你介绍 Pod。
而对于另外一种更为常见的需求,比如 Web 应用与数据库之间的访问关系,Kubernetes 项目则提供了一种叫作“Service”的服务。像这样的两个应用,往往故意不部署在同一台机器上,这样即使 Web 应用所在的机器宕机了,数据库也完全不受影响。可是,我们知道,对于一个容器来说,它的 IP 地址等信息不是固定的,那么 Web 应用又怎么找到数据库容器的 Pod 呢?
所以,Kubernetes 项目的做法是给 Pod 绑定一个 Service 服务,而 Service 服务声明的 IP 地址等信息是“终生不变”的。这个Service 服务的主要作用,就是作为 Pod 的代理入口,从而代替 Pod 对外暴露一个固定的网络地址。
除了 Pod、Service 这些基本资源外,Kubernetes 还为我们提供了 Deployment、StatefulSet、Job 等扩展资源,有了这些资源我们就可以轻松的编排我们的服务了,通过这些资源,Kubernetes 为我们提供了应用的水平扩展、滚动升级、自动扩缩容能力,为服务提供了负责均衡、服务监控、服务发现能力。通过这些高级功能以及其灵活的扩展能力使 Kubernetes 逐渐成为了容器编排领域的翘楚。
Kubernetes 组件
当你部署完 Kubernetes, 即拥有了一个完整的集群。
一个 Kubernetes 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点。
工作节点托管作为应用负载的组件的 Pod 。控制平面管理集群中的工作节点和 Pod 。 为集群提供故障转移和高可用性,这些控制平面一般跨多主机运行,集群跨多个节点运行。
本文档概述了交付正常运行的 Kubernetes 集群所需的各种组件。
这张图表展示了包含所有相互关联组件的 Kubernetes 集群。
1.4 Kubernetes 集群搭建
1.4.1 使用 Docker CE 自带的 Kubernetes
安装 Docker 参考:https://docs.docker.com/install/
- Install Docker for Mac
- Install Docker for Windows
1.4.2 使用 minikube
MacOS 安装 minikube
安装minikube
brew cask install minikube
安装vm驱动
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit \n&& sudo install -o root -g wheel -m 4755 docker-machine-driver-hyperkit /usr/local/bin/
启动 minikube(minikube会安装kubernetes需要的组件,这些组件的镜像存储在google的常客中,所有需要能够翻墙才能够安装成功)
minikube start —vm-driver=hyperkit —memory=4096 —insecure-registry=”hub.example.com” —registry-mirror=”https://m9sl8pb5.mirror.aliyuncs.com“ —docker-opt=”bip=172.87.0.1/16”
参数介绍: —vm-driver 使用的虚拟机驱动 —memory 给虚拟机的内存大小 —cpu 给虚拟机的cpu核数,默认是2核 —insecure-registry 指定私有仓库地址 —registry-mirror 指定镜像缓存地址,加快镜像下载速度 —docker-opt 指定docker的启动参数,bip 指定 docker 网桥使用的网段
停止 minikube
minikube stop
删除集群
minikube delete
登录虚拟机
minikube ssh
Windows 安装 minikube
Windows 安装minikube,需要Windows系统支持Hyper-V,目前 Windows 10 Enterprise, Windows 10 Professional, and Windows 10 Education 支持Hyper-V。安装minikube时,最好命令行使用powershell,并且以管理员身份打开并执行。
安装方法 1:
- 安装 https://chocolatey.org/
- choco install minikube kubernetes-cli
安装方法 2:
下载 minikube-installer.exe (https://github.com/kubernetes/minikube/releases/latest)并进行安装。
启动前准备(重要)
- 配置 MINIKUBE_HOME 环境变量及创建目录
- 在 Hyper-V 中为minikube添加虚拟交换机
- 用 chocolatey 安装 OpenSSH(choco install openssh)
启动 minikube
minikube start --vm-driver=hyperv --hyperv-virtual-switch=minikube --memory=4096 --insecure-registry="hub.example.com" --registry-mirror="https://m9sl8pb5.mirror.aliyuncs.com" --docker-opt="bip=172.87.0.1/16"
1.5 访问Kubernetes