什么是Kubernates
- Kubernetes是Google在2014年开源的一个容器集群管理系统,简称K8S;
- K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能;
Kubernates的特性
自我修复
在节点故障时,会重启、替换、重新部署,保证预期的副本数;
杀死检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不会异常;弹性伸缩
使用命令、UI或者基于CPU使用情况自动扩容、缩容应用实例,保证业务高峰时的高可用。业务低峰时的资源回收;自动部署和回滚
K8S可以采用滚动更新策略,一次更新一个Pod,而不是同时删除所有Pod。如果更新过程出了问题,可以快速回滚;服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器的IP;机密和配置管理
管理机密数据和应用程序配置,而不需要将敏感数据暴露在镜像中,提高敏感数据的安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用;存储编排
挂载外部存储系统,无论是来自本地存储、公有云还是网络存储,都作为集群资源的一部分使用,极大提高存储使用灵活性;批量处理
提供一次性任务、定时任务。满足批量数据处理和分析的场景。
集群架构与组件
Master节点组件
kube-apiservier
K8S API,集群的统一入口,各组件的协调者。以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储;kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器。比如我们通过APIServer创建一个pod,当这个pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样的重任就由controller manager去保证了;kube-scheduler
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同节点上;etcd
分布式键值存储系统。用于保存集群状态数据,比如:Pod、Service等对象信息;
Node节点组件
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如:创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态数据。kubelet将每个Pod转换成一组容器;kube-proxy
该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity;runtime
runtime指的是容器运行环境,目前Kubernetes支持docker和rocket两种容器;
核心组件及概念
Deployment(部署)
Pods(容器组)
- 最小部署单元;
- 一个容器的集合;
- 一个Pod中的容器共享网络命名空间;
- Pod是短暂的,重启之后可能会运行到另一个Node中;
Service(服务)
- 防止Pod失联;
- 定义一组Pod访问策略;
Ingress(路由)
ConfigMap(配置项)
ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap跟secret很类似,但它可以更方便地处理不包含敏感信息的字符串。
Controllers
- ReplicaSet:确保预期的Pod副本数量;
- Deployment:无状态应用部署;
- StatefulSet:有状态应用部署;
- DaemonSet:确保所有Node运行同一个Pod;
- Job:一次性任务;
- Cronjob:定时任务;
Label
标签,附加到某个资源上,用于关联对象、查询和筛选。
Namespaces
命名空间,将对象逻辑上隔离。
Annotations
注释。
K8S网络模型(CNI)
Container Network Interface (CNI):容器网络接口。
要求:
- 一个Pod一个IP;
- 每个Pod独立IP,Pod内所有容器共享网络(同一个IP);
- 所有容器都可以与所有其他容器通信;
- 所有节点都可以与所有容器通信;
Flannel容器集群网络
Flannel是Overlay网络的一种,也是将源数据包装在另一种网络包里面进行路由转发和通信,目前支持UDP\VXLAN\AWS VPC\GCE路由等数据转发方式。
Overlay Network : 覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来。
VXLAN : 将源数据包封装到UDP包中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发送给目标地址。
kubectl管理命令
操作 | 命令 |
---|---|
创建 | kubectl create -f xxx.yaml |
查询 | kubectl get pod yourPodName、kubectl describe pod yourPodName |
删除 | kubectl delete pod yourPodName |
更新 | kubectl replace /path/to/yourNewYaml.yaml |
kubectl管理应用程序生命周期
创建
kubectl run
kebectl get deploy,pods发布
kubectl expose
kubectl get service更新
kubectl set image
Pod
回滚
kubectl rollout
kubectl rollout删除
kubectl delete
Service
- 防止Pod失联;
- 定义一组Pod的访问策略;
- 支持ClusterIP、NodePort以及LoadBalancer三种类型;
- Service的底层实现主要有Iptable和IPVS两种网络模式;
Service类型
- ClusterIP:默认,分配一个集群内部可以访问的虚拟IP(VIP);
- NodePort:在每个Node上分配一个端口作为外部访问入口;
- LoadBalancer:工作在特定的Cloud Provider上,例如:Google Cloud、AWS、OpenStack;
Service代理模式
底层流量转发与负载均衡实现:
- Iptables
- IPVS(新版本默认)
Iptables与IPVS对比
Iptables:
- 灵活,功能强大(可以在数据包不同阶段对包进行操作);
- 规则遍历匹配和更新,呈线性时延;
IPVS:
- 工作在内核态,有更好的性能;
- 调度算法丰富,rr、wrr、lc、wlc、ip hash;
DNS
- coredns(默认)
- kube-dns
Ingress
- 通过Service相关联;
- 通过Ingress Controller实现Pod的负载均衡;
- 支持TCP/UDP 4层和HTTP 7层;
K8S监控
Heapster+InfluxDB+Grafana:
K8S日志收集
- K8S系统组件日志;
- K8S Cluster里面部署的应用程序日志;
Filebeat+ELK