背景
因为 WB 的预发版本私有化 SaaS 版本后台相关微服务是部署在该 TKE 集群下,是部署在腾讯云的 VPC 的专有 TKE 环境下,因为没有子账号,仅有 kubeconfig 配置信息(运维提供的),所以使用了 kubeconfig 来访问 TKE 集群,这里记录下操作的一些内容
K8s 架构设计
K8s 本质是一个分布式容器编排系统,核心思路是声明式(你描述"我要什么状态",系统自己去达成)。架构分两层:

Control Plane(控制面,大脑)
- kube-apiserver:唯一入口,所有组件(包括 kubectl/你的客户端)都通过它的 REST API 交互,做鉴权和校验。你的 kubeconfig 里的 server 字段就是指向它。
- etcd:分布式 KV 存储,保存集群所有状态数据(谁在哪个节点、配置是什么)。可以理解成集群的"数据库"。
- kube-scheduler:决定新建的 Pod 该调度到哪个 Node 上(根据资源、亲和性等策略)。
- kube-controller-manager:一堆 controller 的集合,持续对比"期望状态"和"实际状态",做协调(比如 Pod 挂了就重建)。
Node(工作节点,干活的)
- kubelet:跑在每个 Node 上,负责真正拉起/管理容器,向 apiserver 汇报节点状态。
- kube-proxy:维护节点网络规则,实现 Service 的负载均衡/转发。
- 容器运行时(containerd/CRI-O):真正拉镜像跑容器的东西。

核心对象概念(你已知道 Pod)
- Pod:最小调度单位,一个或多个共享网络/存储的容器
- Deployment:管理 Pod 副本数、滚动更新,你部署服务通常操作它而不是直接操作 Pod
- Service:给一组 Pod 提供稳定访问入口(Pod IP 会变,Service 不会)
- Namespace:逻辑隔离,多租户/多环境常用
- Ingress:七层路由,把外部流量按域名/路径分发到 Service

K8s 本地管理软件
本次优先聚焦使用 OpenLens GUI 工具,以及 kubectl 原生工具

KubeConfig 配置
提供的 KubeConfig 配置
注意: client-certificate-data / client-key-data 是你的身份私钥,等价于账号密码,不要提交到 git、不要发群里。
- clusters:集群地址 + CA 证书(怎么验证服务端)
- users:客户端证书 + 私钥(你是谁,怎么被集群验证)
- contexts:把上面两者绑定成一个可用的连接配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xx
server: https://lb-xxx.clb.sh-tencentclb.net:443
name: cls-xxx
contexts:
- context:
cluster: cls-xxx
user: "uname"
name: cls-xxx-xxx-xx-default
current-context: cls-xxx-xxxx-context-default
kind: Config
preferences: {}
users:
- name: "uname"
user:
client-certificate-data: xx
client-key-data: xx
|
KubeConfig 配置使用
- 保存配置文件
1
2
3
| mkdir -p ~/.kube
# 把同事发的内容保存为文件,注意不要用默认路径覆盖你已有的 config(如果有)
vim ~/.kube/config-tencent-cls-c25b7kd9
|
- 验证连接(用 kubectl),能看到节点/Pod 列表就说明连通了。
1
2
3
| export KUBECONFIG=~/.kube/config-tencent-cls-c25b7kd9
kubectl get nodes
kubectl get pods -A
|
- 如果本地已有其他集群配置,想合并管理而不是每次 export
1
2
3
4
5
6
7
8
| # 方式一:多文件合并(临时查看)
export KUBECONFIG=~/.kube/config:~/.kube/config-tencent-cls-c25b7kd9
kubectl config view --flatten > ~/.kube/config-merged
mv ~/.kube/config-merged ~/.kube/config
kubectl get nodes
# 方式二:直接用 --kubeconfig 参数指定,不改环境变量
kubectl --kubeconfig ~/.kube/config-tencent-cls-c25b7kd9 get pods -A
|
MacOS 下操作(openlens)
1
2
| # 用社区免费分支 OpenLens(完全免费,功能一致,无登录限制)
brew install --cask openlens
|
安装完成后,通过 kubeconfig 添加导入集群

Kubectl
Pod 一些操作
pod 日志查看
1
2
3
4
5
6
7
8
9
10
11
| # 查看当前容器最近N小时的日志
kubectl logs console-f8985d47c-c7tfw -n copilot --since=1h
# 查看最近多少行
kubectl logs console-f8985d47c-c7tfw -n copilot --tail=500
# 关键:如果容器重启过,--previous 看的是"上一次运行"(重启前)的日志
kubectl logs console-f8985d47c-c7tfw -n copilot --previous
# 带时间戳,方便定位具体时间点
kubectl logs console-f8985d47c-c7tfw -n copilot --timestamps
|
登陆到指定的 Pod 节点上
1
2
3
4
5
6
7
8
| # 单容器场景,直接进去
kubectl exec -it console-f8985d47c-c7tfw -n copilot -- /bin/sh
# 如果容器里有 bash 就用 bash(体验更好,有历史命令等)
kubectl exec -it console-f8985d47c-c7tfw -n copilot -- /bin/bash
# 如果 Pod 里有多个容器,需要指定具体容器名
kubectl exec -it console-f8985d47c-c7tfw -n copilot -c <容器名> -- /bin/sh
|
遇到 Pod 节点为缺少工具精简版本的容器,可以从节点外部用 kubectl debug
kubectl 版本够新(1.23+),可以直接用一个带完整工具集的临时容器,挂到目标 Pod 的进程命名空间里去排查,不污染原容器:
1
2
3
4
5
6
7
8
9
10
11
12
| kubectl debug -it console-f8985d47c-c7tfw -n copilot --image=busybox --target=<容器名>
kubectl debug -it console-f8985d47c-c7tfw -n copilot --image=nicolaka/netshoot --target=<容器名>
# 示例
# 第一步:查真实容器名
kubectl get pod console-f8985d47c-c7tfw -n copilot -o jsonpath='{.spec.containers[*].name}'
# 第二步:用查到的名字(假设是 console)
kubectl debug -it console-f8985d47c-c7tfw -n copilot --image=nicolaka/netshoot --target=console
# 进去后验证能看到业务进程
ps -ef
|