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 http://127.0.0.1:8080/api/v1/namespaces/default/services/php-apache
直接访问后端服务内容:
curl http://127.0.0.1:8080/api/v1/namespaces/default/services/http:tomcat-service:/proxy/
curl http://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 http://10.0.0.1:8001/api/v1/pods
curl http://10.0.0.1:8001/api/v1/nodes
curl http://10.0.0.1:8001/api/v1/services
curl http://10.0.0.1:8001/api/v1/replicationcontrollers
curl http://10.0.0