Kubernetes核心组件:Api Server

2017-01-18 阅读: Kubernetes

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

      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支持的资源:

      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"
      },
      .......
    ]
    }
    
  • 列出集群中的某种资源对象:

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

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

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

例如:

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:

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的代理服务,这样可以加入一些基本的安全机制。

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

参考

标题:Kubernetes核心组件:Api Server
本文链接:https://blog.frognew.com/2017/01/kubernetes-api-server.html
转载请注明出处。

目录