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访问服务外,也可用域名来访问服务。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐