本文介绍了访问 Kubernetes 集群的各种方式,包括命令行工具、REST API、编程接口等多种方法。
如果你是第一次访问 Kubernetes API,推荐使用 Kubernetes 命令行工具 kubectl。
访问集群需要知道:
这些信息通常在完成集群部署后自动配置,或由集群管理员提供。
使用以下命令检查 kubectl 的配置信息:
kubectl config view
确认集群连接正常:
kubectl cluster-info
kubectl get nodes
kubectl 会自动处理 API server 的定位和认证。如果需要直接访问 REST API,可以使用 HTTP 客户端(如 curl、wget 或浏览器),有以下几种方式:
这是最推荐的方法,具有以下优势:
启动代理:
kubectl proxy --port=8080
然后可以通过 HTTP 访问 API:
curl http://localhost:8080/api/v1
获取必要的认证信息:
# 获取 API server 地址
APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
# 获取访问令牌
TOKEN=$(kubectl get secret $(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode)
# 访问 API
curl $APISERVER/api/v1 --header "Authorization: Bearer $TOKEN" --insecure
注意:使用 --insecure 标志会跳过 TLS 证书验证,存在中间人攻击风险。生产环境应使用正确的证书配置。
Kubernetes 提供多种语言的官方客户端库:
安装客户端库:
go get k8s.io/client-go/kubernetes
基本使用示例:
package main
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// 使用默认的 kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
if err != nil {
panic(err)
}
// 创建客户端
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
// 列出 Pod
pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err)
}
fmt.Printf("共有 %d 个 Pod\n", len(pods.Items))
}
安装客户端库:
pip install kubernetes
基本使用示例:
from kubernetes import client, config
# 加载 kubeconfig
config.load_kube_config()
# 创建 API 客户端
v1 = client.CoreV1Api()
# 列出所有 Pod
pods = v1.list_pod_for_all_namespaces()
print(f"共有 {len(pods.items)} 个 Pod")
Kubernetes 社区还提供了以下语言的客户端库:
详细信息请参考 Kubernetes 客户端库。
当应用运行在 Kubernetes Pod 中时,访问 API 的方式有所不同。
在 Pod 中可以通过以下方式找到 API server:
kubernetes.default.svc.cluster.localKUBERNETES_SERVICE_HOST 和 KUBERNETES_SERVICE_PORT每个 Pod 都会自动挂载默认服务账户的凭证:
/var/run/secrets/kubernetes.io/serviceaccount/token/var/run/secrets/kubernetes.io/serviceaccount/ca.crt/var/run/secrets/kubernetes.io/serviceaccount/namespaceGo 客户端示例:
config, err := rest.InClusterConfig()
if err != nil {
panic(err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
Python 客户端示例:
from kubernetes import client, config
# 加载集群内配置
config.load_incluster_config()
v1 = client.CoreV1Api()
根据服务类型选择合适的访问方式:
| 服务类型 | 访问方式 | 适用场景 |
|---|---|---|
| ClusterIP | 集群内访问 | 内部服务通信 |
| NodePort | 节点端口访问 | 开发测试环境 |
| LoadBalancer | 外部负载均衡器 | 生产环境对外服务 |
| ExternalName | DNS 别名 | 访问外部服务 |
使用 kubectl 代理访问集群内服务:
kubectl proxy
然后通过以下 URL 格式访问服务:
http://localhost:8080/api/v1/namespaces/{namespace}/services/{service-name}:{port}/proxy/
将本地端口转发到 Pod 或服务:
# 转发到 Pod
kubectl port-forward pod/my-pod 8080:80
# 转发到服务
kubectl port-forward service/my-service 8080:80
查看集群内置服务:
kubectl cluster-info
常见的内置服务包括:
访问这些服务通常需要适当的 RBAC 权限配置。
--insecure 标志以下是相关的代码示例:
# 示例:创建只读权限的服务账户
apiVersion: v1
kind: ServiceAccount
metadata:
name: readonly-user
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: readonly
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: readonly-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: readonly
subjects:
- kind: ServiceAccount
name: readonly-user
namespace: default
kubectl cluster-info以下是相关的代码示例:
# 检查集群状态
kubectl cluster-info dump
# 查看详细错误信息
kubectl get events --sort-by=.metadata.creationTimestamp
# 测试 API 连接
kubectl auth can-i '*' '*' --all-namespaces
Kubernetes 环境中存在多种代理类型:
每种代理都有其特定的使用场景和配置要求,选择合适的代理方式对于集群的性能和安全性都很重要。