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的版本信息

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    curl 127.0.0.1:8080/api
    {
      "kind": "APIVersions",
      "versions": [
        "v1"
      ],
      "serverAddressByClientCIDRs": [
        {
          "clientCIDR": "0.0.0.0/0",
          "serverAddress": "192.168.61.100:6443"
        }
      ]
    }
  • 列出Api支持的资源:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    curl 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"
    },
    .......
    ]
    }
  • 列出集群中的某种资源对象:

1
curl 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信息

1
curl 127.0.0.1:8080/api/v1/proxy/nodes/cent1/pods

可以使用/api/v1/proxy/namespaces/<namespace>/pods/<name>/访问某个具体Pod,这有时在做问题排查时会很有用。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
kubectl get pod -o wide
NAME                    READY     STATUS     RESTARTS   AGE       IP               NODE
nginx-ckzcn             1/1       Running    3          2d        10.244.0.78      cent0
nginx-nt7nf             1/1       Running    0          42m       10.244.3.84      cent1

curl 127.0.0.1:8080/api/v1/proxy/namespaces/default/pods/nginx-nt7nf/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
......

可以使用/api1/v1/proxy/namespaces/<namespace>/services/<name>/访问Service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.96.0.1        <none>        443/TCP          14d
nginx        10.96.108.15     <none>        80/TCP           4d

curl 127.0.0.1:8080/api/v1/proxy/namespaces/default/services/nginx/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
......

使用kubectl proxy代理Kubernetes Api

可以使用kubectl proxy命令在master node上创建Kubernetes Api的代理服务,这样可以加入一些基本的安全机制。

1
kubectl 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容器。

参考