Kubernetes API服务器为API对象验证和配置数据,这些对象包含Pod、Service、ReplicationController等等。API Server提供REST操作以及前端到集群的共享状态,所有其他组件可以通过这些共享状态交互。

配置选项

  • -admission-control:集群中资源的Admission Controller的插件的有序列表,分别使用逗号分隔;
  • -advertise-address:广播API Server给所有集群成员的IP地址,其他集群可以访问该IP,如果为空,会使用
  • -allow-privileged[=false]:true,表示允许特权容器;
  • -authorization-mode=“AlwaysAllow”:安全端口授权插件的有序列表,分别以逗号分隔,AlwaysAllow,AlwaysDeny,ABAC-;
  • authorization-policy-file=“”:授权策略的csv文件,使用于-authorization-mode=ABAC模式的配置;
  • -basic-auth-file=“”:如果配置该选项,该文件会通过HTTP基本认证允许API Server安全端口的请求;
  • -bind-address=0.0.0.0:服务-read-only-port和-secure-port端口的IP地址。相关端口必须是其他集群通过CLI/web客户端;
  • -cert-dir=“/var/run/kubernetes/”:TLS证书目录(默认是/var/run/kubernetes)。
  • -tls-cert-file和-tls-client-ca-file=“”:任何提交客户端证书的请求都会验证与相关客户端证书的CommonName的身份。(在1.5版本中--client_ca_file);
  • -cloud-provide:“”:云提供商配置文件的路径,空表示没有该配置文件;
  • -cloud-provider=””:云服务提供商,空表示没有该提供商;
  • -cluster-name=“kubernetes”:集群实例的前缀;
  • -cors-allowed-origins=[]:CORS的allowed origins的列表,用逗号分隔。一个allowed origins可以是-etcd-config=“”:ETCD客户端的配置文件,与-etcd-servers配置项互斥。
  • -etcd-prefix=“/registry”:ETCD中所有资源路径的前缀;
  • -etcd-servers=[]:ETCD服务器,与-etcd-config配置项互斥;
  • -etcd-servers-overrides=[]:每个ETCD服务器覆盖文件,以逗号分隔;
  • -expermental-keystone-url=“”:如果Passwd,激活keystone认证插件;
  • -external-hostname=“”:为Master生成外部URLs使用的主机名;
  • -google-json-key=“”:用户Google Cloud Platform Service Account JSON key认证;
  • --insecure-bind-address=127.0.0.1:非安全端口(所有借口都设置为0.0.0.0)的服务IP地址,默认是本地地址。
  • --insecure-port=8080:不安全且没有认证的进程访问端口,默认是8080;
  • -kubelet-certificate-authority=“”:证书路径,证书授权文件;
  • -kubelet-client-certificate=“”:TLS客户端证书文件路径;
  • -kubelet-client-key=“”:TLS客户端秘钥文件路径;
  • -kubelet--https[=true]:使用https建立Kubelet链接;
  • -kubelet-port=10250:kubelet端口;
  • -kubelet-timeout=5s:Kubelet操作Timeout值;
  • -log-flush-frequency=5s:日志缓冲秒数的最大值;
  • -long-running-request-regexp=“”:匹配长;
  • -master-service-namespace=“default”:Namespace,该Namespace的Kubernetes主服务应该注入Pod;
  • -max-connection-bytes-per-sec=0:如果非0,表示每个用户链接的最大值,字节数/秒,当前只适用于长时间运行的请求;
  • -max-request-inflight=400:给定时间内运行请求的最大值。如果超过该最大值,该请求被拒绝。0表示没有限制;
  • -min-request-timeout=1800:这是个可选字段,表示一个请求处理的最短时间,单位是秒,在超时之前,这个请求必须是激活的;
  • -oidc-ca-file=“”:如果设置该选项,Oidc-ca-file中的相关机构会验证O喷ID服务的证书。否则会使用主机的根证书。
  • -oidc-client-id=“”:如果设置了oidc-issue-url字那段,该字段,OpenID连接客户端的客户ID也必须设置;
  • -oidc-issuer-url=“”:OpenID发行的URL,只接受HTTPS协议。如果设置该字段,将被用来验证OIDC JSON Web Token(JWT)
  • -oidc-username-claim=“sub”:改进中;
  • -runtime-config:key=value键值对集,描述运行时配置,也会回传到APIServer。apis/键值用于打开-secure-port=6443:用于HTTPS的认证和授权。0表示不支持HTTPS服务;
  • -service-account-key-file=“”:该文件包含RPM-encoded x509 RSA的私钥和公钥,用于验证ServiceAccount的Token;
  • -service-account-lookup[=false]:true,表示验证ServiceAccount的Token作为Authentication一部分在ETCD中的;
  • -service-cluster-ip-range:
  • -service-node-port-range:
  • -ssh-user=“”:如果非空,使用安全SSH代理到该节点,用该用户名;
  • -storage-versions:
  • -tls-private-key-file:该文件包含x509私钥匹项-tls-cert-file;
  • -token-auth-file=“”:该文件使用Token验证保护API Server的安全端口;
  • -watch-cache[=true]:可以在API Server查看缓存;

Kubernetes API Server原理分析

总体来看,Kubernetes API Server的核心功能是提供了Kubernetes各类资源对象(如Pod、RC、Service等)的增、删、改、查及Watch等HTTP Rest接口,成为集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。除此之外,他还有以下的特性:

  1. 是集群管理的API入口;
  2. 是资源配额控制的入口;
  3. 提供完备的集群安全机制;

Kubernetes API Server概述

Kubernetes API Server通过一个名为Kube-apiserver的进程提供服务,该进程运行在Master节点上。在默认情况下,kube-apiserver进程在本机的8080端口(对应参数--insecure-port)提供REST服务。我们可以同时启动HTTPS安全端口(--secure-port=6443)来启动安全机制,加强REST API访问的安全性。

通常我们可以通过命令行工具kubectl来与kubernetes API Server交互,他们之间的接口是REST调用。测试和学习的情况下也可以使用curl命令行工具进行快速验证。

比如,在Master节点上,运行下面的curl命令可以得到JSON方式返回的Kubernetes API的版本信息:

  • curl localhost:8080/api

运行下面的命令查看Kubernetes API Server目前支持的资源对象的种类i:

  • curl localhost:8080/api/v1

返回不同资源列表信息:

  • curl localhost:8080/api/v1/pods
  • curl localhost:8080/api/v1/services
  • curl localhost:8080/api/v1/replicationcontrollers

如果我们只想对外暴露部分REST服务,则可以在Master或其他任何节点上通过运行kube-proxy进程启动一个内部代理来实现。

运行下面的命令,我们在8001端口启动代理,并且拒绝客户端访问RC的API:

  • kubectl proxy --reject-paths=“^/api/v1/replicationcontrollers” --port=8001 --v=2

通过下面的命令进行验证:

  • curl localhost:8001/api/v1/replicationcontrollers

kubectl proxy具有很多特性,最实用的一个特性是提供简单有效的安全机制,比如采用白名单来限制非法客户端访问时,只要采用下面的参数即可:

  • --accept-host=“^localhost$,^127\\.0\\.0\\.1$,^\\[::1\\]$”

最后一种方式是通过b编程的方式调用Kubernetes API Server。具体使用场景又细分为以下两种:

第一种使用场景:运行在Pod中的用户进程调用Kubernetes API,通常用来实现分布式集群搭建的目标。Pod中的进程如何知道API Server的访问地址呢,因为Kubernetes API Server本身也是一个Service,其名字就是Kubernetes,他的clusterIP地址是ClusterIP地址池中的第一个IP,他所服务的端口是HTTPS端口443,通过kubectl get svc可以确认这一点。

第二种使用场景:开发基于Kubernetes的管理平台。比如调用Kubernetes API 来完成Pod、Service、RC等资源对象的图形化创建和管理界面,此时可以使用kubernetes及各开源社区为开发人员提供的各种语言版本的Client Library。

独特的Kubernetes-Proxy API接口

这类接口的作用是代理REST请求,即kubernetes API Server把收到的REST请求转发到某个Node上的kubelet守护进程的REST端口上,由该kubelet进程负责响应。

Kubernetes Proxy API中管理Node的相关接口,该接口的REST路径为/api/v1/proxy/nodes/{name},其中name为节点名称或IP地址,包括以下几个具体的接口:

  • /api/v1/proxy/nodes/{name}/pods  #列出指定节点内的所有Pod的信息
  • /api/v1/proxy/nodes/{name}/stats       #列出指定节点内物理资源的统计信息
  • /api/v1/proxy/nodes/{name}/spec       #列出指定节点的概要信息

例:节点名为k8s-node-1,下面命令获取该节点上所有运行中的pod:

  • curl localhost:8080/api/v1/proxy/nodes/k8s-node-1/pods

需要说明的是,此处获取pod信息数据来自Node而非etcd数据库,所以两者可能在某些时间点会有偏差。此外如果kubelet进程在启东时包含--enable-debugging-handles=true,namekubernetes Proxy API 还会增加下面的接口:

  • /api/v1/proxy/nodes/{name}/run           #在节点上运行某个容器
  • /api/v1/proxy/nodes/{name}/exec        #在节点的某个容器中运行某条命令
  • /api/v1/proxy/nodes/{name}/attach      #在节点上attach某个容器
  • /api/v1/proxy/nodes/{name}/portForward      #实现节点上的Pod端口转发
  • /api/v1/proxy/nodes/{name}/logs          #列出节点的各类日志信息,例如tallylog、lastlog、wtmp、ppp/、rhsm、audit、tuned、和anaconda等
  • /api/v1/proxy/nodes/{name}/metrics      #列出和该节点相关的Metrics信息
  • /api/v1/proxy/nodes/{name}/runningpods        #列出节点内运行中的Pod信息
  • /api/v1/proxy/nodes/{name}/debug/pprof        #列出节点内当前Web服务的状态,包括CPU和内存的使用情况

Kubernetes Proxy API里关于Pod的相关接口,通过这些接口,我们可以访问pod里某个容器提供的服务(如Tomcat在8080提供的服务)

  • /api/v1/proxy/namespaces/{namespace}/pods/{name}/{patch:*}         #访问pod的某个服务接口
  • /api/v1/proxy/namespaces/{namespace}/pods/{name}                        #访问pod
  • /api/v1/proxy/namespaces/{namespace}/pods/{name}/proxy/{patch:*}         #访问pod的某个服务接口
  • /api/v1/proxy/namespaces/{namespace}/pods/{name}/proxy              #访问pod

在上面的4个接口中,后面两个接口的功能和前面两个完全一样,只是写法不同。

集群功能模块之间的通信

集群内各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据时,则通过API Server提供的REST接口(用GET/LIST/WTCH方法)来实现,从而实现各模之间的信息交互;

例:kubelet进程与API Server的交互:每个node上的kubelet每隔一个时间周期,就会调用一次API Server的REST接口报告自身状态,API Server接收到这些信息后,将各节点信息更新到etcd中。此外kubelet也通过API Server的watch接口监听pod信息,如果监听到新的Pod副本被调度绑定到本节点,则执行Pod对应的容器的创建和启动逻辑;如果监听到Pod对象被删除,则删除本节点上的相应的Pod容器;如果监听到修改Pod信息,则kubelet监听到变化后,会相应的修改本节点的Pod容器。

例:另外一个交互场景:kube-controller-manager进程与API Server的交互。kube-controller-manager中的Node Controller模块通过API Server提供的Watch接口,实时监控Node的信息并做相应的处理;

例:kube-scheduler与API Server交互的场景,当scheduler通过API Server的Watch接口监听到新建Pod副本的信息后,他会检索所有符合该Pod要求的Node列表,开始执行Pod调度逻辑,调度成功后将Pod绑定到目标节点上。为了缓解集群各模块对API Server的压力,各功能模块都采用缓存的机制来缓存数据。各功能模块定时从API Server获取指定资源对象的信息(通过LIST或watch),然后将这些信息保存到本地缓存,功能模块在某些情况下不直接访问API Server,而是通过访问缓存数据来间接访问API Server

Kubernetes-apiserver的更多相关文章

  1. 一文读懂 Kubernetes APIServer 原理

    前言 整个Kubernetes技术体系由声明式API以及Controller构成,而kube-apiserver是Kubernetes的声明式api server,并为其它组件交互提供了桥梁.因此加深 ...

  2. kubernetes单机板

    参考地址: *** http://blog.csdn.net/carter115/article/details/51121223 ** http://www.cnblogs.com/dongdong ...

  3. Kubernetes集群搭建过程中遇到的问题

    1. 创建Nginx Pod过程中报如下错误: #kubectlcreate -f nginx-pod.yaml Error from server: error when creating &quo ...

  4. kubernetes 内网节点部署笔记(一)

    在Centos7上部署kubernetes时,碰到很多坑,特别在摸拟在内网部署时,有来自GFW的障碍,有来自Firewalld的阻塞,反正是各种不服,终于慢慢理顺了思路,自己记录一下,防止遗忘. 环境 ...

  5. Kubernetes集群初探

    上文我们在一台虚机上演示了Kubernetes基于redis和docker的guestbook留言簿案例,本文我们将通过配置Kubernetes集群的方式继续深入研究.集群组件安装如下配置. IP N ...

  6. Docker实践(6)—CentOS7上部署Kubernetes

    Kubernetes架构 Kubernetes的整体架构如下: Master为主控节点,上面运行apiserver,scheduler,controller-manager等组件.Minion相当于工 ...

  7. 基于 CentOS7 的 Kubernetes 集群

    一.环境 相关主机 master 192.168.12.197 minion 192.168.12.198~232 etcd 192.168.12.233~236 相关软件 OS CentOS 7 软 ...

  8. kubernetes学习笔记

    docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用 ...

  9. 基于kubernetes构建Docker集群管理详解-转

    http://blog.liuts.com/post/247/ 一.前言        Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度 ...

  10. kubernetes容器编排系统介绍

    版权声明:本文由turboxu原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/152 来源:腾云阁 https://www. ...

随机推荐

  1. DevExpress控件水印文字提示 z

    ButtonEdit.Properties.NullValuePrompt = "提示"; ButtonEdit.Properties.NullValuePromptShowFor ...

  2. Python模块 Socket

    一个简单的python socket编程 一.套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并 ...

  3. 长大Tips的第二步

    由于期末将至的缘故,组员们对于这次项目都开始表现出了懈怠的情绪,故而这一次并没有完成许多实质性的任务,相较于上一次,此次增添了登陆以及注册的功能,说来惭愧,虽然已经学习了数据库编程,可惜自己学艺不精并 ...

  4. python+pymssql+selenium 获取短信验证码登录(实战练习)

    登录页面输入手机号, 获取短信验证码(验证码有10分钟有效期) 1 连接sql server数据库,获取10分钟之内的有效短信验证码 2 页面输入手机号,并获取验证码.若存在有效验证码则输入验证码,若 ...

  5. Ubuntu环境安装Gradle

    AndroidStudio使用全新的构建系列—–Gradle. 这是官方为什么使用gradle 的理由: Domain Specific Language (DSL) to describe and ...

  6. 郑州Day6

    今天考了毕姥爷的一套题,差点保龄 题目 挺良心的一套题,至少我不用再搬一遍题面了 T1.B君的第一题 我为什么当时去写了一个树形\(dp\)还妄图\(A\)掉啊 这题保龄感觉舒爽 首先如果我们要求的是 ...

  7. Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot 【二分 + 尺取】

    任意门:http://codeforces.com/contest/1073/problem/C C. Vasya and Robot time limit per test 1 second mem ...

  8. POJ 3764 The xor-longest Path 【01字典树&&求路径最大异或和&&YY】

    题目传送门:http://poj.org/problem?id=3764 The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K ...

  9. PSROIAlign的代码实现

    https://github.com/afantideng/R-FCN-PSROIAlign

  10. 【luogu P1640 [SCOI2010]连续攻击游戏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1640 数据有点水吧,从属性值连向对应武器编号. 枚举属性值匹配,遇到第一个无法匹配的直接跳出就好惹~. #i ...