Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。通过Kubernetes你可以:
Kubernetes 集群里的节点分为 Master 和 Node 两种,其中 Master 是集群的管理控制中心,Node 负责运行应用容器。
Master 上运行的核心组件如下:
Node 上运行的核心组件如下:
除了核心组件,还有一些推荐的 Add-ons:
Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。
ReplicationController(简称RC)是确保用户定义的Pod副本数保持不变。在用户定义范围内,如果pod增多,则ReplicationController会终止额外的pod,如果减少,RC会创建新的pod,始终保持在定义范围。例如,RC会在Pod维护(例如内核升级)后在节点上重新创建新Pod。
ReplicaSet(RS)是Replication Controller(RC)的升级版本。ReplicaSet 和 Replication Controller之间的唯一区别是对选择器的支持。ReplicaSet支持labels user guide中描述的set-based选择器要求, 而Replication Controller仅支持equality-based的选择器要求。
Deployment为Pod和Replica Set(升级版的 Replication Controller)提供声明式更新。你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
Kubernetes Service 定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector(查看下面了解,为什么可能需要没有 selector 的 Service)实现的。
Deployment 代表的是长期运行的应用服务,而短暂运行的应用(比如定时任务)就要用 Job 来表示。Job 有开始和结束,可以使用一个或多个 Pod 来执行。在多个 Pod 上运行时,运行成功可以配置为是其中一个完成还是全部都完成。
有时候希望在所有 Node 上都运行某个 Pod,比如网络路由、存储、日志、监控等服务,这个时候就可以使用 DaemonSet。
RS 中的 Pod 只能是无状态的,以便它们可以随时被销毁和重建。但有些时候不是这样,Pod 带有状态,比如数据库服务,在重建 Pod 的时候需要将之前的状态(也就是磁盘数据)恢复。使用 StatefulSet 可以达到此目的。StatefulSet 里的每个 Pod 都有名字,并且可以有顺序。当一个 Pod 被重建时,需要恢复之前的名字和相关资源(比如存储卷)。
部署在多个地区的 Kubernetes 集群可以以联邦的方式联合起来组成一个大的集群。每个对联邦的请求都会转发给联邦里的每个集群,每个集群都需要单独完成请求的操作。每个集群都是独立运行的,跟非联邦模式一模一样,它并不知晓自己属于某个联邦。这样就使得 Kubernetes 不用为引入联邦机制而对代码作任何改动。
在Docker中也有一个docker Volume的概念 ,Docker的Volume只是磁盘中的一个目录,生命周期不受管理。当然Docker现在也提供Volume将数据持久化存储,但支持功能比较少(例如,对于Docker 1.7,每个容器只允许挂载一个Volume,并且不能将参数传递给Volume)。
另一方面,Kubernetes Volume具有明确的生命周期 - 与pod相同。因此,Volume的生命周期比Pod中运行的任何容器要持久,在容器重新启动时能可以保留数据,当然,当Pod被删除不存在时,Volume也将消失。注意,Kubernetes支持许多类型的Volume,Pod可以同时使用任意类型/数量的Volume。
就像 Node 提供计算资源,PV 提供了存储资源。PV 是对底层存储服务的抽象,其实现方式可以是本地磁盘,也可以是网络磁盘。PVC 用来描述 Pod 对存储资源的需求,它需要绑定到某个 PV。PV 和 PVC 是一对一关系,而 PV 和 Pod 是多对多关系,单个 PV 可以被多个 Pod 共享,且单个 Pod 可以绑定多个 PV。
Node是Kubernetes中的工作节点,最开始被称为minion。一个Node可以是VM或物理机。每个Node(节点)具有运行pod的一些必要服务,并由Master组件进行管理,Node节点上的服务包括Docker、kubelet和kube-proxy。有关更多详细信息,请参考架构设计文档中的“Kubernetes Node”部分。
Secret 对象用来存放密码、CA 证书等敏感信息,这些信息不适合直接用明文写在 Kubernetes 的对象配置文件里。Secret 对象可以由管理员预先创建好,然后在对象配置文件里通过名称来引用。这样可以降低敏感信息暴露的风险,也便于统一管理。
用户帐号为人提供身份标识,而服务帐号为 Kubernetes 集群中的 Pod 提供身份标识。用户帐号与命名空间无关,是跨命名空间的,而服务帐号属于某一个命名空间。
命名空间为同一个 Kubernetes 集群里的资源对象提供了虚拟的隔离空间,避免了命名冲突,比如在同一个集群里同时部署测试环境和生产环境服务。Kubernetes 里默认提供了两个命名空间,分别是 default 和 kube-system,前者是资源对象默认所属的空间,后者是 Kubernetes 自身资源对象所属的空间。只有集群管理员能够创建新的命名空间。
使用 RBAC,用户不再直接跟权限进行关联,而是通过角色。角色代表的一组权限,用户可以具备一种或多种角色,从而具有这些角色所包含的权限。如果角色权限有调整,那么所有具有该角色的用户权限自然而然就随之改变。
Kubernetes 官方文档里提供了很多种 部署方式,从源码编译,到本地开发环境部署,再到无需部署直接使用的在线服务,甚至可以只用几个命令就可以在各大 IaaS 平台上部署一个 Kubernetes 集群。我们详细讲解下本地开发环境部署,在这里只介绍MiniKube的部署方式。为了方便起见,我们选择在Windows上用MiniKube部署Kubernetes单节点集群。
Minikube 方式部署的集群支持如下 Kubernetes 特性:
Minikube在不同操作系统上支持不同的驱动
注:
您可以参考 https://minikube.sigs.k8s.io/docs/start/ 安装配置
Windows
下载 minikube-windows-amd64.exe 文件,并重命名为 minikube.exe
检查是否正确安装了MiniKube
PS C:\Users\shengwen\Desktop> minikube version
minikube version: v1.7.2
commit: 50d543b5fcb0e1c0d7c27b1398a9a9790df09dfb
以下命令我们用windows上的powershell来完成
从1.5.0版本开始,Minikube缺省使用本地最好的驱动来创建Kubernetes本地环境
minikube start
为了访问海外的资源,阿里云提供了一系列基础设施,请按照如下参数进行配置。其中常见参数
--image-mirror-country cn
将缺省利用 registry.cn-hangzhou.aliyuncs.com/google_containers 作为安装Kubernetes的容器镜像仓库,--iso-url=***
利用阿里云的镜像地址下载相应的 .iso 文件--cpus=2
: 为minikube虚拟机分配CPU核数--memory=2000mb
: 为minikube虚拟机分配内存数--kubernetes-version=***
: minikube 虚拟机将使用的 kubernetes 版本安装minikube缺省支持的Kubernetes版本
PS C:\Users\cloudnative> minikube start --vm-driver=virtualbox --image-mirror-country cn --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.6.0.iso --registry-mirror=https://registry.docker-cn.com
* Microsoft Windows 10 Home China 10.0.18362 Build 18362 上的 minikube v1.7.2
* Using the virtualbox driver based on user configuration
* Reconfiguring existing host ...
* Using the running virtualbox "minikube" VM ...
! 虚拟机无权访问 k8s.gcr.io,或许您需要配置代理或者设置 --image-repository
* 正在 Docker 19.03.5 中准备 Kubernetes v1.17.2…
* 正在启动 Kubernetes ...
* Enabling addons: default-storageclass, storage-provisioner
* 完成!kubectl 已经配置至 "minikube"
! C:\k8s\kubectl.exe 的版本是 1.9.0,且与 Kubernetes 1.17.2 不兼容。您需要更新 C:\k8s\kubectl.exe 或者使用 'minikube kubectl' 连接到这个集群
打开Kubernetes控制台
PS C:\Users\shengwen\Desktop> minikube dashboard
* 正在开启 dashboard ...
* Verifying dashboard health ...
* Launching proxy ...
* Verifying proxy health ...
* Opening http://127.0.0.1:14849/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
可以使用kubectl CLI与集群进行交互。这是用于管理Kubernetes和在集群顶部运行的应用程序的主要方法。
群集的详细信息及其运行状况可以通过以下方式发现
PS C:\Users\shengwen\Desktop> kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
使用以下命令查看集群中的节点
PS C:\Users\shengwen\Desktop> kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 29d v1.17.2
此命令显示可用于承载我们的应用程序的所有节点。现在我们只有一个节点,可以看到它的状态为就绪(可以接受要部署的应用程序了)
有了运行中的Kubernetes集群,现在就可以部署容器了。使用 kubectl run
,它可以将容器部署到集群上
PS C:\Users\shengwen\Desktop> kubectl run hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/echoserver:1.4 --port=8080
replicationcontroller "hello-minikube" created
可以通过运行中的Pods发现部署状态
PS C:\Users\shengwen\Desktop> kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-qcxwm 1/1 Running 0 6h
在 Web 控制台里可查看集群状态和执行管理操作。