Kubernetes是什么
Kubernetes是一个开源的分布式系统、容器化管理平台。它提供的功能有:服务自动部署和回滚、服务发现、负载均衡、服务弹性扩容、服务自动修复、密钥与配置管理、存储编排。这使得原先大量的开发、运维工作都大大简化。
下面是kubernetes提供的这几个功能与传统IT解决方案的比较:
功能 | 定义 | 传统IT解决方案 | Kubernetes |
服务自动部署和回滚 | |||
服务发现 | Kubernetes 可以(通过简单的配置命令)使用 DNS 名称或自己的 IP 地址公开容器到集群内部或外网环境。如果一个服务部署了多个实例,Kubernetes 可以负载均衡并分配网络流量到各个实例。 | ||
负载均衡 | |||
服务弹性扩容 | |||
服务自动修复 | |||
密钥与配置管理 | |||
存储编排 |
Kubernetes组件
Kubernetes官网的组件图过于唬人,刚开始学习时有些找不到重点,所以我按自己的理解进行了简化。通过组件图对kubernetes有一个直观的认识,不必纠结每个组件的含义及作用。
一个Kubernetes集群由一组节点(Node)和一个控制平面服务(Control Plane,有的时候叫它Master)组成。
集群中每个节点是一台物理机或虚拟机。Kubernetes在每个节点上运行一个节点组件,以维护节点上的Pod。Pod是一个抽象概念,每个Pod中有一组紧密相关的容器。官网的组件图中的kubelet、kube-proxy以及容器运行时都是节点组件的一部分,在刚开始学习使用时,不用过多关注。
集群中的控制平面负责管理整个Kubernetes集群。官网的组件图中kube-apiserver、etcd、kube-scheduler等等都是控制平面的一部分,目前不用过多关注。
Kubernetes中的大部分概念都被看作一种资源对象,可以通过命令增删改查。包括已经提到的Node、Pod以及后面提到的Deployment、Service等。所有资源对象都可以采用yaml/json文件来定义。
Kubernetes安装
如果为了学习Kubernates一开始就安装一个生产环境级别的集群就有点小题大作了,我估计还没安装完就打退堂鼓了。所以在学习时只需要安装个Minikube就好了。
Kubernetes 既可以部署在物理机上也可以部署在虚拟机上。您可以使用 Minikube 开始部署 Kubernetes 集群。 Minikube 是一种轻量级的 Kubernetes 实现,可在本地计算机上创建 VM 并部署仅包含一个节点的简单集群。 Minikube 可用于 Linux , macOS 和 Windows 系统。Minikube CLI 提供了用于引导集群工作的多种操作,包括启动、停止、查看状态和删除。
如果是Mac并且安装了homebrew,可以直接3个命令来安装。如果是其它环境也可以按照官网步骤按照:https://minikube.sigs.k8s.io/docs/start/
brew install minikube
brew unlink minikube
brew link minikube
启动minikube:minikube start
打开集群的web界面:minikube dashboard
这样一个kubernetes集群就启动起来了。
Kubernetes使用
本节通过几个简单的命令对kubernetes有一个直观的认识。更多的命令在平时使用时查阅即可,不过现在云服务商都提供了web页面来进行配置,所以只需要点点点就可以了。
创建kubernetes集群
minikube version // 查看minikube版本
minikube start // 启动minikube
kubectl version // 查看kubectl版本。kubectl是kubernetes命令行工具,通过kubectl与master通信
kubectl cluster-info // 查看集群信息
kubectl get nodes // 查看集群节点信息
在集群上部署应用
kubectl create deployment kubernetes-bootcamp -image=gcr.io/google-samples/kubernetes-bootcamp:v1 // 创建一个k8s deployment。当创建deployment时,kubernetes同时会添加一个pod来托管应用
kubectl get deployments // 查看已经部署的deployments
查看集群上部署的应用
kubectl get pods // 查看已经部署的pods
kubectl describe pods // 查询pods的详细信息,比如pod配置、部署了哪些容器
Kubernetes概念详解
本节从概念的角度,结合上面的组件图,总结下kubernetes中的对象概念及作用。因此不必过多深挖kubernetes背后的设计思想、实现原理。
Kubernetes中的大部分概念都被看作一种资源对象,可以通过命令增删改查,所有资源对象都可以采用yaml/json文件来定义。所有资源对象都可以通过Kubernetes提供的kubectl工具执行增、删、改、查等操作并将其保存在etcd中持久化存储。
kubectl
kubectl是kubernetes命令行工具,通过kubectl与master通信,上一节中创建deployment时就是使用的kubectl。
kubectl的命令模板:kubectl [command] [TYPE] [NAME] [flags]。其中,(以kubectl get pod example-pod1 example-pod2为例)
- command:指定要对一个或多个资源执行的操作,例如 create、get、describe、delete。
- TYPE:指定资源类型。资源类型不区分大小写, 可以指定单数、复数或缩写形式。例如pod
- NAME:指定资源的名称。名称区分大小写。例如:example-pod1 example-pod2
- flags: 指定可选的参数。例如,可以使用 -s 或 -server 参数指定 Kubernetes API 服务器的地址和端口。
Master
Master负责整个集群的管理和控制,Kubernetes的所有控制命令都发给它,Master负责具体的执行过程,Master通常会占据一个独立的服务器。Master上运行的进程有:kube-apiserver、kube-controller-manager、kube-scheduler、etcd。
kube-apiserver
提供了HTTP Rest接口,是Kubernetes里所有资源的增、删、改、查等操作的入口,当执行各种命令的时候,实际上就是调用的这些接口。同时还提供了一个web页面。使用minikube学习时执行minikube dashborad就可以打开web页面。
kube-controller-manager
kubernetes控制管理器是一个守护进程。目前kubernetes自带的控制器有副本控制器、端点控制器、命名空间控制器和服务账号控制器。
- 副本控制器:确保任何时候都有期望数量的pod副本处于运行状态。
- 端点控制器:填充端点对象,例如pod。
- 命名空间控制器:管理命名空间。
- 服务账号控制器:管理账号。
关于控制器的解释,官网有一句话一直没能理解是什么意思:
The Kubernetes controller manager is a daemon that embeds the core control loops shipped with Kubernetes. In applications of robotics and automation, a control loop is a non-terminating loop that regulates the state of the system. In Kubernetes, a controller is a control loop that watches the shared state of the cluster through the apiserver and makes changes attempting to move the current state towards the desired state.
cloud-controller-manager
云控制器管理器是指云服务商实现的控制器管理器。
kube-scheduler
负责将pod到合适node上。调度器(kube-scheduler)通过kubernetes检测机制来发现集群中新创建且尚未被调度到node上的pod。调度器会将发现的每一个未调度的pod调度到合适的node上。
etcd
etcd 是兼具一致性和高可用性的键值数据库,作为保存 Kubernetes 所有集群数据的后台数据库。
Node
Kubernetes在每个节点上运行一个节点组件,以维护节点上的Pod,这些节点组件进程有:kubelet、kube-proxy、容器运行时。Node可以在运行期间启动节点组件进程后动态的增加到kuberntes集群中,
kubelet
在集群中每个节点(node)上运行的代理,负责Pod对应的容器的创建、启停等任务。kubelet进程会定时向Master汇报自身信息,包括操作系统、docker版本、cpu、内存、pod信息等,这样master就可以根据这些信息实现资源调度。如果Node超过指定时间不上报信息时,会被master标记位不可用。如果一个节点不可用,master就会将所有pod重新调度到其它节点。
kube-proxy
kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service)。kube-proxy 维护节点上的网络规则,这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
容器运行时
容器运行环境是负责运行容器的软件。Kubernetes 支持多个容器运行环境: Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
Pod
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod是一组容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。每个pod下除了有一组用户容器之外,还有一个“根容器”:Pause容器。kubernetes为每个pod都分配了唯一的ip。
每个pod都可以对其能使用的服务器上的cpu和内存设置限额。对于绝大多数容器来说,一个CPU的资源配额相当大,所以在Kubernetes里通常以千分之一的CPU配额为最小单位,用m来表示。通常一个容器的CPU配额被定义为100~300m,即占用0.1~0.3个CPU。由于CPU配额是一个绝对值,所以无论在拥有一个Core的机器上,还是在拥有48个Core的机器上,100m这个配额所代表的CPU的使用量都是一样的。与CPU配额类似,Memory配额也是一个绝对值,它的单位是内存字节数。
在Kubernetes里,一个计算资源进行配额限定时需要设定以下两个参数。
- Requests:该资源的最小申请量,系统必须满足要求。
- Limits:该资源最大允许使用的量,不能被突破,当容器试图使用超过这个量的资源时,可能会被Kubernetes“杀掉”并重启。
通常,我们会把Requests设置为一个较小的数值,符合容器平时的工作负载情况下的资源需求,而把Limit设置为峰值负载情况下资源占用的最大量。
Event
Event是一个事件的记录,记录了事件的最早产生时间、最后重现时间、重复次数、发起者、类型,以及导致此事件的原因等众多信息。Event通常会被关联到某个具体的资源对象上,是排查故障的重要参考信息。
Label, Selectors
标签是附加到 Kubernetes 对象(比如 Pod、Service、Node)上的键值对。我们可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。比如:”env”:”dev”, “env”:”qa”, “branch”:”master”。
标签选择符用来根据标签查询符合条件的对象。例如,env=dev表示查询env是dev的对象。
语法示例:
env=dev
env!=dev
env in (dev, qa)
env notin (dev, qa),branch=master
RC(Replication Controller)
RC在最新的kubernetes版本中已经升级为ReplicaSet,后面也会介绍。
ReplicationController 确保在任何时候都有特定数量的 Pod 副本处于运行状态。 换句话说,ReplicationController 确保一个 Pod 或一组同类的 Pod 总是可用的。RC的定义包括三个部分:pod期望副本数量、筛选pod的标签选择符、创建新pod的pod模板(template)。当 Pod 数量过多时,ReplicationController 会终止多余的 Pod。当 Pod 数量太少时,ReplicationController 将会启动新的 Pod。通过RC,kubernetes实现了应用的高可用性,大大减少了许多运维工作(例如:机器监控程序、应用监控程序、故障恢复程序)。但是平时我们主要通过Deployment创建RC,然后由Deployment维护RC。
一个RC配置示例:
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 // 期望pod数量 selector: // 筛选pod的标签选择符 app: nginx template: // 创建pod的模板 metadata: name: nginx labels: app: nginx spec: containers: – name: nginx image: nginx ports: – containerPort: 80
工作负载
Deployment
Deployment用来编排(编排是配置、管理、协调、调度的意思)ReplicaSet应用。当创建一个的deployment时,它会根据资源定义创建出指定的replicaset,因此在平时不需要与replicaset打交道。
DaemonSet
daemonset用于管理在每个节点上运行一个pod副本的应用。例如日志收集进程、监控进程。
StatefulSets
statefulsets用来管理有状态应用,例如zookeeper集群、数据库集群、kafka集群。
Job
job用来管理只执行一次的任务,例如分布式计算任务。
CronJob
cronjob用来管理需要重复调度的任务
Service
service就是将一组pod组合来一起成为一个服务,当一个应用调用另一个应用时就通过service访问,所以service负责向外部暴露出一个固定的ip地址供其它服务调用,向内部提供负载均衡的功能,将请求分配到其中的一个pod。既然时向外暴露ip,就涉及到服务的暴露范围。service提供了3种类型。
- NodePort:通过在节点端口和容器端口间配置映射,然后通过节点ip访问。
- ClusterIP:通过service服务名+服务端口访问service。适用于集群内服务间访问。
- LoadBalancer:通过云服务商的负载均衡器域名/ip访问service。适用于集群外的服务访问集群内的服务。
Volume
存储卷与docker中的volume概念类似,不同的是k8s的volume是定义在pod上,与容器的生命周期没有关系。