Kubernetes (K8s):
中文社区:https://www.kubernetes.org.cn/replication-controller-kubernetes
官网:https://kubernetes.io/
是一个开源系统,用于容器化应用的自动部署、扩缩和管理。Kubernetes 将构成应用的容器按逻辑单位进行分组以便于管理和发现。 Kubernetes 基于 谷歌公司在运行生产负载上的 15 年经验 打造,并融合了来自社区的最佳建议与实践。我们先来看看他的架构图:
要使用 Kubernetes,你需要用 Kubernetes API 对象 来描述集群的 预期状态(desired state) :包括你需要运行的应用或者负载,它们使用的镜像、副本数,以及所需网络和磁盘资源等等。你可以使用命令行工具 kubectl
来调用 Kubernetes API 创建对象,通过所创建的这些对象来配置预期状态。你也可以直接调用 Kubernetes API 和集群进行交互,设置或者修改预期状态。
一旦你设置了你所需的目标状态,Kubernetes 控制面(control plane) 会通过 Pod 生命周期事件生成器( PLEG ),促成集群的当前状态符合其预期状态。为此,Kubernetes 会自动执行各类任务,比如运行或者重启容器、调整给定应用的副本数等等。Kubernetes 控制面由一组运行在集群上的进程组成:
Kubernetes Master(管理节点) 节点:
Kubernetes master 节点负责维护集群的目标状态。当你要与 Kubernetes 通信时,使用如 kubectl
的命令行工具,就可以直接与 Kubernetes master 节点进行通信。“master” 是指管理集群状态的一组进程的集合。通常这些进程都跑在集群中一个单独的节点上,并且这个节点被称为 master 节点。master 节点也可以扩展副本数,来获取更好的可用性及冗余。用于控制 Kubernetes 节点的计算机,所有任务分配都来自于此。
Kubernetes 主控组件(Master) 包含三个进程,都运行在集群中的某个节上,通常这个节点被称为 master 节点。这些进程包括:
- kube-apiserver:Kubernetes API服务器会验证和配置api对象的数据,这些对象包括容器,服务,复制控制器等。API Server为REST操作提供服务,并为群集的共享状态提供前端,所有其他组件都通过该前端进行交互。
- kube-controller-manager:Kubernetes控制器管理器是一个守护程序,它嵌入了Kubernetes随附的核心控制循环。在机器人技术和自动化应用中,控制回路是一个非终止回路,用于调节系统状态。在Kubernetes中,控制器是一个控制循环,它通过apiserver监视集群的共享状态,并进行更改以尝试将当前状态移向所需状态。今天,Kubernetes附带的控制器示例包括复制控制器,端点控制器,名称空间控制器和serviceaccounts控制器。用来执行整个系统中的后台任务,包括节点状态状况、Pod 个数、Pods 和 Service 的关联等。
- kube-scheduler:负责节点资源管理,接受来自 kube-apiserver 创建 Pods 任务,并分配到某个节点。Kubernetes调度程序是一个策略丰富,可感知拓扑,特定于工作负载的功能,会显着影响可用性,性能和容量。调度程序需要考虑单个和集体资源需求,服务质量需求,硬件/软件/策略约束,亲和力和反亲和力规范,数据本地性,工作间干扰,期限等。特定于工作负载的需求将在必要时通过API公开。
Kubernetes Node(工作节点) 节点
执行请求和分配任务的计算机,由 Kubernetes 主机负责对节点进行控制。集群中的 node 节点(虚拟机、物理机等等)都是用来运行你的应用和云工作流的机器。Kubernetes master 节点控制所有 node 节点;你很少需要和 node 节点进行直接通信。
集群中的每个非 master 节点都运行两个进程:
- kubelet,和 master 节点进行通信。
- kube-proxy,一种网络代理,将 Kubernetes 的网络服务代理到每个节点上。
Kubernetes 对象:
Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容器化应用和负载、与它们相关的网络和磁盘资源以及有关集群正在运行的其他操作的信息。这些抽象使用 Kubernetes API 对象来表示。参阅 Kubernetes 对象概述以了解详细信息。基本的 Kubernetes 对象包括:
- Pod(容器集):被部署在单个节点上的,且包含一个或多个容器的容器组,Pod 是可以被创建,调度,并与 Kubernetes 管理最小部署单元,同一容器集中的所有容器共享同一个 IP 地址、IPC、主机名称及其它资源。容器集会将网络和存储从底层容器中抽象出来,这样,您就能更加轻松地在集群中移动容器。
- Service(服务):服务为一组 Pod 提供单一稳定的名称和地址,服务可将工作定义与容器集分离,Kubernetes 服务代理会自动将服务请求分配到正确的容器集 — 无论这个容器集会移到集群中的哪个位置,即使它已被替换,也是如此。
- Label(标签):标签用于组织和选择基于键值对的对象组,它们被用于每一个 Kubernetes 组件。
- Volume:Volume 是pod中能够被多个容器访问的共享目录。概念、用途和目的与docker的vlume相似但不等价。
- Namespace(命名空间):Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。
另外,Kubernetes 包含大量的被称作控制器(controllers) 的高级抽象。控制器基于基本对象构建并提供额外的功能和方便使用的特性。具体包括:
- Replication Controller(复制控制器):复制控制器管理 Pod 的生命周期,它们保证指定数量的 Pod 在任何给定的时间都在运行,他们通过创建或删除 Pod 做到这一点。
- ReplicaSet:ReplicaSet是kubernetes中的一种副本控制器,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数。
- Deployment(部署):Deployment 是新一代用于 Pod 管理的对象,与 Replication Controller 相比,它提供了更加完善的功能,使用起来更加简单方便。
- StatefulSet:StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API。在Pods管理的基础上,保证Pods的顺序和一致性。与Deployment一样,StatefulSet也是使用容器的Spec来创建Pod,与之不同StatefulSet创建的Pods在生命周期中会保持持久的标记(例如Pod Name)。
- DaemonSet:DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
- Job:Job对象通常用于运行那些仅需要执行一次的任务(例如数据库迁移,批处理脚本等等)。通过Job对象创建运行的Pod具有高可靠性,因为Job Controller会自动重启运行失败的Pod(例如Pod所在Node重启或宕机)。
Kubernetes 组件:
- kubectl:客户端命令行工具,将接受的命令格式化后发送给 kube-apiserver,作为整个系统的操作入口。
- kube-apiserver:作为整个系统的控制入口,以 REST API 服务提供接口。
- kube-controller-manager:用来执行整个系统中的后台任务,包括节点状态状况、Pod 个数、Pods 和 Service 的关联等。
- kube-scheduler(将 Pod 调度到 Node 上):负责节点资源管理,接受来自 kube-apiserver 创建 Pods 任务,并分配到某个节点。
- etcd:负责节点间的服务发现和配置共享。集群中这些数据保存,分布式存储
- kube-proxy:运行在每个计算节点上,负责 Pod 网络代理。定时从 etcd 获取到 Service 信息来做相应的策略。
- kubelet:运行在每个计算节点上,作为 agent,接受分配该节点的 Pods 任务及管理容器,周期性获取容器状态,反馈给 kube-apiserver。
- DNS:一个可选的DNS服务,用于为每个 Service 对象创建 DNS 记录,这样所有的 Pod 就可以通过 DNS 访问服务了。
- flannel:Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,需要另外下载部署。我们知道当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。
来看一下官方提供的架构图:
到此为止我们只需要对k8s有个感性的认识就行。毕竟我们还没有进行实操。
使用Minikube搭建单节点K8s:
kubectl官网 :https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux
minikube官网 :https://kubernetes.io/docs/tasks/tools/install-minikube/
安装kubectl
# 01 curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectl
# 02 授权
chmod +x ./kubectl
# 03 添加到环境变量
sudo mv ./kubectl /usr/local/bin/kubectl
# 04 检查
kubectl version
安装minikube:
# 01 下载
wget https://github.com/kubernetes/minikube/releases/download/v1.5.2/minikube-
linux-amd64
# 02 配置环境变量
sudo mv minikube-linux-amd64 minikube && chmod +x minikube && mv minikube
/usr/local/bin/
# 03 检查
minikube version
使用minikube创建单节点的k8s:
minikube start --vm-driver=none --image-repository=gcr.azk8s.cn/google-containers
由于网络问题,我这边就没有实操,网络通畅的小伙伴可以自己去试试。接下去可以做一下操作来熟悉k8s。