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集群结构图:

k8s-structrue

可以看出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容器。

参考