k8s学习笔记(7)---kubernetes核⼼组件之apiserver详解kubernetes核⼼组件之apiserver详解
1、API Server简介
k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接⼝,是整个系统的数据总线和数据中⼼。
1.1 API Server的功能
提供了集管理的REST API接⼝(包括认证授权、数据校验以及集状态变更);
提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd);
是资源配额控制的⼊⼝;
拥有完备的集安全机制;
1.2 kube-apiserver⼯作原理
kube-apiserver提供了k8s的rest api,实现了认证、授权和准⼊控制等安全功能,同时也负责了集状态
的存储操作。
rest api
kube-apiserver⽀持同时提供https和http api,其中http api是⾮安全接⼝,不做任何认证授权机制,不建议⽣产环境启⽤,但两个接⼝提供的rest api格式相同。
https api 默认监听在6443端⼝(–secure-port=6443);
http api 默认监听在127.0.0.1的8080端⼝(使⽤参数 --insecure-port=8080);
访问控制说明
k8s api 每个请求都会经过多阶段的访问控制才会被接受,包括认证、授权及准⼊控制等。
认证
开启TLS情况下,所有请求都需要⾸先认证。k8s⽀持多种认证机制,并且⽀持同时开启多个认证插件(仅⼀个认证通过即可),如认证成功,则⽤户的username会传⼊授权模块做进⼀步的授权验证,⽽认证失败的请求则返回http 401 。
授权
认证之后的请求就到了授权模块,和认证类似,k8s也⽀持多种授权机制,并⽀持同时开启多个授权插件(仅⼀个验证通过即可)。如授权成功,则⽤户的请求会发送到准⼊控制模块做进⼀步的请求验证,失败的请求则返回http403。
准⼊控制
⽤来对请求做进⼀步的验证或添加默认参数,不同于认证和授权只关⼼请求的⽤户和操作,准⼊控制还会处理请求的内容,并且仅对创建、更新、删除或连接(如代理)等有效,⽽对读操作⽆效。准⼊控制也⽀持同时开启多个插件,但他们是依次调⽤的,只有全部插件都通过的请求才可以允许进⼊系统。
kube-apiserver⼯作原理图如下:
1.3 访问kubernetes API
k8s通过kube-apiserver这个进程提供服务,该进程运⾏在单个k8s-master节点上,默认有两个端⼝。
本地端⼝
1.该端⼝⽤于接收HTTP请求;
2.该端⼝默认值为8080,可以通过API Server的启动参数“–insecure-port”的值来修改默认值;
3.默认的IP地址为“localhost”,可以通过启动参数“–insecure-bind-address”的值来修改该IP地址;
4.⾮认证或授权的HTTP请求通过该端⼝访问API Server;
安全端⼝
1.该端⼝默认值为6443,可通过启动参数“–secure-port”的值来修改默认值;
2.默认IP地址为⾮本地(Non-Localhost)⽹络端⼝,通过启动参数“–bind-address”设置该值;
3.该端⼝⽤于接收HTTPS请求;
4.⽤于基于Tocken⽂件或客户端证书及HTTP Base的认证;
5.⽤于基于策略的授权;
6.默认不启动HTTPS安全访问控制
1 直接访问api
通过本地8080端⼝使⽤curl命令能直接获取REST api的信息,例如:
查看版本:
curl 127.0.0.1:8080/api
查看⽀持的资源对象:
curl 127.0.0.1:8080/api/v1
查看资源对象信息:
curl 127.0.0.1:8080/api/v1/nodes
curl 127.0.0.1:8080/api/v1/pods
curl 127.0.0.1:8080/api/v1/services
curl 127.0.0.1:8080/api/v1/replicationcontrollers
具体到某⼀个具体的对象:
curl 127.0.0.1:8080/api/v1/nodes/10.0.0.3
指定不同namespace中的对象进⾏访问:
curl 127.0.0.1:8080/api/v1/namespaces/default/services/php-apache
直接访问后端服务内容:
curl 127.0.0.1:8080/api/v1/namespaces/default/services/http:tomcat-service:/proxy/
curl 127.0.0.1:8080/api/v1/namespaces/default/services/http:php-apache:/proxy/
其他的API信息:
curl 127.0.0.1:8080/apis/batch/v1
2 Kubernetes Proxy
Kubernetes Proxy主要⽤于代理REST请求。 可以通过这种代理⽅式将API Server收到的REST请求转发到某个Node上的kubelet 上,由Kubelet负责响应。
创建⼀个Proxy 接⼝(此处创建⼀个监听本地10.0.0.1上的8001端⼝):
kubectl proxy --port=8001 --accept-hosts=‘.*‘ --address=‘10.0.0.1‘ &
如果需要对访问的资源和源地址进⾏限制,可以使⽤正则进⾏匹配,限制对services进⾏访问:
kubectl proxy --port=8001 --accept-hosts=‘.*‘ --address=10.0.0.1 --reject-paths=‘^/api/v1/services‘
通过此端⼝可以在外部直接访问此api代理,在新的版本中,访问⽅式和常规访问的URL⼀致:
curl 10.0.0.1:8001/api/v1/pods
curl 10.0.0.1:8001/api/v1/nodes
curl 10.0.0.1:8001/api/v1/services
curl 10.0.0.1:8001/api/v1/replicationcontrollers
curl 10.0.0.1:8001/api/v1/namespaces/default/pods/tomcat-deployment-65799d5fc4-5dx4h
curl 10.0.0.1:8001/api/v1/namespaces/default/services/http:php-apache:/proxy/
curl 10.0.0.1:8001/apis/batch/v1
3 kubectl客户端
命令⾏⼯具kubectl客户端,通过命令⾏参数转换为对API Server的REST API调⽤,并将调⽤结果输出。
命令格式:kubectl [command] [options]
4 编程⽅式调⽤
使⽤场景:
运⾏在Pod⾥的⽤户进程调⽤kubernetes API,通常⽤来实现分布式集搭建的⽬标;
开发基于kubernetes的管理平台,⽐如调⽤kubernetes API来完成Pod、Service、RC等资源对象的图形化创建和管理界⾯。可以使⽤kubernetes提供的Client Library;
具体可参考
1.4 API server和集模块的交互
API Server作为集的核⼼,负责集各个功能模块之间的通信,集中的各个功能模块通过 API Server将信息存⼊etcd数据库中,获取这些数据就通过 API Server 提供的REST接⼝通过使⽤GET,LIST,或者Watch⽅法,从⽽实现对各个模块之间的交互。
为了缓解各模块对API Server的访问压⼒,各功能模块都采⽤缓存机制来缓存数据,各功能模块定时从API Server获取指定的资源对象信息(LIST/WATCH⽅法),然后将信息保存到本地缓存,功能模块在某些情况下不直接访问API Server,⽽是通过访问缓存数据来间接访问API Server。
1.4.1 API Server 与kubelet 的交互
每个Node节点上的kubelet定期就会调⽤API Server的REST接⼝报告⾃⾝状态,API Server接收这些信息后,将节点状态信息更新到etcd中。kubelet也通过API Server的Watch接⼝监听Pod信息,从⽽对Node机器上的POD进⾏管理。
监听信息
kubelet动作新的POD副本被调度绑定到本节点
执⾏POD对应的容器的创建和启动逻辑POD对象被删除
删除本节点上相应的POD容器修改POD信息修改本节点的POD容器
1.4.2 API Server 与kube-controller-manager 交互
kube-controller-manager中的Node Controller模块通过API Server提供的Watch接⼝,实时监控Node的信息,并做相应处理。
1.4.3 API Server 与kube-scheduler 交互
Scheduler通过API Server的Watch接⼝监听到新建Pod副本的信息后,它会检索所有符合该Pod要求的Node列表,开始执⾏Pod调度逻辑。调度成功后将Pod绑定到⽬标节点上。
2、API Server 启动参数详解
API Server 主要是和 etcd 打交道,并且对外提供 HTTP 服务,以及进⾏安全控制,因此它的命令⾏提供的参数也主要和这⼏个⽅⾯有关。下⾯是⼀些⽐较重要的参数以及说明(不同版本参数可能会有不同):参数
描述--advertise-address 向集成员发布apiserver的IP地址,该地址必须能够被集的成员访问。如果为空,则使⽤ --bind-
address,如果 --bind-address未指定,那么使⽤主机的默认接⼝。
--authorization-mode
授权模式 ,安全接⼝上的授权。默认值:AlwaysAllow
以逗号分隔的列表:AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node --allow-privileged监听安全端⼝的IP地址。必须能被集的其他以及CLI/web客户机访问
--tls-cert-file 包含HTTPS的默认x509证书的⽂件。 CA证书,如果有的话,在服务器证书之后连接。如果启⽤了HTTPS服务,但未提供 --tls-cert-file和–tls-private-key-file,则会为公共地址⽣成⾃签名证书和密钥,并将其保存到–cert-dir指定的⽬录中。
--cert-dir TLS 证书的存放⽬录,默认为/var/run/kubernetes
--token-auth-file使⽤该⽂件在安全端⼝通过token⾝份验证来保护API服务
-curl是什么命令
-admission-control 准⼊控制过程分两个阶段。第⼀阶段,运⾏ mutating admission controllers。第⼆阶段,运⾏ validating admission controllers。有些控制器会运⾏两次。如果任⼀阶段中的任何控制器拒绝请求,则⽴即拒绝整个请求,并向最终⽤户返回错误。默认值为AlwaysAdmit。
AlwaysAdmit, AlwaysDeny, AlwaysPullImages, DefaultStorageClass, DefaultTolerationSeconds, DenyEscalatingExec, DenyExecOnPrivileged, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, Initializers, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodPreset, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionWebhook
--advertise-address 向集成员发布apiserver的IP地址,该地址必须能够被集的成员访问。如果为空,则使⽤ --bind-address,如果 --bind-address未指定,那么使⽤主机的默认接⼝。
--kubelet-https=true kubelet通信使⽤https,默认值 true
--service-cluster-ip-range CIDR表⽰IP范围,⽤于分配服务集IP。不能与分配给pod节点的IP重叠 (d
efault 10.0.0.0/24) --allow-privileged true允许特权模式的容器。默认值false
--insecure-bind-address HTTP 访问的地址(default 127.0.0.1)
--insecure-port HTTP 访问的端⼝(default 8080)
--bind-address HTTPS 安全接⼝的监听地址,必须能被集的其他以及CLI/web客户机访问,默认为0.0.0.0
--secure-port HTTPS 安全接⼝的监听端⼝,默认为6443
--etcd-prefix要在etcd中所有资源路径之前添加的前缀,默认为“/registry”
--etcd-servers etcd服务器列表(格式://ip:port),逗号分隔
--log-dir⽇志存放的⽬录
--alsologtostderr⽇志信息同时输出到stderr及⽂件
--logtostderr⽇志信息输出到stderr ⽽不是⽂件
参数描述
3、API Server安装和运⾏
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论