
多集群访问切换
当你的 ~/.kube/config
中配置了多个 Kubernetes 集群时,你可以通过下面几种方式来指定当前要访问的集群👇
✅ 方法一:临时指定 --context
直接在 kubectl
命令中加上 --context
参数:
1
| kubectl get pods --context=<context-name>
|
比如:
1 2
| kubectl get pods --context=minikube kubectl get pods --context=dev-cluster
|
你可以先用下面命令查看所有上下文:
1
| kubectl config get-contexts
|
输出示例:
1 2 3
| CURRENT NAME CLUSTER AUTHINFO NAMESPACE * minikube minikube minikube dev-cluster dev-cluster dev-user
|
✅ 方法二:切换当前上下文(默认值)
如果你想让之后所有 kubectl
命令都默认使用某个集群:
1
| kubectl config use-context <context-name>
|
示例:
1
| kubectl config use-context dev-cluster
|
这样你之后就可以不用加 --context
,直接用:
✅ 方法三:创建不同配置文件(进阶)
如果你不想共用 ~/.kube/config
,可以拆成多个配置文件,然后用:
1
| KUBECONFIG=/path/to/your-config.yaml kubectl get pods
|
或者多配置文件合并也可以(有需要我可以帮你写)。
✅ 快速查看当前上下文
1
| kubectl config current-context
|
🎯 总结
方式 |
命令 |
场景 |
临时切换 |
kubectl xxx --context=xxx |
脚本中或临时切换使用 |
默认切换 |
kubectl config use-context xxx |
作为当前上下文,默认使用 |
多配置文件切换 |
KUBECONFIG=/path/config.yaml kubectl xxx |
有多个 kubeconfig 文件时 |
定义切换集群alias
1 2 3 4 5 6 7 8 9 10 11
| kctx() { if [ -z "$1" ]; then echo "Usage: kctx <context-name>" echo "Available contexts:" kubectl config get-contexts --no-headers | awk '{print $1}' return 1 fi kubectl config use-context "$1" && \ echo "✅ Switched to context: $1" && \ kubectl config view --minify -o jsonpath='{.contexts[0].context.namespace}{" @ "}{.clusters[0].name}{"\n"}' }
|
✅ 生效配置
✅ 使用方式
1 2 3
| kctx dev-cluster kctx minikube kctx
|
定义切换namespace alias
✅ kns
函数:一键切换当前 namespace
1 2 3 4 5 6 7 8 9 10 11
| kns() { if [ -z "$1" ]; then echo "Usage: kns <namespace>" echo "Available namespaces:" kubectl get ns --no-headers | awk '{print $1}' return 1 fi kubectl config set-context --current --namespace="$1" echo "✅ Switched to namespace: $1" }
|
✅ 生效配置
✅ 使用方式
1 2 3
| kns default kns dev kns
|
kubectx安装
🧩 一、什么是 kubectx
和 kubens
工具 |
作用 |
等价命令 |
kubectx |
快速切换 Kubernetes 上下文(context) |
kubectl config use-context |
kubens |
快速切换当前命名空间(namespace) |
kubectl config set-context ... |
而且这两个工具支持 自动补全、交互式选择(fzf),比 alias 更智能。
🛠️ 二、安装方法
👉 macOS(推荐你这个系统)
(它会一并装好 kubens
)
✅ 三、使用方法
🔄 切换 context(集群):
1 2
| kubectx kubectx dev-cluster
|
自动高亮当前集群,支持模糊查找 + fzf 支持(如果你有装 fzf
)
🌐 切换 namespace:
✨ 四、配合 Zsh/bash 自动补全
加到 .zshrc
或 .bashrc
中(如果没自动加):
1 2 3
| source /opt/homebrew/opt/kubectx/share/kubectx/completion.zsh source /opt/homebrew/opt/kubectx/share/kubens/completion.zsh
|
或者用 bash
的话类似这样:
1 2
| source <(kubectx completion bash) source <(kubens completion bash)
|
然后记得:
部署失败问题定位
当你执行 kubectl apply -f k8s-deployment.yaml
后 Pod 启动失败,可以按照下面这份 🧩 系统化排查步骤清单 逐一排查,非常实用 🔍:
🔎 1. 查看 Pod 状态
1
| kubectl get pods -n <namespace>
|
重点关注 STATUS 字段,比如:
CrashLoopBackOff
ImagePullBackOff
ErrImagePull
Pending
(可能是调度失败)
Error
🔧 2. 查看详细事件日志
1
| kubectl describe pod <pod-name> -n <namespace>
|
看哪里出了问题:
- 镜像拉取失败(拉不到镜像、没有权限)
- 容器端口冲突
- PVC 没挂载上
- Node 资源不够(CPU/内存)
📜 3. 查看容器日志(最关键)
1
| kubectl logs <pod-name> -n <namespace>
|
如果 Pod 有多个容器,加 -c
参数:
1
| kubectl logs <pod-name> -c <container-name> -n <namespace>
|
看看是否是你的 Java 应用报错:
- 启动失败?
- 环境变量不对?
- 数据库连不上?
- 配置文件找不到?
🛠 4. 查看 ReplicaSet & Deployment 状态
1 2
| kubectl get rs -n <namespace> kubectl describe deployment <deployment-name> -n <namespace>
|
确认 Deployment 是否成功创建 Pod、副本数是否满足、有没有报错事件。
💥 常见失败原因对照表
状态 |
可能原因 |
排查方式 |
ImagePullBackOff |
镜像名错了 / 私有仓库没登录 |
kubectl describe pod 查看 events |
CrashLoopBackOff |
应用启动后报错崩溃(Java 报错等) |
kubectl logs 看具体日志 |
Pending |
没有可调度 Node(资源不够 / 无效 Node) |
kubectl describe pod 看 events |
CreateContainerConfigError |
环境变量未配置 / 掛载卷失败 |
describe pod 看具体报错 |
Error |
容器执行后退出,exit code 非 0 |
logs 或 describe pod 分析 |
✅ 建议先看哪个?
先执行这两个命令:
1 2
| kubectl get pods -n <namespace> kubectl describe pod <pod-name> -n <namespace>
|
再执行:
1
| kubectl logs <pod-name> -n <namespace>
|
基本 90% 的问题就能定位了。
配置私有镜像仓库
要让 Kubernetes 从 私有镜像仓库 拉取镜像,你需要配置一个 imagePullSecret
,并在 Pod 或 Deployment 中引用它。下面是完整操作指南:
✅ 步骤一:创建镜像拉取凭据(imagePullSecret
)
使用 kubectl
创建密钥:
1 2 3 4 5 6
| kubectl create secret docker-registry myregistrykey \ --docker-server=<你的镜像仓库地址> \ --docker-username=<用户名> \ --docker-password=<密码> \ --docker-email=<邮箱> \ -n <namespace>
|
示例(以阿里云容器镜像服务为例):
1 2 3 4 5 6
| kubectl create secret docker-registry aliyun-reg-secret \ --docker-server=registry.cn-hangzhou.aliyuncs.com \ --docker-username=your-alicloud-username \ --docker-password=your-password \ --docker-email=you@example.com \ -n dev
|
✅ 步骤二:在 Deployment 中引用该 Secret
在你的 k8s-deployment.yaml
中,添加 imagePullSecrets
字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| apiVersion: apps/v1 kind: Deployment metadata: name: my-java-app namespace: dev spec: replicas: 1 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: registry.cn-hangzhou.aliyuncs.com/your-repo/java-app:1.0.0 ports: - containerPort: 8080 imagePullSecrets: - name: aliyun-reg-secret
|
✅ 步骤三(可选):将 secret 设置为默认使用(省略每次配置)
你也可以为某个 namespace 设置默认的 imagePullSecret:
1 2 3
| kubectl patch serviceaccount default \ -p '{"imagePullSecrets": [{"name": "aliyun-reg-secret"}]}' \ -n dev
|
之后该 namespace 下的所有 Pod 默认都会使用这个凭据。
✅ 常见私有仓库平台对应地址
镜像仓库平台 |
--docker-server 示例 |
Docker Hub |
https://index.docker.io/v1/ |
阿里云 |
registry.cn-hangzhou.aliyuncs.com |
腾讯云 |
ccr.ccs.tencentyun.com |
华为云 |
swr.cn-south-1.myhuaweicloud.com |
Harbor 自建 |
自己部署的地址,如 harbor.mycompany.com |