1.kubernetes关键组件之API-SERVER
2.apiserver å¼å¯èåå±
3.Kubernetes API
4.听GPT 讲K8s源代码--cmd(一)
5.一文详解kube-apiserver认证鉴权能力
6.kube-apiserver审计åè½ä»ç»å使ç¨
kubernetes关键组件之API-SERVER
Kubernetes的API Server在集群架构中扮演核心角色,提供REST API接口,支持资源对象如node、pod、service的增删改查以及watch功能。其主要特性包括集群管理API、简单bbs源码数据交互枢纽、资源配额控制入口、集群安全机制拥有者。
API Server的工作原理涉及集群管理的REST API,包括认证授权、数据校验和集群状态变更。它是数据交互和通信的核心,仅直接操作etcd,提供集群安全机制。访问方式多样,包括Kubernetes REST API、kubectl代理、kubectl客户端命令行调用及用户进程调用API。
常用API接口通过kube-apiserver提供,监听和端口,后者提供更高安全性。Kubernetes Proxy用于代理REST请求,将API Server收到的请求转发至Node上的kubelet,由其响应。创建Proxy接口可实现此功能。
API Server与集群模块交互,efficientdet源码负责通信,各模块通过API Server存取etcd数据库信息。获取数据可通过API Server提供的REST接口,使用GET、LIST或Watch方法。查看ETCD数据时,可通过Node、Pod、Service相关接口,访问节点、Pod和Service信息。
Node相关接口包括节点名称或IP地址指定的节点信息查询,列出节点内所有Pod信息、物理资源统计和概要信息。Pod相关接口允许访问特定服务或Pod,实现集群外部访问Pod服务的目的。Service相关接口则提供访问特定Namespace中服务的途径。
API Server的proxy接口在集群外部访问Pod服务时尤为重要,用于管理目的,如逐一排查Service的Pod副本或检查服务异常。通过这种方式,API Server成为实现集群内部交互和外部访问的关键组件。
apiserver å¼å¯èåå±
éè¿ä»¥ä¸ kube-apiserver æ è®°å¯ç¨æ±èå±ãè¿äºæ è®°å¿ é¡»å·²ç»è¢«æå¡æä¾åå®ç°ã
--requestheader-client-ca-file=<path to aggregator CA cert>
--requestheader-allowed-names=aggregator
--requestheader-extra-headers-prefix=X-Remote-Extra-
--requestheader-group-headers=X-Remote-Group
--requestheader-username-headers=X-Remote-User
--proxy-client-cert-file=<path to aggregator proxy cert>
--proxy-client-key-file=<path to aggregator proxy key>
å¦æ kube-proxy 没æå API server è¿è¡å¨åä¸å°ä¸»æºä¸ï¼é£ä¹éè¦ç¡®ä¿å¯ç¨äºå¦ä¸ apiserver æ è®°ï¼
--enable-aggregator-routing=true
Kubernetes API
kube-apiserver是Kubernetes架构的核心组件,负责接收所有组件的API请求,它在集群中起着中枢神经的作用,任何操作都需要通过kube-apiserver进行。XiunoBBS源码在Kubernetes中,我们通常提及的资源,如Deployment、Service等,实际上就是API操作的对象,这些资源最终被存储在etcd中,本质上是对etcd中资源进行增删改查(CRUD)。
当我们使用kubectl命令查看集群中某个命令空间的Deployment时,实际上kubectl将命令转化为API请求发送给kube-apiserver,然后将kube-apiserver返回的数据以特定格式输出。
API设计遵循一组和版本的规则,即groupVersion,例如`/apis/apps/v1/deployment`。其中`apis`表示API的组集合,`apps`是特定的组,`v1`是版本。而`/api/v1`这一组API则被视为核心组,因为Kubernetes在初期并未预期到未来API的丰富性,将所有资源API置于`/api/v1`下,以适应不断增长的需求。
每一个API都包含组和版本属性,版本定义了API的稳定性,以便在多次迭代后达到成熟状态。通过`kubectl get -raw /`命令可以查看集群中的所有API。
Kubernetes的API对象组织方式分为核心组和命名组,核心组包含所有资源,shaderlab源码命名组则针对特定资源,如`/apis/$NAME/$VERSION`。命名组和系统范围内的实体,如metrics,共同组成API结构。
资源可分为命名空间资源和集群资源。命名空间资源,如Pod、Deployment、Service,属于特定命名空间,其API请求遵循特定的组织形式。集群资源,如ClusterRole,则不在任何命名空间和版本下。非资源URL则与Pod、ClusterRole不同,用于验证etcd服务健康状态,不属于任何命名空间或版本。
自定义API用于开发自定义功能,例如`custom.io`表示自定义的API组,`test`为自定义资源。Kubernetes的REST API设计遵循一组和版本的规则,以实现API的组织和稳定性。
理解Kubernetes的API结构对于深入阅读源代码和开发自定义API至关重要。明确API的2048源码组织方式和规则能够帮助开发者更高效地与Kubernetes系统进行交互,构建更复杂的部署和管理逻辑。
听GPT 讲K8s源代码--cmd(一)
在 Kubernetes(K8s)的cmd目录中,包含了一系列命令行入口文件或二进制文件,它们主要负责启动、管理和操控Kubernetes相关组件或工具。这些文件各司其职,如:
1. **check_cli_conventions.go**: 该文件作用于检查CLI约定的规范性,确保命令行工具的一致性和易用性。它提供函数逐项验证命令行工具的帮助文本、标志名称、标志使用、输出格式等,输出检查结果并提供改进意见。
2. **cloud_controller_manager**: 这是启动Cloud Controller Manager的入口文件。Cloud Controller Manager是Kubernetes控制器之一,负责管理和调度与云平台相关的资源,包括负载均衡、存储卷和云硬盘等。
3. **kube_controller_manager**: 定义了NodeIPAMControllerOptions结构体,用于配置和管理Kubernetes集群中的Node IPAM(IP地址管理)控制器。此文件包含配置选项、添加选项的函数、应用配置的函数以及验证配置合法性的函数。
4. **providers.go**: 用于定义和管理云提供商的资源。与底层云提供商进行交互,转换资源对象并执行操作,确保Kubernetes集群与云提供商之间的一致性和集成。
5. **dependencycheck**: 用于检查项目依赖关系和版本冲突,确保依赖关系的正确性和没有版本冲突。
6. **fieldnamedocs_check**: 检查Kubernetes代码库中的字段名称和文档是否符合规范,确保代码的规范性和文档的准确性。
7. **gendocs**: 生成Kubernetes命令行工具kubectl的文档,提供命令的用法说明、示例、参数解释等信息,方便用户查阅和使用。
8. **genkubedocs**: 生成用于文档生成的Kubernetes API文档,遍历API组生成相应的API文档。
9. **genman**: 用于生成Kubernetes命令的man手册页面,提供命令的说明、示例和参数等信息。
. **genswaggertypedocs**: 生成Kubernetes API的Swagger类型文档,提供API的详细描述和示例。
. **genutils**: 提供代码生成任务所需的通用工具函数,帮助在代码生成过程中创建目录和文件。
. **genyaml**: 为kubectl命令生成YAML配置文件,方便用户定义Kubernetes资源。
. **importverifier**: 检查代码中的导入依赖,并验证其是否符合项目中的导入规则。
. **kube_apiserver**: 实现kube-apiserver二进制文件的入口点,负责初始化和启动关键逻辑。
. **aggregator**: 为聚合API提供支持,允许用户将自定义API服务注册到Kubernetes API服务器中,实现与核心API服务的集成。
这些文件共同构建了Kubernetes命令行界面的底层逻辑,使得Kubernetes的管理与操作变得更加高效和灵活。
一文详解kube-apiserver认证鉴权能力
本文详细解析kube-apiserver的认证与鉴权功能,由华为云社区作者分享。HTTPS安全连接的基础在于身份验证,确保客户端与服务端的安全通信。
通过API接口访问kube-apiserver时,若遇到访问失败,通常是因为客户端无法验证服务端证书,这时需要验证服务端身份。虽然可以在公网环境中不验证服务端证书,但不建议这样做,因为这可能导致访问的是虚假服务端。确保服务端证书真实性的关键在于第三方权威机构CA,服务端将信息和公钥发送给CA,CA进行签名并生成证书。
HTTPS认证过程涉及CA私钥的保密性,签名的不可篡改性,以及证书内容的完整性。通过携带K8S集群CA证书,可以成功建立HTTPS连接并完成完整的认证流程。
Kubernetes认证方式包括Token认证和证书认证。Token认证通过serviceaccount和secret中的token进行,而证书认证则需要生成私钥和CSR文件,并通过CertificateSigningRequest申请证书。鉴权环节,kube-apiserver通过RBAC机制管理权限,允许用户、组或serviceaccount访问特定资源。
通过以上步骤,我们可以为创建的serviceaccount和用户myuser分配权限,创建角色、角色绑定,并在访问kube-apiserver时验证和授权。
kube-apiserver审计åè½ä»ç»å使ç¨
å¨kubernetesé群ä¸ï¼API Serveræ¯æä½é群èµæºçå ¥å£ï¼API serverç审计åè½å¯ä»¥è®°å½æ¯ä¸ªå°è¾¾ç请æ±ï¼è¿èå¯ä»¥å¸®å©é群管ç人åè®°å½æè 追溯ä¸åç¨æ·çæ¥å¸¸æä½ãè®°å½çä¿¡æ¯å¯ä»¥å æ¬ä½ä¸éäºä»¥ä¸ä¿¡æ¯ã
API Serverçå¤çå æ¬å¾å¤ä¸ªæ¥éª¤ï¼è®¤è¯ãéæµãé´æãè·¨åå¤çãwebhookã审计å¤çï¼çæ£çå¤çåå ãåå¤ååºççã审计åè½æ¯API Server请æ±å¤çæµæ°´çº¿ä¸çä¸ç¯ï¼æ¯å¯¹API Severè½åçæ©å±ã
å¦ä¸å¾æ示ï¼å®¡è®¡å¯ä»¥åçå¨ä¸ä¸ªä½ç½®ï¼å ¶ä¸RequestReceived表示审计åå æ¥åå°è¯·æ±ï¼æªå°è¯·æ±ä¸åå°ä¸ä¸çº§æµæ°´çº¿åå ä¹åï¼ResponseComplete表示API Serverå·²ç»åå¤äºååºbodyä¹åï¼ ResponseStarted表示åå¤äºååºå¤´ï¼ä½æªåå¤ååºbodyä¹åï¼åªç¨äºlong-runtimeç请æ±ï¼å¦logï¼watchï¼execçã
审计å¯ä»¥éè¿ä¸¤ç§æ¹å¼è®°å½è¯·æ±ï¼logåwebhookï¼logæ¯æå°è¯·æ±è®°å½å°æ¬å°çæ件系ç»ï¼webhookæ¯æå°è¯·æ±è®°å½åéå°å¤é¨apiå»å¤çã
å¨ç产å®è·µä¸ï¼è¯·æ±ä¹æ¯å¯ä»¥åä¼å 级çï¼å¦configmapçlist请æ±ï¼æ¾ç¶æ¯æ²¡æå¿ è¦å°configmapçææå 容é½è®°å½ä¸æ¥çãæ以对äºæ¯ä¸ä¸ªè¯·æ±ï¼å¯ä»¥é ç½®ä¸åç审计çç¥ï¼å¦None表示ä¸è®°å½è¯¥è¯·æ±ï¼Metadata表示åªè®°å½è¯¥è¯·æ±çå ä¿¡æ¯ï¼å ¶ä¸å ä¿¡æ¯æ¯æ请æ±çUserï¼URIï¼ç±»åççã
审计åè½çç¹æ§å¨API Serverä¸é»è®¤æ¯å¼å¯çï¼ä½ä¸é 置审计å端ï¼åæ æ³è¿è¡æ¥å¿è®°å½ã
审计ç¸å ³çé 置项æ¯ç´æ¥é ç½®å¨API Serverçå½ä»¤è¡åæ°ä¸çï¼å¤è¾¾é¡¹ãå æ¤è¿ééè¦å å°åè½æ¢³ç请æ±ï¼æè½ç解è¿ä¸ªé 置项ãè¿é以å端æ¥å¿è®°å½log为ä¾ï¼é¦å æ¥å¿è¦è®°å½å°ä»ä¹å°æ¹ï¼éçæ¥å¿çåå ¥ï¼æ¥å¿æ件ç大å°éæ¸å¢å¤§ï¼æ¯å¦è¦å°æ件è¿è¡æåï¼ä¿çå¤å°ä»½æåæ¥å¿æ件ï¼æåçæ¥å¿æ件æ¯å¦è¦å缩ï¼ä¸ºäºæ¥å¿æ件ä¸å ç¨è¿å¤çç£çèµæºï¼éè¦å¯¹æ§çæ¥å¿æ件è¿è¡æ¸ çï¼è¿å°±æ¶åå°æ¥å¿æ件æå¤ä¿çå¤å°å¤©ã 审计åå çå¤çæ¯å¦è¦å¤çå®æåï¼åå°è¯·æ±ç§»äº¤å°å°ä¸ä¸æ¥çæµæ°´çº¿åå ä¸è¿è¡å¤çï¼è¿ä¸ªå°±æ¶åå°æ¯å¦é»å¡API Serverã
åå¦log模å¼è®¾ç½®ä¸ºbatchï¼å°±è¡¨ç¤ºè¦ç§¯ç´¯ä¸å®æ°éç请æ±ï¼ç¶åä¸æ¬¡æ§åå ¥ï¼è¿å°±æ¶åå°batchç¸å ³çé ç½®
åå¦å个请æ±ç大å°è¿å¤§ï¼æ¯å¦è¦å¯¹è¯·æ±è¿è¡æåï¼è¿å°±æ¶åå°truncateç¸å ³çé ç½®ã
å¨ä¸å¾ä¸ï¼å°é 置项å为3ç±»ï¼éç¨é ç½®ï¼batchç±»é ç½®åtruncateç±»é ç½®ï¼æªååºwebhookç±»åçé ç½®ï¼ã
审计çç¥
审计åè½æä¾äºé常çµæ´»ççç¥é¡¹é ç½®ãé ç½®çç¥çç®çå°±æ¯è¦ç²¾ç»åå¾å¯¹è¯·æ±åæ¥å¿è®°å½ï¼éè¦ç请æ±ï¼è®°å½çä¿¡æ¯è¦å ¨ä¸äºï¼å¦createï¼delete请æ±ï¼éå ³é®æ§ç请æ±ï¼å¯ä»¥å°è®°å½ä¸äºï¼å¦leases请æ±ã
审计çç¥ä¸éè¦çå段å¦ä¸ ï¼
ä¸é¢çé ç½®æ¯å¨å®æ¹å®¡è®¡ç¤ºä¾çç¥çåºç¡ä¸å¢å äºä¸äºé ç½®ã
以ä¸æ¯é¿é产åææ¡£ç»çä¸äºç¤ºä¾é 置信æ¯
ç»è¿ä¸é¢çåæï¼å®¡è®¡åè½æ¯API Serverå¤ç请æ±æµæ°´çº¿çä¸ç¯ï¼å¢å 审计åè½ï¼ä¼å¢å API Serverçå åæ¶èï¼å®æ¹ææ¡£æç¡®ååºçï¼ï¼å¦å¤log模å¼é 置为é»è®¤å¼blockingçè¯ï¼ä¼ç¥å¾®å¢å API Serverçååºå»¶è¿ï¼æ以è¿é建议使ç¨batch模å¼ã
如何通过kube-apiserver访问K8s集群中的App
通过kube-apiserver访问K8s集群中的App是一种可行且方便的方式。传统上,App可以通过ClusterIP、NodePort或LoadBalancer等方式进行访问,但利用kube-apiserver也能实现访问。在实现过程中,涉及到容器的启动、设置svc通道、访问权限配置以及访问方式调整等多个步骤。
首先,创建一个名为ng-dp.yaml的文件,内容用于启动一个nginx容器并监听端口。执行相应命令,启动容器。
接着,创建ng-svc.yaml文件,定义svc通道,使得集群内部可以访问该App。执行命令部署svc。
获取kube-apiserver地址,以便后续访问App。访问方式有两种:通过token或证书。获取sa(service-account)信息,查询sa内容以找到token值,设置env环境后即可访问App。若权限不足,需调整sa权限,如提高权限等级。另一种方式是直接配置证书访问,从kubeconfig文件中获取所需证书,配置证书后尝试访问。
访问App时,可以使用kube-apiserver提供的代理URL格式,该格式基于es的NodePort范围,可以通过编辑kube-apiserver的配置文件来实现。以下是具体步骤:
首先,定位到kube-apiserver的配置文件,通常在/etc/kubernetes/manifests/kube-apiserver.yaml中。默认情况下,NodePort范围为-。要修改这个范围,只需在该文件中添加或更新相应的参数行,如:
--service-node-port-range=-
这个选项应放置在`--service-cluster-ip-range=..0.0/`下方,以确保配置的顺序正确。
由于kubelet会自动监视目录变化,一旦你保存了修改,kubelet会检测到并使用新的配置自动重启kube-apiserver。无需额外手动操作,只需等待kubelet处理并确认kube-apiserver的重启。你可以通过查看kube-apiserver的启动时间来验证这个过程,如果发现重启,说明更改已经生效。
这样,你就可以成功将Kubernetes的NodePort范围调整为你需要的范围。记得在执行这些操作时要谨慎,确保理解配置的含义,以避免影响集群的正常运行。