kubernetes概念 - Kubernetes Pod控制器

Kubernetes资源清单 类别 名称 工作负载型资源(workload) 运行应用程序,对外提供服务:Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、Cronjob (ReplicationController在v1.11版本被废弃) 服务发现及负载均衡 service、Ingress 配置与存储 Volume、CSI(容器存储接口 特殊类型存储卷 ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感数据)、DownwardAPI(把外部环境中的信息输出给容器) 集群级资源 Namespace、Node、Role、ClusterRole、RoleBinding(角色绑定)、ClusterRoleBinding(集群角色绑定) 元数据型资源 HPA、PodTemplate(Pod模板,用于让控制器创建Pod时使用的模板)、LimitRange(用来定义硬件资源限制的) Kubernetes配置清单使用说明 在Kubernetes中创建资源时,除了命令式创建方式,还可以使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单。资源清单由很多属性或字段所组成。 以yawl格式输出pod的详细信息。 资源清单格式 yaml 1 kubectl get pod clients -o yaml Pod资源清单常用字段讲解 在创建资源时,apiserver仅接收JSON格式的资源定义。在使用kubectl run命令时,自动将给定内容转换成JSON格式。yaml格式提供配置清单,apiserver可自动将其转为JSON格式,(yaml可无损转为json),而后再提交。使用资源配置请清单可带来复用效果。 Pod资源配置清单由五个一级字段组成,通过kubectl create -f yamlfile就可以创建一个Pod apiVersion: 说明对应的对象属于Kubernetes的哪一个API群组名称和版本。给定apiVersion时由两部分组成group/version,group如果省略表示core(核心组)之意。使用kubectl api-versions获得当前系统所支持的apiserver版本。alpha 内测版、beta 公测版、stable 稳定版 kind: 资源类别,用来指明哪种资源用来初始化成资源对象时使用。 metadata: 元数据,内部嵌套很多2级、3级字段。主要提供以下几个字段。 name,在同一类别当中name必须是唯一的。 namespace 对应的对象属于哪个名称空间,name受限于namespace,不同的namespace中name可以重名。 lables key-value数据,对于key名称及value,最多为63个字符,value,可为空。填写时只能使用字母、数字、_、-、.,只能以字母或数字开头及结尾。 annotations 资源注解。与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供“元数据”。对键值长度没有要求。在构建大型镜像时通常会用其标记对应的资源对象的元数据 spec: specification,定义接下来创建的资源对象应该满足的规范(期望的状态 disired state)。spec是用户定义的。不同的资源类型,其所需要嵌套的字段各不相同。如果某一字段属性标记为required表示为必选字段,剩余的都为可选字段,系统会赋予其默认值。如果某一字段标记为Cannot be updated,则表示为对象一旦创建后不能改变字段值。可使用kubectl explain pods.spec查看详情。 containers [required]object list name [string] 定义容器名称 image [string] 启动Pod内嵌容器时所使用的镜像。可是顶级、私有、第三方仓库镜像。 imagePulLPolicy [string] 镜像获取的策略,可选参数Always(总是从仓库下载,无论本地有无此镜像)、Never(从不下载,无论本地有无此镜像)、IfNotPresent(本地存在则使用,不存在则从仓库拉去镜像)。如果tag设置为latest,默认值则为Always,非latest标签,默认值都为IfNotPresent。...

 ·  · 

kubernetes概念 - kubernetes调度

Overview kube-scheduler 是kubernetes控制平面的核心组件,其默认行为是将 pod 分配给节点,同时平衡Pod与Node间的资源利用率。通俗来讲就是 kube-scheduler 在运行在控制平面,并将工作负载分配给 Kubernetes 集群。 本文将深入 Kubernetes 调度的使用,包含:”一般调度”,”亲和度“,“污点与容忍的调度驱逐”。最后会分析下 Scheduler Performance Tuning,即微调scheduler的参数来适应集群。 简单的调度 NodeName [1] 最简单的调度可以指定一个 NodeName 字段,使Pod可以运行在对应的节点上。如下列资源清单所示 yaml 1 2 3 4 5 6 7 8 9 apiVersion: v1 kind: Pod metadata: name: netpod spec: containers: - name: netbox image: cylonchau/netbox nodeName: node01 通过上面的资源清单Pod最终会在 node01上运行。这种情况下也会存在很多的弊端,如资源节点不足,未知的nodename都会影响到Pod的正常工作,通常情况下,这种方式是不推荐的。 bash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 $ kubectl describe pods netpod Name: netpod Namespace: default ....

 ·  · 

kubernetes概念 - Service

在Kubernetes集群中,Pod是有生命周期的,为了能够给对应的客户端提供一个固定访问端点,因此在客户端与服务端(Pod之间)添加了一个固定中间层,这个中间层被称之为Service。Service的工作严重依赖于在Kubernetes集群之上,部署的附件Kubernetes DNS服务。较新版本使用的coreDNS,1.11之前使用的KubeDNS。 service的名称解析是强依赖于DNS附件的。因此在部署完Kubernetes后,需要部署CoreDNS或KubeDNS。 Kubernetes要想向客户端提供网络功能,依赖于第三方方案,在较新版本中,可通过CNI容器网络插件标准接口,来接入任何遵循插件标准的第三方方案。 Service从一定程度上来说,在每个节点之上都工作有一个组件Kube-proxy,Kube-proxy将始终监视apiserver当中,有关service资源的变动状态。此过程是通过Kubernetes中固有的请求方法watch来实现的。一旦有service资源的内容发生变动,kube-proxy都将其转换为当前节点之上的能够实现service资源调度至特定Pod之上的规则。 service实现方式 在Kubernetes中service的实现方式有三种模型。 userspace 用户空间,可以理解为,用户的请求。 1.1之前包括1.1使用此模型。 用户的请求到达当前节点的内核空间的iptables规则(service规则),由service转发至本地监听的某个套接字上的用户空间的kube-proxy,kube-proxy在处理完再转发给service,最终代理至service相关联的各个Pod,实现调度。 iptables 1.10- 客户端IP请求时,直接请求serviceIP,IP为本地内核空间中的service规则所截取,并直接调度至相关Pod。service工作在内核空间,由iptables直接调度。 ipvs 1.11默认使用,如IPVS没有激活,默认降级为iptables 客户端请求到达内核空间后,直接由ipvs规则直接调度至Pod网络地址范围内的相关Pod资源。 使用清单创建service资源 SVC中的kubernetes service是集群中各Pod需要与Kubernetes集群apiserver联系时需要通过此svc地址联系。这个地址是集群内的apiserver服务地址。 service类型 ClusterIP 默认值,表示分配集群IP地址,仅用于集群内通信。自动分配地址,如需固定,需要指定相应地址,在创建后无法修改。当使用ClusterIP时,只有两个端口有用,port与targetPort NodePort 接入集群外部流量,默认分配的端口是30000~32767 LoadBalancer 表示将Kubernetes部署在虚拟机上,虚拟机是工作在云环境中,云环境支持lbaas(负载均衡及服务的一键调用)。 ExternaName 表示将集群外部服务引用到集群内部中来,在集群内部直接使用。 yaml 1 2 3 4 5 6 7 8 9 10 11 12 spec: ports: # 将哪个端口与后端容器端口建立关联关系。 - port # service对外提供服务的端口 name 指明port的名称 targetPort # 容器的端口 nodePort # 只有类型为NodePort时,才有必要用节点端口,否则此选项是无用的。 protocol 协议,默认TCP seletcor 关联到哪些Pod资源上 app: redis run: redis clusterIP: # clusterIP可以动态分贝可以不配置 type: ClusterIP yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: v1 kind: Service metadata: name: redis namespace: default spec: selector: run: redis clusterIP: 10....

 ·  · 

kubernetes概念 - serviceaccount

在整个Kubernetes集群来讲 apiserver是访问控制的唯一入口。如通过service或ingress暴露之后,是可以不通过apiserver接入的,只需要通过节点的nodePort或者ingress controller daemonset共享宿主机节点网络名称空间监听的宿主机网络地址(节点地址),直接接入。 当请求到达APIServer时,会经历几个阶段,如图所示 图:Kubernetes API 请求的请求处理步骤图 Source:https://kubevious.io/blog/post/securing-kubernetes-using-pod-security-policy-admission-controller 任何用户(sa与人类用户)在通过任何方式试图操作API资源时,必须要经历下列的操作: Authentication,这个步骤在建立TLS连接后,验证包含,证书、密码,Token;可以指定多种认证,依次尝试每一个,直到其中一个认证成功。如果认证失败,此时客户端收到的是401。 Authorization,此步骤是在完成 Authentication 后确定了来源用户,此时用户的请求动作必须被授权。如bob用户对pod资源有 get , list 权限操作。如果 Admission Control:此步骤为图3,与 Authorization 不同的时,这里只要有任意准入控制器拒绝,则拒绝;多个准入控制器会按顺序执行 Refer to controlling access 认证 Kubernetes是高度模块化设计的,因此其认证授权与准入控制是各自都通过插件的方式,可由用户自定义选择经由什么样的插件来完成何种控制逻辑。如对称秘钥认证方式、令牌认证。由于Kubernetes提供的是resetful方式的接口,其服务都是通过HTTP协议提供的,因此认证信息只能经由HTTP协议的认证首部进行传递,此认证首部通常被称作认证令牌(token)。 ssl认证,对于Kubernetes访问来讲,ssl证书能让客户端去确认服务器的身份,(要求服务端发送服务端证书,确认证书是否为认可的CA签署的。)在Kubernetes通信过程当中,重要的是服务器还需认证客户端的身份,因此==Kubectl也应有一个证书,并且此证书为server端所认可的CA所签署的证书==。并且客户端身份也要与证书当中标识的身份保持一致。双方需互相做双向证书认证。认证之后双方基于SSL会话实现加密通讯。 注:kubernetes认证无需执行串行检查,用户经过任何一个认证插件通过后,即表示认证通过,无需再经由其他插件进行检查。 授权 kubernetes的授权也支持多种授权插件来完成用户的权限检查,kubernetes 1.6之后开始支持基于RBAC的认证。除此只外还有基于节点的认证、webhook基于http回调机制,通过web的rest服务来实现认证的检查机制。最重要的是RBAC的授权检查机制。基于角色的访问控制,通常只有许可授权,没有拒绝授权。默认都是拒绝。 在默认情况下,使用kubeadm部署Kubernetes集群是强制启用了RBAC认证的。 准入控制 一般而言,准入控制本身只是用来定义对应授权检查完成之后的后续其他安全检查操作的。 用户账号 一般而言用户账号大体上应具有以下信息 user 用户,一般而言由username与userid组成。 group 用户组 extra 用来提供额外信息 API资源 k8sapiserver是分组的,向哪个组,哪个版本的哪个api资源对象发出请求必须进行标识,所有的请求资源通过url path进行标识的。如 /apis/apps/v1/,所有名称空间级别的资源在访问时一般都需指名namespaces关键词,并给出namespaces名称来获取 /apis/apps/v1/namespaces/default/ /apis/apps/v1/namespaces/default/nginx 。 一个完整意义上的url 对象引用url格式 ==/apis/<GROUPS>/<VERSION>/namespaces/<NameSpace_name>/<Kind>/[/object_id]== bash 1 2 3 $ kubectl api-versions admissionregistration.k8s.io/v1beta1 ... Kubernetes中,所有的api都取决于一个根 /apis text 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 $ curl -k --cert /etc/k8s/pki/apiserver-kubelet-client....

 ·  · 

kubernetes概念 - RBAC

Kubernetes API Object 在Kubernetes线群中,Kubernetes对象是持久化的实体(最终存入etcd 中的数据),集群中通过这些实体来表示整个集群的状态。前面通过kubectl来提交的资源清单文件,将我们的YAML文件转换成集群中的一个API对象的,然后创建的对应的资源对象。 Kubernetes API是一个以JSON为主要序列化方式的HTTP服务,除此之外支持Protocol Buffers序列化方式(主要用干集群内年件间的通信)。为了api的可扩展性,Kubemetes在不同的API路径(/api/v1或/apis/batch)下面支持了多个API版本,不同的API版本就味不同级别稳定性和支持。 Alpha :例如v1Alpha:默认情况下是禁用的,可以随时删除对功能的支持。 Beta:例如 v2beta1 默认是启用的,表示代码已经经过了很好的测试,但是对象的语义可能会在施后的版本中以不兼咨的方式更改 Stable:例如:v1 表示已经是稳定版本,也会出现在后续的很多版本中。 在Kubernetes集群中,一个API对象在Etcd 里的完整资源路径,是由:group (API组)、 version (API版本) 和 Resource API资源类型)三个部分组成。通过这种的结构,整个Kubernetes 中所有API对象,就可以用如下的树形结构表示出来: Kubernetes API Object的使用 API对象组成查看:kubectl get --raw / 通常,KubernetesAPI支持通过标准HTTP P0ST、PUT、DELETE 和 GET 在指定PATH路径上创建、更新、删除和检索操作,并使用JSON作为默认的数据交互格式。 如要创建一个Deployment对象,那YAML文件的声明就需: yaml 1 2 apiVersion: apps/v1 # kind: Deployment Deployment就是这个API对象的资源类型(Resource),apps就是它的组(Group),v1就是它的版本(Version)。API Group、Version 和资源满唯一定义了一个HTTP路径,然后在kube-apiserver 对这个url进行了监听,然后把对应的请求传递给了对应的控制器进行处理。 API对象参考文档 授权插件分类 Node 由节点来认证。 ABAC 基于属性的访问控制,RBAC之前的授权控制的插件算法 RBAC Role-based Access Control。 Webhook 基于http的回调机制来实现访问控制。 RBAC 基于角色的访问控制可以理解为,角色(role)反而是授权的机制,完成了权限的授予、分配等。角色是指一个组织或者任务工作中的位置,通常代表一种权利、资格、责任等。在基于角色的访问控制中还有一种术语叫做 ==许可==(permission)。 简单来讲就如同上图描述,使用户去扮演这个角色,而角色拥有这个权限,所以用户拥有这个角色的权限。所以授权不授予用户而授予角色。 RBAC 使用 rbac.authorization.k8s.ioAPI组来驱动鉴权操作,允许管理员通过 Kubernetes API 动态配置策略。...

 ·  ·