K8S使用

多集群访问切换

当你的 ~/.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,直接用:

1
kubectl get pods

✅ 方法三:创建不同配置文件(进阶)

如果你不想共用 ~/.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
source ~/.zshrc  # or ~/.bashrc

✅ 使用方式

1
2
3
kctx dev-cluster      # 切换到 dev-cluster 集群
kctx minikube # 切换到 minikube 集群
kctx # 不带参数会列出所有可用 context

定义切换namespace alias

kns 函数:一键切换当前 namespace

1
2
3
4
5
6
7
8
9
10
11
# 添加到 ~/.zshrc 或 ~/.bashrc 中
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
source ~/.zshrc  # or ~/.bashrc

✅ 使用方式

1
2
3
kns default       # 切换到 default 命名空间
kns dev # 切换到 dev 命名空间
kns # 不带参数时列出所有可用 namespace

kubectx安装

🧩 一、什么是 kubectxkubens

工具 作用 等价命令
kubectx 快速切换 Kubernetes 上下文(context) kubectl config use-context
kubens 快速切换当前命名空间(namespace) kubectl config set-context ...

而且这两个工具支持 自动补全、交互式选择(fzf),比 alias 更智能。


🛠️ 二、安装方法

👉 macOS(推荐你这个系统)

1
brew install kubectx

(它会一并装好 kubens


✅ 三、使用方法

🔄 切换 context(集群):

1
2
kubectx               # 显示所有上下文
kubectx dev-cluster # 切换到 dev-cluster

自动高亮当前集群,支持模糊查找 + fzf 支持(如果你有装 fzf

🌐 切换 namespace:

1
2
kubens               # 显示所有命名空间
kubens dev # 切换到 dev 命名空间

✨ 四、配合 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)

然后记得:

1
source ~/.zshrc   # 或 ~/.bashrc

部署失败问题定位

当你执行 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 logsdescribe 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