总述
在构成扁平化网络的基础上实现Pod编排(控制、管理)、调度,再构成服务;对服务的管理有所欠缺;可以说k8s重点解决资源的问题
服务管理、应用管理;istio重点解决服务的问题
功能
开源、动态伸缩、负载均衡、轻量、有状态服务
架构
Control Plane (master):api-server controller scheduler etcd
node:kubelet kubeproxy pod(container)
client:kubectl webUI
docker:一种CRI,宿主机容器创建和管理工作
pod:包含容器,pause容器>>init C容器>>主容器
svc:由pod构成的服务
controller:控制pod的副本数目
kubelet:通过CRI(容器运行时接口)管理pod的生命周期
kubeproxy:
- svc构成:监控pod和svc的变化,操作网络代理(iptable或者ipvs)为pod构成svc服务
- 负载均衡
CoreDNS:为svc提供域名解析
Ingress Controller:本质书写网络代理方案(默认nginx规则);官方只能实现四层代理,ingress 可以实现七层代理;nginx代理
etcd:分布式键值存储服务;为整个集群提供存储服务
Dashboard:网页面板;web UI
Promethus:提供K8S集群的监控能力
KubeSphere:在 Kubernetes 之上构建的面向云原生应用的分布式操作系统
Federation:管理多个k8s;提供一个可以跨集群中心多K8S统一管理功能
网络
CNI(container network interface)
- Flannel:为集群中的Pod构成了一张网络,为Pod提供全集群唯一的内部IP
- Calico:基于BGP的纯L3的网络通信架构
- Cilium:支持L3/L4/L7,基于BPF进行数据包过滤
CNI(container network interface) Flannel:
- L3的网络通信架构
- 不同节点主机创建的pod都具有"全集群唯一的虚拟IP地址",
- 使用etcd管理IP地址段资源,维护pod路由表;
- 基于 Iptables或者ipvs 进行进行数据包过滤;
- 集群内部不同节点主机创建的容器都具有全集群唯一的虚拟IP地址;避免ip相同,调整docker0 设置不同docker为不同网段。internet还是使用的真实IP
- Flannel使用UDP协议承载虚拟iP
负载均衡
- iptables:为防火墙而设计的,也有负载均衡能力
- IPVS:专用于高性能负载均衡,并使用更高效的数据结构(Hash表)
网络代理:
- nginx:ingress默认使用nginx
不同实体通信过程:
- 同一pod不同容器:通过pause容器
- pod与svc之间:kubeproxy感知Pod和svc的变化,生成的iptables规则或ipvs规则
- 同一节点不同pod:通过docker0
- 不同节点不同pod:通过Flannel0
账户
ServiceAccount
私有镜像仓库,镜像拉取所需服务账号
存储
存储分类:
- ConfigMap:环境变量env使用cm,command参数使用cm,volume使用cm;热更新,volume使用了configMap,configMap修改后可以热更新到volume中(10s);更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新
- Secret:密码
- volume:数据卷。emptyDir空目录,生命周期与pod一致;hostPath,持久化到k8s的node(主机)目录
- PV:持久化卷
StatefulSet
- 存储(NFS)>>PV>>StatefulSet(PVC>>pod)
- 存储构成PV;PVC选择PV;Pod挂载PVC;StatefulSet创建PVC;StatefulSet引用headless SVC
Pod
pod构成:自定义容器(容器A 容器B)共用pause容器的“网络栈”和“挂载卷”;
pod状态:Pending Running Successed Failed Unknown
Pod生命周期:
- 过程:pause容器>>init C>>启动主容器
- init C:顺序执行
- main C状态:start, liveness (readiness, stop)
- main C状态liveness:主容器是否存活
- main C状态readiness:主容器是否可以对外提供服务
- main C探针:readinessProbe, livenessProbe
- main C探针类型:http, exec, tcpSocket, grpc
- main C启动/停止:postStart, preStop
Service(svc)
svc功能:多个pod组成一个service;service向外提供IP服务
svc分类:
- clusterIP(默认):分配内网IP,svcIP映射到PodIp(iptables规则、ipvs规则);kubeproxy管理这个svc;iptables或ipvs进行负载均衡
- nodeport:分配外网IP
- headless:clusterIP: “None” 就是Headless;不分配内网IP,svc域名解析到PodIP;kubeproxy不会管理这个svc,不会使用iptables或ipvs进行负载均衡
- ExternalName:由集群内到外;从集群重定向到集群外部;重定向发生在DNS层
- LoadBalancer:由外到集群内;云提供商去创建LB 来向节点导流;loadBalancer比nodePort多了一步,就是可以调用 云提供商去创建LB 来向节点导流
容器
容器重启策略:restartPolicy
- Always:总是重启;容器失效时,kubelet 自动重启该容器。
- OnFailure:失败退出重启;容器终止运行且退出码不为0时重启。
- Never:不重启;不论状态为何,kubelet 都不重启该容器。
镜像拉取策略:imagePullPolicy
- IfNotPresent:本地没有使用远程;默认值。
- Never:只使用本地,不适用远程。
- Always:不使用本地,只使用远程。
CoreDNS
CoreDNS为svc提供内网域名解析(svc域名-svc ip);集群外部无法访问因为仍然是ClusterIP类型
Ingress
作用:提供nginx能力,nginx有的能力ingress都有
本质:ingress把我们定义的网络代理方案写入到创建的ingress pod(ingress-nginx名称空间中的ingress-pod)主容器中的nginx配置文件中
流程
- 请求域名+端口
- ingress的pod构成的svc(nodeport(低版本k8s)或loadBalancer(高版本k8s))外部端口
- ingress的pod,nginx配置文件(ingressSVC外部端口 自己的SVC内部端口)
- 自己的pod构成的svc(ClusterIP)内部端口
- 自己的pod
Controller
一般就是用ReplicaSet;无状态服务就用Deployment;有状态服务就用StatefulSet
ReplicaSet:维持服务数量(支持创建副本时添加选择器)
Deployment:发布等功能(支持滚动更新);deployment通过RS去控制pod;创建新RS>>创建新Pod>>删除旧Pod>>关闭旧RS
StatefulSet:有状态服务(Deployments 和 ReplicaSets 只支持无状态服务);将部署顺序、网络等信息存储下来。
DaemonSet:node节点上有且只有一份pod;公共服务;支持pod (确保全部(或者一些) Node节点(非master节点)上都运行一个 Pod 的副本(有且只有一个))比如ELK;与RS无关
Job:负责批处理任务,即仅执行一次的任务;job执行完后不会自动删除
Cron Job:在job基础上加了定时调度;Cronjob>>job>>pod;定时执行一次;删除cronjob会自动删除job和pod
Deployment
deployment、rs、pod名称之间关系:
# kubectl get deployment
deployment-rsjapp
# kubectl get rs
deployment-rsjapp-6665f85c58
# kubectl get pod
deployment-rsjapp-6665f85c58-6cbmz
StatefulSet
存储>>PV>>StatefulSet(PVC>>pod)
存储构成PV;PVC选择PV;Pod挂载PVC;StatefulSet创建PVC;StatefulSet引用headless SVC
CronJob
cronjob、job、pod名称之间关系:
cronjob-pi
cronjob-pi-1608196200
cronjob-pi-1608196200-chjpc
Job
job、pod名称之间关系:
job-pi
job-pi-pqx6p
简介
pod网络
总述:Kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中
- Flannel:基于L2,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。
- Calico:纯L3,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。
组件
- Master节点:
- API Server(kube-apiserver):提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作的唯一入口,也是集群中的入口进程
- Controller Manager(kube-controller-manager):kubernetes里所有资源对象的自动化控制中心,可以理解成为资源对象的“大总管”
- Scheduler:(kube-scheduler):负责资源调度(pod调度)的进程,相当于公交公司的“调度室”
- Etcd:所有资源对象的数据被会被保存到etcd中,持久化
- Node节点:
- docker engine:docker引擎,负责本主机的容器创建 和管理工作
- kubelet:负责pod对应容器的创建,启停等任务,另外kubelet与master紧密协作,随时报告给master自身的情况,如CPU,内存,操作系统,docker版本等
- kube-proxy:实现kubernetes server的通信与负载均衡机制的重要组件;提供svc服务(服务发现);负责写入规则至 IPTABLES(ip数据包过滤)、IPVS(负载均衡) 实现服务映射访问的;
- k8s其它组件:
- kubectl:命令行工具
- DASHBOARD:网页面板;给 K8S 集群提供一个 B/S 结构访问体系
k8s
- pod控制器:Deployment 》ReplicaSet 》pod
- kubectl run 并不是直接创建一个 Pod,而是先创建一个 Deployment 资源(replicas=1),再由与 Deployment 关联的 ReplicaSet 来自动创建 Pod
- CNI(flannel或Calico)将为pod构建网络。
- 为pod创建svc 可以获取cluster_ip