K8S基础理论
k8s核心特点是能够自主的管理容器,简单高效;可以实现应用创建、更新、回滚、扩容、减容、故障自恢复;不仅支持docker,还支持containerd、podman、rocket。
k8s最初是谷歌开源,捐给CNCF基金会(致力于云原生技术的普及和可持续发展)
kubernetes是谷歌borg的开源项目,简称k8s。是用于管理云平台中多个主机上的容器化的应用;核心特点是能够自主的管理容器,简单高效;可以实现应用创建、更新、回滚、扩容、减容、故障自恢复;不仅支持docker,还支持containerd、podman、rocket。
编排特点:便携:支持公有云、私有云、混合云;
可拓展:模块化、可插拔、可任意组合;
自修复:自动重调度,自动重启;
一.k8s架构 不同节点类型
控制/管理/主节点:master
计算/工作节点:worker node
每个节点可以是一台物理机,也可以是一台虚拟机;
调用过程:
原:k8s-kubucli-API-server => kubelet => CRI(解除耦合)=> dockershim(将k8s指令转化为docker指令) =>docker-client-cli => dockerd => containerd runtime(创建容器) => runc => kernel
改版:k8s-kubucli-API-server => kubulet => CRI(解除耦合 => containerd runtime(创建容器) => runc => kernel
现:k8s-kubucli-API-server => kubulet => CRI(解除耦合)=> CRI-dockerd =>docker-client-cli => dockerd => containerd runtime(创建容器) => runc => kernel
二.master节点组件:
1.三大必选基础组件:
(1)api server:服务入口
管理服务的统一且唯一入口,自身提供认证、授权、访问控制。可以水平扩展(通过部署更多实例来缩放),对外暴露k8s api;所有的管理请求都发送到api-server,信息记录到etcd;联络controller-manager进行管理;联络schedule进行资源调度;任务下发到worker node kubelet
(2)controller-manager:编排管理
集群控制,编排管理,负责维护k8s集群状态,故障检测,自动扩展,滚动更新,处理集群中任务,按照预设期望值运行
(3)scheduler:控制调度
负责资源的控制调度,按照预定调度策略将pod调度到对应的worker node(如 监视没有分配节点的新创建的pod,选择一个节点供他们运行)
2. etcd:k8s数据库
主要用于记录k8s相关信息,key/value分布式数据库,键值数据库,可以安装在master节点或单独使用服务器搭建etcd集群
常用两种安装方法:
kubeadm - etcd默认安装在master节点;
二进制安装 - 可以选择将etcd单独安装(居多)
3.可以安装其他可选服务组件
(1)kubelet
(2)kube-proxy
当采用kubeadm安装时,管理节点组件以pod-容器方式部署在管理节点中,拉活pod需要kubelet,管理节点组件对外提供访问需要通过kube-proxy
(3)dashboard:为k8s集群提供B/S web访问方式(第三方web方式)
(4)prometheus/heapster:提供k8s集群监控
(5)ELK:对k8s集群统一日志监控
(6)federation:提供跨集群,跨dc的多k8s统一管理
(7)ingress controller:ingress七层代理
(8)coredns:为k8s集群提供域名解析服务
(9)flannel:单独为k8s环境提供网络规划
etc...
4.k8s支持master水平扩展多节点架构
在前端部署keepalive / nginx,作为一个前端集群
controller-manager / schedule 自身支持leader选举
(补图)
三.worker node节点组件:
1.kubelet:管理容器引擎(容器运行时)
可以直接和容器引擎直接交互,实现对容器的生命周期进行管理,创建、启动、删除、修改;接收从api-server发送的管理指令;监控worker node 状态信息,上报到api-server
2.kube-proxy:软件负载均衡器(服务发现)
worker节点的反向负载均衡(反向服务代理),负责向worker节点写入iptables规则
3.container engine 容器引擎:最终创建容器
pod k8s最小管理单元,在其内部服务以容器方式进行发布
四.k8s管理方式
1.命令行管理
kubectl - 工具 提供命令行管理 - 可部署在master节点中或管理主机
例如:kubectl --help
2.图形化管理
安装dashboard ,提供web管理界面
五.k8s操作对象
1.pod
(1)pod是k8s管理的最小基础单元,最终以容器的形式存在
(2)一个pod中可以创建一个或者多个容器,如果一个pod创建/发布多个容器,多个容器之间一般紧密耦合
(3)在每个pod中会首先发布一个pause容器,成为根容器,该容器会首选获取k8s资源列表中的网络资源及存储资源
例:kubectl get pods -n test -o wide (-o 输出格式 wide 宽格式)
(4)k8s发布完根容器之后,会继续在pod中部署业务容器(应用容器)
(5)pod中的所有业务容器和根容器共享ip和数据卷 ,pod内的容器之间互通可以基于loopback+localhost互访
pod - status 五种状态:
pending 挂起:k8s api server接收到管理员(kubectl/dashboard)发送到创建指令,api server 通知kubelet,kubelet通知容器引擎/容器运行时创建容器,创建容器需要时间
running 正常运行中:pod已经正常被创建,容器正常运行
succeeded pod正常终止:pod内的所有容器都正常退出,并且也不会再继续自动重启
failed pod异常终止:pod内的容器在退出时属于非正常退出,由系统强制将其退出,容器可以自动重启
unknown 未知状态:该状态表示k8s master 节点和worker node之间通信出了问题
异常状态列表:
crashloopbackoff:容器退出,kubelet正在将它启动
invalidimagename:无法解析镜像名称
imagesinspecterror:无法校验镜像
errimagesneverpull:策略禁止拉取镜像
imagespullbackoff:正在重试拉取
registryunavilable:链接不到镜像中心
errimagespull:通用的拉取镜像出错
creatcontaiinerconfigerror:不能创建kubelet使用的容器配置
creatcontainererror:创建容器失败
m.internallifecycle.prestartcontainer:执行hook报错
runcontainererror:启动容器失败
poststarthookerror:执行hook报错
containersnotinitialized:容器没有初始化完毕
containersnotread:容器没有准备完毕
containercreating:容器创建中
podinitializingpod:初始化中
dockerdaemonnotready:docker还没有完全启动
networkpluginnotready:网络插件还没有完全启动
2.lable标签
标签是附在k8s对象(如pod,deployment等)上的键值对(key value),可以在创建时指定,也可以在创建后指定:
key值必须唯一,不能超过63个字符;可以使用前缀,使用/分割,前缀必须是dns子域,不得超过253个字符,系统中的自动化组件创建的lable必须指定前缀,kubernetes.io/由kubernetes保留 ;起始必须是字母(大小写都可以)或数字,中间可以由连字符、下划线和点。
标签管理用给k8s资源添加自定义属性,主要用来做过滤
lable的值本身不具备具体含义,但可以通过lable来筛选对象特定的子集,便于管理
每一个对象可以有多个标签
3.namespace命名空间
k8s支持多个虚拟集群,他们底层依赖于同一个物理集群,这些虚拟集群被称为命名空间。命名空间提供了良好的资源隔离,可以用于区别不同的项目、用户等,如开发测试使用的namespace,或者生产使用的namespace
常见namespace:
kube-system:k8s系统创建对象所使用的命名空间
default:没有知名使用其他命名空间的对象所使用的默认
查看环境命名空间:kubelet get ns
基于命名空间方式查找pod信息:kubelet get pod --namespace=test
当前系统环境:kubelet get pod -n kube-system
4.deployment(部署)
创建deployment时也会自动创建replicaset;deployment可以管理一个或多个replicaset,并且通过replicaset来管理pod。
从小到大的管理逻辑:容器<pod<replicaset<deployment
容器对比虚拟机,最大的优势在于可以灵活的弹性伸缩,而这一部分工作由k8s进行调度。
当使用的deploment需要升级时,可以滚动升级deployment中所有pod
5.service服务
k8s定义一种抽象:逻辑上的一组pod,一种可以访问他们的策略-通常称为微服务。这一组pod能够被service访问到,通常是通过label selector实现的。
查看服务:kubelet get service
service的实现类型:
cluster ip:提供一个集群内部的虚拟ip地址以供pod访问(默认模式)
nodeport:在node上打开一个端口以供外部访问
loadbalancer:通过外部的负载均衡器来访问
endpoint controller负责维护service和pod的对应关系
kube-proxy负责service的实现,即实现了k8s内部从pod到service和外部从node port到service的访问。
endpoint controller:
负责生成和维护所有endpoint对象的控制器
负责监听service和对应pod的变化
监听到service被删除,则删除和该service同名的endpoint对象
监听到新的service被创建,则根据新建service信息获取相关pod列表,然后创建对应endpoint对象
监听到service被更新,则根据更新后的service信息获取相关pod列表,然后更新对应endpoint对象
监听到pod事件,则更新对应的service的endpoint对象,将pod ip记录到endpoint中
基于相对多规模的service,ipvs(采用hash表)比iptables,有更高查表速度
coredns是一个轻量级的dns服务器,通过插件的形式在kubernetes集群内实现,提供服务发现功能,使得用户除了可以用ip访问服务外,也可用域名来访问服务。
更多推荐
所有评论(0)