Kubernetes核心组件:Api Server
2017-01-18
kube-api-server提供Kubernetes各种资源的CRUD和Watch相关的Http Restful Api,是整个集群的中心。
Kubernetes的Restful Api #
Api简介 #
kube-api-server以静态Pod的形式运行在master节点上,内置容器使用hostNetwork。默认监听master节点的8080端口(对应--insecure-port
),HTTPS的端口默认为6443(对应--secure-port
)。
使用kubectl命令时实际上也是和kube-api-server的restful api交互的。
下面使用curl快速熟悉以下Kubernetes的Http Restful Api:
Api的版本信息
1curl 127.0.0.1:8080/api 2{ 3 "kind": "APIVersions", 4 "versions": [ 5 "v1" 6 ], 7 "serverAddressByClientCIDRs": [ 8 { 9 "clientCIDR": "0.0.0.0/0", 10 "serverAddress": "192.168.61.100:6443" 11 } 12 ] 13}
列出Api支持的资源:
1curl 127.0.0.1:8080/api/v1
{ “kind”: “APIResourceList”, “groupVersion”: “v1”, “resources”: [ …… { “name”: “configmaps”, “namespaced”: true, “kind”: “ConfigMap” }, { “name”: “nodes”, “namespaced”: false, “kind”: “Node” }, { “name”: “pods”, “namespaced”: true, “kind”: “Pod” }, { “name”: “services”, “namespaced”: true, “kind”: “Service” }, ……. ] } ```
- 列出集群中的某种资源对象:
1curl 127.0.0.1:8080/api/v1/pods
Kubernetes Proxy Api #
Kubernetes Proxy Api是一种特殊的Api,对于这类Api,kube-api-server只是代理http请求,将请求转发到某个node上的kubelet进程监听的端口上,实际由该端口上的rest api响应请求。
例如/api/v1/proxy/nodes/<node-name>/pods
会列出给定Node节点上所有的Pod信息
1curl 127.0.0.1:8080/api/v1/proxy/nodes/cent1/pods
可以使用/api/v1/proxy/namespaces/<namespace>/pods/<name>/
访问某个具体Pod,这有时在做问题排查时会很有用。
例如:
1kubectl get pod -o wide
2NAME READY STATUS RESTARTS AGE IP NODE
3nginx-ckzcn 1/1 Running 3 2d 10.244.0.78 cent0
4nginx-nt7nf 1/1 Running 0 42m 10.244.3.84 cent1
5
6curl 127.0.0.1:8080/api/v1/proxy/namespaces/default/pods/nginx-nt7nf/
7<!DOCTYPE html>
8<html>
9<head>
10<title>Welcome to nginx!</title>
11......
可以使用/api1/v1/proxy/namespaces/<namespace>/services/<name>/
访问Service:
1kubectl get svc
2NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes 10.96.0.1 <none> 443/TCP 14d
4nginx 10.96.108.15 <none> 80/TCP 4d
5
6curl 127.0.0.1:8080/api/v1/proxy/namespaces/default/services/nginx/
7<!DOCTYPE html>
8<html>
9<head>
10<title>Welcome to nginx!</title>
11......
使用kubectl proxy代理Kubernetes Api #
可以使用kubectl proxy
命令在master node上创建Kubernetes Api的代理服务,这样可以加入一些基本的安全机制。
1kubectl proxy --port=8011 --address=192.168.61.100 --accept-hosts='^192\.168\.61\.*'
kubectl help proxy
命令可以得到更多的命令帮助提示。
Kubernetes集群结构 #
下图为Kubernetes集群结构图:
可以看出Api Server是整个集群的中心:
- 每个Node上的kubelet每隔一定时间,就会调用api server的接口上报自身状态,Api Server会将Node状态信息更新到etcd。
- Node上的kubelet通过Api Server的Watch接口监听Pod信息,如果发现新的Pod被调度到此Node上,则执行Pod内相关容器的启动工作;如果发现当前Node上的Pod被删除,则删除当前Node上的Pod;如果发现Pod的信息发生了修改,当然也会修改此Node节点的Pod容器。