Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动化扩缩容、维护等功能。
Master组件
Master组件可以再集群中任何节点上运行,通常将所有master组件运行于一台服务器上,并且不会在该服务器上运行任何用户容器。
- kube-apiserver
kube-apiserver用于提供资源请求/调用接口
- ETCD
etcd是Kubernetes提供的默认存储系统,保存所有集群数据,使用时需要为etcd数据提供备份;
- kube-controller-manager
kube-controller-manager运行管理控制器,是集群中处理常规任务的后台线程;它们被编译成单个二进制文件,在单个进程中运行。
控制器包含:
- 节点控制器(Node)
- 副本控制器(Replication):负责维护系统中每个副本中的pod。
- 端点控制器(Endpoints):填充Endpoints对象(即连接Services&Pods)
- Service Account和Token控制器:为新的Namespace创建默认账户访问API Token
- cloud-controller-manager
云控制管理器负责与底层云提供商的平台交互。
cloud-controller-manager包括:
- 节点控制器(Node)
- 路由控制器(Route)
- Service控制器
- 卷控制器(Volume)
- kube-scheduler
kube-scheduler监视新创建没有分配到Node的Pod,为Pod选择一个Node;
- 插件addons
插件(addon)是实现集群pod和Services功能的;
- DNS
Kubernetes集群都需要配置集群DNS,集群DNS是一个DNS服务器,为Kubernetes Services提供DNS记录。
- 用户界面
kube-ui提供集群状态基础信息查看。
- 容器资源监测
容器资源监控提供一个UI浏览监控数据。
- Cluster-level Logging
Cluster-level Logging负责保存容器日志,搜索/查看日志。
Node组件
节点组件运行在Node上,提供Kubernetes运行时环境,以及维护Pod。
- kubelet
kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能如下:
- 安装pod所需的volume
- 下载pod的Secrets
- Pod中运行的docker/expermentally/rkt容器
- 定期执行容器健康检查
- 报告pod的状态给系统其余部分,如有必要创建pod镜像
- 将节点的状态报给系统其余部分
- kube-proxy
kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象
- docker
docker用于运行容器
- RKT
rkt运行容器,作为docker的替代方案
- supervisord
supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行状态;
- fluentd
fluentd是一个守护进程,可提供cluster-level logging.
kubernetes object
Kubernetes object包含object spec和object status两个字段,Spec描述对象所需的状态,Status描述对象的实际状态。
Kubernetes对象的yaml文件,需要设置以下必填字段:
- apiVersion - 创建对象的Kubernetes API版本
- kind - 要创建什么类型的对象
- metadata - 具有唯一标识对象的数据,包括name、UID、Namespace(可选)
- Spec字段
Kubernetes Names
Kubernetes中所有对象都用name和UID来明确地标识。对于非唯一用户提供的属性,kubernetes提供labels和annotations.
UID是Kubernetes生成的,在Kubernetes集群的整个生命周期中创建的每个对象都有不同的UID。
Namespaces
namespace为名称提供一个范围,将集群资源划分为多个用途,默认情况下,同一个namespace中的对象将具有相同的访问控制策略。
创建namespace后在namespace基础上创建pod。创建namespace命令如下:
kubectl create namespace new-namespace
通过yaml文件创建,namespace.yaml内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: new-namesapce
执行kubectl create -f ./namesapce.yaml
删除namespace会自动删除所有属于该namespace的资源。
kubectl delete namespaces new-namespace
查看namespace
kubectl get namespaces
Volume
Kubernetes Volume具有明确的生命周期,与pod相同,当pod被删除时,Volume也将消失。
kubernetes支持的Volume类型有:
emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
nfs
iscsi
fc (fibre channel)
flocker
glusterfs
rbd
cephfs
gitRepo
secret
persistentVolumeClaim
downwardAPI
projected
azureFileVolume
azureDisk
vsphereVolume
Quobyte
PortworxVolume
ScaleIO
StorageOS
local
Node
node可以是VM或物理机,每个node具有运行pod的一些必要条件,并由master组件进行管理,node节点上运行的服务包括Docker、kubelet和kube-proxy
node status:
Addresses
Condition
Capacity
Info
秘钥和证书保存在secret中,configmap是保存一些非敏感信息。