API Server 的核心功能是提供了Kubernetes各类资源对象(如Pod、RC、Service等)的增删该查及watch等HTTP Rest接口,成为集群内各个模块之间数据交互和通信的中心枢纽,是整个集群的数据总线和数据中心。
(1)、是集群管理的API入口 ( kubectl )
(2)、是资源配额控制的入口
(3)、提供了完备的集群安全控制机制
如何访问 kubernetes API ?
1、本地端口
(1)、该端口用于接收HTTP请求
(2)、该端口默认值为8080,可以通过API Server的启动参数“--insecure-port”的值来修改默认值
(3)、默认的IP地址为“localhost”,可以通过启动参数“--insecure-bind-address”的值来修改该IP地址
(4)、非认证或授权的HTTP请求通过该端口访问API Server
2、安全端口
(1)、该端口默认值为6443,可通过启动参数“--secure-port”的值来修改默认值
(2)、默认IP地址为非本地(Non-Localhost)网络端口,通过启动参数“--bind-address”设置该值
(3)、该端口用于接收HTTPS请求
(4)、用于基于Tocken文件或客户端证书及HTTP Base的认证
(5)、用于基于策略的授权
(6)、默认不启动HTTPS安全访问控制
curl -k --cert apiserver-kubelet-client.crt --key apiserver-kubelet-client.keyhttps://127.0.0.1:6443/api
api server 三种访问方法:
1、正常情况下,访问集群需要通过https授权:
kubectl cluster-info --查看api server的访问链接
curl https://127.0.0.1:6443 -k --测试访问,需要证书认证
解决办法1:
通过kubectl proxy代理,即开启proxy代理,proxy接收来自本机的http请求,并转发到api server,同时处理身份认证,再把api server的返回值返回给我们。
使用这种方法不需要每次请求都上传请求凭证, 可以确保我们直接与真实的 API 服务器交互, 而不是 一个中间入(通过每次验证服务器证书的方式)
kubectl proxy --开启proxy代理
curl http://localhost:8001--在新的shell中访问api server
2、 从pod内部与API server 进行交互
(1)、kubernetes集群创建完成后,会在default 命令空间下创建一个名为 default-token 的secret。而所有在该集群中启动的pod都会默认挂载该secret。 describe 该secret会发现有以下三种条目:ca.crt、token、namespace。该secret被挂载在容器的 /var/run/secrets/kubernetes.io/serviceaccount 目录下。
(2)、在pod需要和api server交互的时候,首先需要验证api server的证书是否是证书机构所签发,此证书在ca.crt中。
(3)、然后会通过token文件中记录的凭证,通过 Authorization 标头来获得api server的授权。
(4)、当对pod所在 命名空间的 api 对象进行 CRUD 操作时,则会使用namespace文件来传递命名空间信息到 api server。 cat namespace文件会发现该文件记录的就是pod所在命名空间。
备注:CRUD代表创建、 读取、 修改和删除操作, 与之对应的HTTP方法分别是POST、 GET、 PATCH/PUT以及DELETE。
3、通过证书直接访问 api server
curl -k --cert apiserver-kubelet-client.crt --key apiserver-kubelet-client.key https://127.0.0.1:6443/api
更多内容请关注我的知乎账号:https://www.zhihu.com/people/dengjiabo/activities