本文通过Kurbernetes官网资料来学习相关基础知识,参考文章 相关概念 和 AWS上安装K8s。
Kubernetes是用于自动部署,扩展和管理容器化应用程序的开源系统,于2014年被Google开源。
特性自动包装
根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,混合关键和最大努力的工作负载,以提高资源利用率并节省更多资源。横向缩放
使用简单的命令或UI,或者根据CPU的使用情况自动调整应用程序副本数。自动部署和回滚
Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。存储编排
自动安装您所选择的存储系统,无论是本地存储,如公有云提供商GCP或AWS,还是网络存储系统NFS, iSCSI, Gluster, Ceph, Cinder, 或 Flocker。自我修复
重新启动失败的容器,在节点不可用时,替换和重新编排节点上的容器,终止不对用户定义的健康检查做出响应的容器,并且不会在客户端准备投放之前将其通告给客户端。服务发现和负载均衡
不需要修改您的应用程序来使用不熟悉的服务发现机制,Kurbernetes为容器提供了自己的IP地址和一组容器的单个DNS名称,并可以在它们之间进行负载均衡。密钥和配置管理
部署和更新密钥和应用程序配置,不会重新编译您的镜像,不会再堆栈配置中暴露密钥。批处理
除了服务之外,Kurbernetes还可以管理您的批处理和CI工作负载,如果需要,替换出现故障的容器。
预期状态
使用Kurbernetes之前需要用Kurbernetes API对象来描述集群的预期状态,包括运行的应用或负载,使用的镜像、副本数,所需网络和磁盘资源等。可以使用命令行工具kubectl来调用Kurbernetes API创建对象,通过这些对象来配置预期状态。同时,可以直接调用Kurbernetes API和集群进行交互,设置或修改预期状态。
设置目标状态后,Kubernetes控制面会促成集群从当前状态转化到目标状态,通过自动执行各类任务,如运行或重启容器、调整给定应用的副本数等。
Kubernetes Objects
Kurbernetes包含若干抽象来表示系统状态,包括已部署的容器化应用和负载,相关的网络和磁盘资源,集群正在运行的其他操作信息。这些抽象使用Kurbernetes API对象表示。
基本的Kurbernetes对象包括Pod, Service, Volume, Namespace. 另外,Kurbernetes包含大量高级抽象-控制器(controllers),控制器基于基本对象构建并提供额外的功能和方便使用的特性,包括ReplicaSet, Deployment, StatefulSet, DaemonSet, Job。
每个Kubernetes object都具有2个object fields: spec,必须提供,表示object期望的state;status是object实际的state。Kubernetes Control Plane用来控制object的实际state去匹配期望的state。
使用kubectl命令行工具并提供object info可以创建object。Object info一般使用.yml文件描述,kubectl会将该文件信息转化为JSON并创建object。
下面是例子deployment.yaml:
apiVersion:apps/v1 # for versions before 1.9.0 use apps/v1beta2kind:Deploymentmetadata:name:nginx-deploymentspec:selector:matchLabels:app:nginxreplicas:2# tells deployment to run 2 pods matching the templatetemplate:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.7.9ports:- containerPort:80
其中,apiVersion指定创建object的Kubernetes API版本,kind指定object类型,metadata用来唯一识别创建的object,包括name,uid和namespace。前面3个必须指定。spec也是必须指定,但对于不同的object type的内容不同。
通过下面的命令便可以创建object。
kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
创建成功,会得到下面的输出。
deployment.apps/nginx-deployment created
-namespace
Kubernetes支持在相同physical cluster中划分多个virtual cluster,这些virtual cluster被称为namespace。namespace应用于很多user为跨team和project的场景。
控制面
Kurbernetes控制面管理Kurbernetes如何与集群通信(Kurbernetes主控组件和Kubelet进程);维护系统中所有Kurbernetes对象的状态记录并通过连续的循环控制来管理这些对象的状态;在任一时间点,控制面的控制环都能响应集群中的变化并让系统中所有对象的实际状态匹配预期状态。
Kubernetes控制面由一组运行在集群上的进程组成:Kubernetes主控组件(Master):包含3个进程:kube-apiserver,kube-controller-manager,kube-scheduler。这3个进程通常都运行在master节点上。
集群中每个非master节点都运行两个进程:kubelet, 用于跟master节点通信; kube-proxy, 一种网络代理,将Kurbernetes的网络服务代理到每个节点上。
Kurbernetes master node:
负责维护集群的目标状态,使用kubectl命令行工具来直接与Kurbernetes master节点进行通信。 master是指管理集群状态的一组进程的集合,通常这些进程运行在master节点。master节点可以通过扩展副本数来获取更好的性能及冗余。
Kurbernetes Node:
集群中的node可以是物理机或虚拟机,用来运行应用和云工作流。Master node控制所有node,很少需要与node直接通信。