Kubernetes-apiserver
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接口,成为集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。除此之外,他还有以下的特性:
- 是集群管理的API入口;
- 是资源配额控制的入口;
- 提供完备的集群安全机制;
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的更多相关文章
- 一文读懂 Kubernetes APIServer 原理
前言 整个Kubernetes技术体系由声明式API以及Controller构成,而kube-apiserver是Kubernetes的声明式api server,并为其它组件交互提供了桥梁.因此加深 ...
- kubernetes单机板
参考地址: *** http://blog.csdn.net/carter115/article/details/51121223 ** http://www.cnblogs.com/dongdong ...
- Kubernetes集群搭建过程中遇到的问题
1. 创建Nginx Pod过程中报如下错误: #kubectlcreate -f nginx-pod.yaml Error from server: error when creating &quo ...
- kubernetes 内网节点部署笔记(一)
在Centos7上部署kubernetes时,碰到很多坑,特别在摸拟在内网部署时,有来自GFW的障碍,有来自Firewalld的阻塞,反正是各种不服,终于慢慢理顺了思路,自己记录一下,防止遗忘. 环境 ...
- Kubernetes集群初探
上文我们在一台虚机上演示了Kubernetes基于redis和docker的guestbook留言簿案例,本文我们将通过配置Kubernetes集群的方式继续深入研究.集群组件安装如下配置. IP N ...
- Docker实践(6)—CentOS7上部署Kubernetes
Kubernetes架构 Kubernetes的整体架构如下: Master为主控节点,上面运行apiserver,scheduler,controller-manager等组件.Minion相当于工 ...
- 基于 CentOS7 的 Kubernetes 集群
一.环境 相关主机 master 192.168.12.197 minion 192.168.12.198~232 etcd 192.168.12.233~236 相关软件 OS CentOS 7 软 ...
- kubernetes学习笔记
docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用 ...
- 基于kubernetes构建Docker集群管理详解-转
http://blog.liuts.com/post/247/ 一.前言 Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度 ...
- kubernetes容器编排系统介绍
版权声明:本文由turboxu原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/152 来源:腾云阁 https://www. ...
随机推荐
- 插上翅膀,让Excel飞起来——xlwings(三)
xlwings基本对象 xlwings基本对象 App相当于Excel程序,Book相当于工作簿.N个Excel程序则由apps表示,N个工作簿由books表示. 对工作簿的操作 #导入xlwings ...
- Kubernetes Helm入门指南
什么是Helm?这可不是暗黑破坏神里装备的名称:头盔,而是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.我们Helm和Kubernetes的关系,我们可以理解成y ...
- 高效实时的网络会议数据传输库—UDT
在视频会议系统的研发当中,我们的音.视频数据必须要有相应的可靠性作为保障,因为视频会议系统是一个实时性非常强的系统,如果其数据在网络不太好的情况下,有可能会出现丢包.数据延迟.数据堵塞等现象,出现这些 ...
- 用批处理在windows中导出/导入无线网络信息,复制保存为bat即可
@echo offtitle 在windows中导出/导入无线网络信息 :Beginecho ========================echo 请选择操作:echo 1 查看可用的无线网络ec ...
- Power Designer逆向工程连接数据库创建pdm-oracle
1.进入菜单文件-Reverse Engineer-Database... 2.打开窗口,选择数据库版本,点击[确定] 3.打开窗口,选择Usering a data source: 4.如果已经有d ...
- TSP 遗传算法
GA——遗传算法 同模拟退火算法一样,都是现代优化算法之一.模拟退火是在一定接受程度的情况下仍然接受一个比较差的解. 遗传算法,是真真正正的和大自然的遗传进化有着非常紧密的联系的,当然遗传进化的只是在 ...
- Android——Activity生命周期
启动: 触发 onCreate() onStart() onResume() Home键: 触发 onPause() onStop() back键退出: 触发 onPause() o ...
- kiwi installation
Mainly the installstion methods follow the url: https://github.com/emolch/kiwi/wiki/Installation the ...
- Java中获取classpath路径下的资源文件
ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL getResource (String name); public InputStream getRes ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...