Kubernetes 集群的访问方式概览

本文系统梳理了通过 kubectl 与 Kubernetes API 交互的原理与实践,涵盖 API 结构、认证机制、常用命令、输出格式、Server-Side Apply 及最佳实践,帮助读者高效管理和自动化 Kubernetes 资源。

概述

Kubernetes API 是控制面的核心,提供 HTTP API 以实现用户、集群内部组件及外部系统的通信。kubectl 作为官方命令行工具,简化了 API 交互流程,自动处理认证、请求格式化和响应解析等细节。

图 1: kubectl 到 API Server 的交互流程图
图 1: kubectl 到 API Server 的交互流程图

Kubernetes API 基础

Kubernetes API 采用 RESTful 设计,通过标准 HTTP 动词(GET、POST、PUT、PATCH、DELETE)对资源进行增删改查。资源按 API 组、版本和类型组织。

图 2: Kubernetes API 结构图
图 2: Kubernetes API 结构图

常见 API URL 模式如下:

  • 集群级资源:/apis/GROUP/VERSION/RESOURCETYPE
  • 命名空间级资源:/apis/GROUP/VERSION/namespaces/NAMESPACE/RESOURCETYPE
  • 单个资源:/apis/GROUP/VERSION/namespaces/NAMESPACE/RESOURCETYPE/NAME

kubectl 工作原理

kubectl 作为 Kubernetes API 的客户端,将用户命令转为 HTTP 请求。其配置文件 kubeconfig 包含集群信息、认证方式和上下文设置。

图 3: kubectl 请求流程图
图 3: kubectl 请求流程图

API Server 认证机制

kubectl 通过 kubeconfig 文件自动完成 API Server 认证,支持多种认证方式:

  • 客户端证书
  • Bearer Token
  • 基本认证
  • OAuth2(外部插件)
  • ServiceAccount Token(集群内部)
图 4: kubectl 认证流程图
图 4: kubectl 认证流程图

kubectl 基本用法

kubectl 命令基本语法如下:

kubectl [command] [TYPE] [NAME] [flags]
  • command:操作类型(如 create、get、describe、delete)
  • TYPE:资源类型(如 pods、deployments、services)
  • NAME:资源名称(列表操作可省略)
  • flags:可选参数

常用 kubectl 命令如下表所示。

CommandDescriptionExample
get列出资源kubectl get pods
describe查看详细信息kubectl describe pod nginx
create创建资源kubectl create deployment nginx --image=nginx
apply从文件创建或更新资源kubectl apply -f manifest.yaml
delete删除资源kubectl delete pod nginx
logs查看容器日志kubectl logs nginx
exec容器内执行命令kubectl exec -it nginx -- bash
port-forward本地端口转发到 Podkubectl port-forward pod/nginx 8080:80
表 1: 常用 kubectl 命令说明

直接访问 API

除了 kubectl,用户还可以通过 kubectl proxy 启动本地代理,便于直接访问 API,适合高级操作和调试。

# 启动代理
kubectl proxy --port=8080

# 使用 curl 访问 API
curl http://localhost:8080/api/v1/namespaces/default/pods

输出格式

kubectl 支持多种输出格式,便于脚本化和自动化处理。

FormatDescriptionExample
jsonJSON 格式kubectl get pods -o json
yamlYAML 格式kubectl get pods -o yaml
wide额外信息kubectl get pods -o wide
name仅资源名称kubectl get pods -o name
custom-columns自定义列格式kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase
jsonpathJSONPath 过滤kubectl get pods -o jsonpath='{.items[0].metadata.name}'
go-templateGo 模板格式化kubectl get pods -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'
表 2: kubectl 支持的输出格式

kubectl 的 JSONPath 用法

JSONPath 是一种 JSON 查询语言,kubectl 支持用其提取 API 响应中的特定字段,适合自动化脚本。

常用 JSONPath 表达式如下。

ExpressionDescription
{.items[*]}获取列表中所有项
{.metadata.name}资源名称
{.status.phase}资源状态
{range .items[*]}{end}遍历所有项
{.spec.containers[*].image}所有容器镜像
表 3: 常用 JSONPath 表达式

Server-Side Apply

Server-Side Apply 支持多用户/控制器协作管理同一对象,自动跟踪字段归属,避免相互覆盖。

图 5: Server-Side Apply 原理示意图
图 5: Server-Side Apply 原理示意图

关键点:

  • 字段管理跟踪每个字段的归属
  • 不同管理者设置同一字段会产生冲突
  • --field-manager 标识管理实体
  • --force-conflicts 可强制覆盖他人字段

其他 API 访问方式

除了 kubectl,还可以通过多种方式访问 Kubernetes API。

客户端库

Kubernetes 提供多语言官方客户端库,便于程序化访问。

LanguageClient Library
Gogithub.com/kubernetes/client-go
Pythongithub.com/kubernetes-client/python
Javagithub.com/kubernetes-client/java
JavaScriptgithub.com/kubernetes-client/javascript
.NETgithub.com/kubernetes-client/csharp
表 4: Kubernetes 官方客户端库

此外还有众多社区维护的客户端库。

API 代理与端口转发

  • 使用 kubectl proxy 创建本地代理
  • 直接带认证访问 API Server
  • 通过端口转发访问特定服务

kubectl 使用最佳实践

在脚本或自动化场景下,建议:

  • 明确指定输出格式(jsonyamlname),便于解析
  • 明确资源版本(如 apps/v1/deployments
  • 避免依赖默认 context,必要时显式指定
  • 使用 --dry-run=client--dry-run=server 预览变更
  • 长时间操作设置合理超时
  • 利用标签和选择器过滤资源
  • 配合版本控制的 YAML 文件使用 apply
  • 利用插件扩展功能

总结

掌握 kubectl 与 Kubernetes API 的交互原理,是高效管理和自动化 Kubernetes 资源的基础。kubectl 抽象了 API 复杂性,提供丰富的资源管理、输出格式和脚本化能力。深入理解 JSONPath、Server-Side Apply、客户端库等高级用法,将助力你更好地应对实际生产环境中的自动化和协作需求。

文章导航

章节内容

这是章节的内容页面。

章节概览

评论区