随笔分类 - Kubernetes
摘要:节点污点有点类似节点上的标签或注解信息,它们都是用来描述对应节点的元数据信息;污点定义的格式和标签、注解的定义方式很类似,都是用一个kv数据来表示,不同于节点标签,污点的键值数据中包含对应污点的effect,污点的effect是用于描述对应节点上的污点有什么作用;在k8s上污点有三个效用(effect),第一个效用是NoSchedule,表示拒绝pod调度到对应节点上运行;第二个效用是PreferSchedule,表示尽量不把pod调度到此节点上运行;第三个效用是NoExecute,表示拒绝将pod调度到此节点上运行;该效用相比NoSchedule要严苛一点;从上面的描述来看,对应污点就是来描述拒绝pod运行在对应节点的节点属性;
阅读全文
摘要:在k8s上调度器的工作逻辑是根据调度算法来实现对应pod的调度的;不同的调度算法,调度结果也有所不同,其评判的标准也有所不同,当调度器发现apiserver上有未被调度的pod时,它会把k8s上所有节点信息,挨个套进对应的预选策略函数中进行筛选,把不符合运行pod的节点淘汰掉,我们把这个过程叫做调度器的预选阶段(Predicate);剩下符合运行pod的节点会进入下一个阶段优选(Priority),所谓优选是在这些符合运行pod的节点中根据各个优选函数的评分,最后把每个节点通过各个优选函数评分加起来,选择一个最高分,这个最高分对应的节点就是调度器最后调度结果,如果最高分有多个节点,此时调度器会从最高分相同的几个节点随机挑选一个节点当作最后运行pod的节点;我们把这个这个过程叫做pod选定过程(select);
阅读全文
摘要:我们知道在k8s上我们可以用名称空间来隔离多个资源,在不同名称空间下我们可以创建相同名称和相同类型的资源;有些资源还必须依赖名称空间才可以被创建;但是在k8s上,名称空间不可以隔离网络,所谓隔离网络是指不管pod创建在那个名称空间下,都可以被其他名称空间下pod访问到;如果我们想要限制对应名称空间下的pod被别的名称空间或外部客户端访问,我们可以在对应名称空间下创建NetworkPolicy资源;该资源可以限制哪些pod可以被外部客户端访问,或者哪些pod不能够被哪个或哪些名称空间的pod访问;除了能够限制对应名称空间下的pod网络入站流量,它还可以限制对应名称空间下的pod出站的流量,允许或拒绝某个或某些个pod访问别的名称空间下pod或外部某服务等;我们可以简单的理解NetworkPolicy就是对应名称空间的一道防火墙;我们把NetworkPolicy资源创建在对应名称空间下,那么它就能实现对该名称空间下的pod进行流量管控;
阅读全文
摘要:我们知道在k8s上有三种网络,第一种是宿主机网络,这种网络没有列入容器编排的范畴内,是集群管理员自行维护;第二种网络上service网络,service网络也叫cluster网络,该网络本质上不会在任何网卡上存在,它是借助每个节点上的kube-proxy生成的iptables或ipvs规则,主要用来实现对pod访问的负载均衡,也是各服务间访问的网络;第三种网络就是pod网络,pod网络主要用来pod和pod间通信;
阅读全文
摘要:k8s的webui是一个插件运行在k8s之上,以pod的方式提供服务;它能够给使用k8s用户提供一个web面板,我们可以基于这个web面板来管理k8s集群;比如创建pod,创建svc,部署应用等等;在部署之前,先说一下dashboard认证过程;dashboard是以pod的形式运行在k8s之上,它本身没有做访问权限认证相关的功能,它只是把用户的认证信息代理到k8s集群上,具体的认证授权还是由k8s的apiserver进行;所以我们登录dashboard必须是k8s上的用户;其次它是一个pod形式把我们的认证信息代理到apiserver上,所以我们登录dashboard的用户必须是一个sa用户,它不支持常规用户;
阅读全文
摘要:在k8s上准入控制器的模块有很多,其中比较常用的有LimitRanger、ResourceQuota、ServiceAccount、PodSecurityPolicy等等,对于前面三种准入控制器系统默认是启用的,我们只需要定义对应的规则即可;对于PodSecurityPolicy这种准入控制器,系统默认没有启用,如果我们要使用,就必需启用以后,对应规则才会正常生效;这里需要注意一点,对应psp准入控制器,一定要先写好对应的规则,把规则和权限绑定好以后,在启用对应的准入控制器,否则先启用准入控制器,没有对应的规则,默认情况它是拒绝操作,在k8s上没有显式定义规则都是拒绝,这可能导致现有的k8s系统跑的系统级pod无法正常工作;所以对于psp准入控制器要慎用,如果规则和权限做的足够精细,它会给我们的k8s系统安全带来大幅度的提升,反之,可能导致整个k8s系统不可用;
阅读全文
摘要:在k8s上授权的机制有很多,最常用的有ABAC和RBAC;ABAC(attribute based access control)这种是基于属性做访问控制;RBAC(role based access control)这种是基于角色做访问控制;所谓基于属性做访问控制是指,对k8s上的资源的某种属性做授权,授权给相关用户对该资源的某个属性有什么权限;同样的逻辑基于角色做访问控制就是指把k8s上的资源,授权给对应角色有什么权限;那角色和用户有什么关系呢?对于RBAC授权模型来说,在k8s上用户是没法直接关联资源;它是通过角色对象来实现对资源的授权;用户授权是通过角色绑定对象来关联到对应角色;只要用户绑定到对应角色,那么该用户就拥有绑定角色上的所有权限;
阅读全文
摘要:用户认证只是验证对应客户端是否是合法客户端,这里的验证的机制是一票通过的机制;所谓一票通过是指在APIserver上有多种验证机制(方法),它会从上至下依次进行验证,如果对应验证方法没有明确拒绝,接着它会用下一个验证方法,直到有一个机制通过以后,余下的就不验证了;比如,在k8s上有证书验证,用户名密码验证,token验证,如果此时有一个客户端拿着一个token来登陆APIserver,此时APIserver就会先用证书验证的方法验证客户端,如果对应验证方法没有明确拒绝,说明此方法不识别对应的客户端信息,接着它会用用户名密码的方法进行验证,如果对应方法也没有明确拒绝,接着它会用token方法进行验证,如果对应方法通过了,那么接下来的其他方法验证就不会再进行下去;如果所有验证方法都没有拒绝,说明该客户端提供的认证信息在k8s上不适配,此时apiserver 就会把对应客户端归纳为匿名用户;当然此类用户虽然登陆到APIserver上,但它没有权限操作资源;
阅读全文
摘要:简单讲statefulset控制器主要用来在k8s上管理有状态应用pod;我们经常运维的一些应用主要可以分为4类,分别从是否有状态和是否有存储两个维度去描述,我们可以将应用分为有状态无存储,有状态有存储,无状态无存储和无状态有存储这四种;大部份应用都是有状态有存储或无状态无存储的应用,只有少数应用是有状态无存储或无状态有存储;
阅读全文
摘要:在k8s上一切皆对象,我们需要把对应的配置信息通过对应资源初始化为一个对象,然后通过pod调用对应的对象,从而实现向pod里的容器提供配置,这种能够把配置信息初始化为一个对象并被pod所调用的资源有两个,分别是configmap和secret;configmap和secret资源都是用来向pod提供配置信息的资源,两者用法都很相似,唯一不同的是configmap主要用于提供非敏感配置的资源,secret主要用来提供敏感配置的资源;简单讲就是configmap不加密,secret要对敏感配置做加密处理(严格上不叫加密,它是把对应敏感数据做base64编码处理);
阅读全文
摘要:volume的基础使用,需要我们用户手动来向不同类型存储接口传递不同的参数,从而实现把外部存储映射到k8s上的一个volume对象,使得pod才能正常的挂载对应的存储卷,对应pod里的容器才能正常使用;这种使用方式的前提是用户必须了解对应的存储系统,了解对应类型的存储接口,以及相关参数;这使得用户在k8s上使用存储卷变得有些复杂;为了简化这一过程,在k8s上使用pv和pvc资源来把对应底层存储接口给隐藏了,用户使用存储卷不再关心底层存储系统接口;不管底层是那种类型的存储,用户只需面对一个pvc接口即可;
阅读全文
摘要:在k8s上pod里可以运行一个或多个容器,运行多个容器,其中一个容器我们叫主容器,其他的容器是用来辅助主容器,我们叫做sidecar;对于pod来说,不管里面运行多少个容器,在最底层都会运行一个pause容器,该容器最主要用来为pod提供基础架构支撑;并且位于同一个pod中的容器都共享pause容器的网络名称空间以及IPC和UTS;这样一来我们要想给pod里的容器提供存储卷,首先要把存储卷关联到pause容器,然后在容器里挂载pause里的存储卷即可;
阅读全文
摘要:ingress 控制器和k8s上的其他控制不一样,ingress控制器并不能直接运行为kube-controller-manager的一部分,它类似k8s集群上的coredns,需要在集群上单独部署,本质上就是一个pod,我们可以使用k8s上的ds或deploy控制器来创建它;ingress controller pod的作用主要是引入集群外部流量,并实时监控着apiserver上ingress资源的变动,并将其ingress中定义的规则转化为对应ingress控制器对应应用程序的专有配置,然后动态的重载或重启对应守护进程来使其配置文件生效;在k8s上ingress是一种标准资源,它本质上就是我们定义的基于dns名称(host)或url路径把请求转发至指定service资源的规则;
阅读全文
摘要:Service资源在k8s上主要用来解决pod访问问题;我们知道在k8s上pod由于各种原因重建,对于重建后的podip地址和名称都是变化的,这样一来使得我们访问pod就变得有些不便;为了解决pod访问能有一个固定的端点,在k8s上就是用service来解决的;简单来讲,service对象就是工作在节点上的一组iptables或ipvs规则,用于将到达service对象ip地址的流量调度转发至相应endpoint对象指向的ip地址和端口之上;工作于每个节点的kube-proxy组件通过apiserver持续监控着各service及其关联的pod对象,并将其创建或变动实时反映至当前工作节点上相应的iptables或ipvs规则;其实service和pod或其他资源的关联,本质上不是直接关联,它依靠一个中间组件endpoint;
阅读全文
摘要:DaemonSet控制器的主要作用是管理守护进程类的Pod,通常用于在每个节点需要运行一个这样的Pod场景;比如我们要收集日志到es中,我们就可以使用这种控制器在每个节点上运行一个Pod;DaemonSet控制器和Deployment控制器很类似,不同的是ds(DaemonSet的简写)控制器不需要我们手动指定其运行的pod数量,它会根据k8s集群节点数量的变化而变化,如果新加入一个节点它会自动扩展对应pod数量,减少节点时,它也不会把之前运行在该节点上的pod调度到其他节点,总之一个节点上只能运行同类型Pod1个;除此之外ds它还支持通过节点选择器来做选择性的调度;比如,在某个拥有对应标签的节点就运行对应pod,没有就不运行;其他的更新操作和deployment差不多;
阅读全文
摘要:在k8s上控制器的类型有很多,比如pod控制,service控制器,endpoint控制器等等;不同类型的控制器有着不同的功能和作用;比如pod控制器就是针对pod资源进行管理的控制器;单说pod控制器,它也有很多类型,根据pod里容器跑的应用程序来分类,可以分为有状态应用和无状态应用控制,从应用程序是否运行为守护进程我们可以将控制器分为,守护进程和非守护进程控制器;其中无状态控制器中最常用的有ReplicaSet控制器和Deployment控制;有状态应用控制器常用的有StatefulSet;守护进程控制器最常用的有daemonSet控制器;非守护进程控制器有job控制器,对Job类型的控制器,如果要周期性执行的有Cronjob控制器;
阅读全文
摘要:pod生命周期分两个阶段,第一阶段是初始化容器,第二阶段是主容器的整个生命周期;其中对于主容器来来说,它的生命周期有分了三个阶段,第一阶段是运行post start hook,这个阶段是主容器运行之后立即需要做的事;第二阶段是主容器正常运行的阶段,在这个阶段中,我们可以定义对容器的健康状态检查和就绪状态检查;第三阶段是运行pre stop hook,这个阶段主要做容器即将退出前需要做的事;这里需要注意对于初始化容器来说,一个pod中可以定义多个初始化容器,他们必须是串行执行,只有当所有的初始化容器执行完后,对应的主容器才会启动;对于对容器的健康状态检查和就绪状态检查,我们也可以定义开始检查的延迟时长;因为有些容器存在容器显示running状态,但内部程序还没有初始化,如果立即做健康状态检查,可能存在健康状态为不健康,从而导致容器重启的状况;
阅读全文
摘要:对于pod来讲,我们知道使用pod控制器创建的pod在pod故障以后,重建后的pod它的ip地址和名称是变化的,为了解决pod访问问题,我们特此创建了service,我们访问service的ip地址就可以正常访问到pod;那么问题来了,service是怎样去关联pod的呢?我们知道在k8s上如果使用pod控制创建的pod,在pod发生故障以后,对应pod会被对应的控制器重启或重建,一个pod重建以后,对应的ip地址和名称都是会发生变化的,所以靠ip地址和名称关联pod是不行的;那靠什么关联pod呢?在k8s上是使用的标签和标签选择器的机制实现资源和资源间相互关联的;
阅读全文
摘要:我们知道在k8s上管理资源的方式有两种,一种是陈述式接口,一种是声明式接口;在前文我们用kubectl create的方式创建pod控制器,创建service,创建名称空间都是使用的陈述式命令的方式在k8s上管理资源;陈述式命令接口管理k8s上的资源的确很方便,但通常创建出来的资源有很多属性都不是我们期望的,所以陈述式命令在k8s集群上管理资源的方式一般不怎么推荐使用;我们要想自己手动定义一个资源,就需要使用声明式接口来创建资源;那么声明式接口该怎么用呢?很简单,我们只需要写一个描述资源的配置文件,然后使用apply命令指定应用对应的资源配置文件即可;
阅读全文
摘要:kubectl是k8s官方提供的工具,它是一款命令行工具,我们可以使用它来管理k8s集群,管理k8s集群上的资源;kubectl这个工具有很多子命令,每个子命令都有不同的功能,比如创建资源我们可以使用create或apply子命令来实现;不同的是在k8s上创建资源的方式有两种,一种是陈述式接口,一种是声明式接口;所谓声明式接口就是把我们要创建的资源,通过写成一个配置文件,然后使用apply子命令应用指定的配置文件的方式;陈述式接口是指我们要在命令行告诉k8s怎么去创建资源,比如创建pod控制器,使用什么镜像,副本数量等等;通常我们使用create子命令来陈述创建一个资源;当然create子命令也可以指定一个资源清单的方式来创建资源;两者不同的是apply可以多次执行,如果发现对应清单有变化就应用变化部分,没变化就不应用;而create不能多次执行;
阅读全文