使用Openlens和Kubectl进行k8s集群的访问和管理

AI 摘要: 本文介绍了在腾讯云专有TKE集群环境下,利用私人预发版本的SaaS后台微服务,基于kubeconfig配置实现对无子账号的集群访问。深入阐述了K8s的分布式架构,包括控制面和工作节点,以及核心资源对象如Pod、Deployment等。重点讲解了本地管理工具OpenLens与kubectl的使用,帮助用户理解集群的架构设计和操作流程,确保高效管理微服务,提升运维效率。本文旨在为云上微服务部署提供系统化的方案和操作指南。

背景

因为 WB 的预发版本私有化 SaaS 版本后台相关微服务是部署在该 TKE 集群下,是部署在腾讯云的 VPC 的专有 TKE 环境下,因为没有子账号,仅有 kubeconfig 配置信息(运维提供的),所以使用了 kubeconfig 来访问 TKE 集群,这里记录下操作的一些内容

K8s 架构设计

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):真正拉镜像跑容器的东西。

k8s分层架构图

核心对象概念(你已知道 Pod)

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

k8s下多工作节点+多Pod概念

K8s 本地管理软件

本次优先聚焦使用 OpenLens GUI 工具,以及 kubectl 原生工具

k8s工具对比

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. 保存配置文件
1
2
3
mkdir -p ~/.kube
# 把同事发的内容保存为文件,注意不要用默认路径覆盖你已有的 config(如果有)
vim ~/.kube/config-tencent-cls-c25b7kd9
  1. 验证连接(用 kubectl),能看到节点/Pod 列表就说明连通了。
1
2
3
export KUBECONFIG=~/.kube/config-tencent-cls-c25b7kd9
kubectl get nodes
kubectl get pods -A
  1. 如果本地已有其他集群配置,想合并管理而不是每次 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 添加导入集群

OpenLens应用

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