Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
本笔记聚焦于 Kubernetes 集群的节点管理、多集群切换、命名空间隔离机制以及 Pod 的基本操作。所有示例代码均经过验证,可直接复现。文末附有核心知识点速查表,便于快速回顾。
1. 配置专用管理节点
在生产环境中,通常不建议直接登录 Master 节点进行操作。我们可以准备一台独立的 Ubuntu 24.04 管理机,仅安装 kubectl 客户端工具。
bash
# 添加 Kubernetes 阿里云镜像仓库
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | \
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" \
> /etc/apt/sources.list.d/kubernetes.list
# 安装指定版本的 kubectl
apt update && apt install -y kubectl=1.30.2.1-1.1
# 配置集群访问凭据
mkdir -p $HOME/.kube
scp root@10.1.8.30:/etc/kubernetes/admin.conf $HOME/.kube/config
# 验证连通性
kubectl get nodes
1.1 多集群管理技巧
若需同时管理多个 Kubernetes 集群,可使用不同配置文件配合别名:
bash
scp 10.1.8.30:/etc/kubernetes/admin.conf ~/.kube/cluster1.config
scp 10.1.8.40:/etc/kubernetes/admin.conf ~/.kube/cluster2.config
alias kubectl-1='kubectl --kubeconfig ~/.kube/cluster1.config'
alias kubectl-2='kubectl --kubeconfig ~/.kube/cluster2.config'
kubectl-1 get nodes
kubectl-2 get nodes
2. Node 与 Cluster 管理
2.1 查看节点信息
bash
# 列出所有节点
kubectl get nodes
# 查看单个节点详细信息(含资源使用情况、Conditions 等)
kubectl describe node master30.whisky.cloud
# 以 YAML 格式输出节点完整定义
kubectl get node master30.whisky.cloud -o yaml
2.2 安全下线并删除节点
以删除 worker31 节点为例:
bash
# 驱逐节点上的 Pod,并将其标记为不可调度
kubectl drain worker31.whisky.cloud --ignore-daemonsets
# 此时节点状态为 Ready,SchedulingDisabled
kubectl get nodes
# 从集群中删除节点对象
kubectl delete node worker31.whisky.cloud
# 在被删除的节点上执行重置操作(清除所有 K8s 残留文件)
kubeadm reset -f
2.3 删除并重建整个集群
(1)备份集群配置
bash
kubectl get cm kubeadm-config -n kube-system -o yaml > kubeadm.yml
(2)清理所有工作节点
bash
kubectl drain worker31.whisky.cloud --ignore-daemonsets --force
kubectl drain worker32.whisky.cloud --ignore-daemonsets --force
kubectl delete node worker31.whisky.cloud worker32.whisky.cloud
# 在各 worker 节点执行
kubeadm reset -f
(3)清理 Master 节点并重新初始化
bash
# 删除 Master 节点对象并重置
kubectl delete node master30.whisky.cloud
kubeadm reset -f
rm -rf $HOME/.kube
# 使用备份的配置重新初始化
kubeadm init --config kubeadm.yml
# 或使用命令行参数
kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16
# 配置 kubectl 凭据
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件(Calico)
kubectl apply -f calico.yaml
# 工作节点重新加入集群
kubeadm join 10.1.8.30:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
3. Namespace 与 Contexts
3.1 Namespace 核心概念
Namespace(命名空间)用于将一个物理集群逻辑上划分为多个虚拟集群,实现资源隔离。Kubernetes 默认包含以下命名空间:
| 命名空间 | 用途 |
|---|---|
default |
未指定命名空间时资源的默认归属地 |
kube-system |
Kubernetes 系统组件(如 kube-proxy、coredns)所在命名空间 |
kube-public |
所有用户(含未认证用户)均可读取的公共资源 |
kube-node-lease |
存放节点心跳租约对象,用于节点故障检测 |
3.2 Namespace 基本操作
bash
# 列出所有命名空间
kubectl get ns
# 创建命名空间
kubectl create ns whisky
# 使用 YAML 创建
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: whisky
EOF
# 在指定命名空间中运行 Pod
kubectl run web --image=nginx -n whisky
# 查看指定命名空间的 Pod
kubectl get pod -n whisky -o wide
# 删除命名空间(将级联删除其中所有资源)
kubectl delete ns whisky
3.3 切换当前命名空间
方法一:使用 kubectl 内置命令
bash
# 查看当前上下文
kubectl config get-contexts
# 将当前上下文的默认命名空间设置为 whisky
kubectl config set-context --current --namespace=whisky
方法二:使用第三方工具 kubens
bash
# 安装 kubens
wget https://codeload.github.com/ahmetb/kubectx/zip/refs/heads/master -O kubectx.zip
unzip kubectx.zip
cp kubectx-master/kubens /usr/local/bin/
chmod +x /usr/local/bin/kubens
# 列出所有命名空间(当前所在以 * 标记)
kubens
# 切换到 kube-system 命名空间
kubens kube-system
# 返回上一个命名空间
kubens -
3.4 Cluster 多集群切换
~/.kube/config 文件定义了 clusters(集群信息)、users(用户凭证)和 contexts(上下文组合)。通过切换 context 即可切换集群。
查看与切换
bash
# 列出所有集群
kubectl config get-clusters
# 列出所有上下文
kubectl config get-contexts
# 切换到指定上下文
kubectl config use-context cluster2-context
使用 kubectx 高效切换
bash
# 安装 kubectx
cp kubectx-master/kubectx /usr/local/bin/
chmod +x /usr/local/bin/kubectx
# 列出所有上下文
kubectx
# 切换到指定上下文
kubectx cluster2-context
# 切换到上一个上下文
kubectx -
# 取消当前上下文设置
kubectx -u
4. Pod 基础操作
4.1 Pod 简介
Pod 是 Kubernetes 中最小的调度和管理单元,代表集群中运行的一个应用实例。一个 Pod 可以包含一个或多个紧密耦合的容器,这些容器共享网络命名空间(包括 IP 地址和端口空间)和存储卷。
4.2 Pod 基本管理命令
bash
# 创建 Pod(命令式)
kubectl run web --image=nginx
# 生成 Pod YAML 而不实际创建(--dry-run)
kubectl run web --image=nginx --dry-run=client -o yaml > web.yaml
# 使用 YAML 文件创建
kubectl apply -f web.yaml
web.yaml 示例:
yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: web
name: web
spec:
containers:
- image: nginx
name: web
4.3 查看 Pod 详情
bash
# 查看 Pod 列表及 IP
kubectl get pod -o wide
# 查看 Pod 详细事件(排查问题首选)
kubectl describe pod web
# 查看 Pod 标准输出日志
kubectl logs -f web
# 以 YAML 格式输出完整定义
kubectl get pod web -o yaml
4.4 在 Pod 容器中执行命令
bash
# 执行单条命令
kubectl exec web -- hostname
# 交互式进入容器
kubectl exec -it web -- bash
# 执行复杂命令
kubectl exec web -- bash -c 'echo Hello World > /usr/share/nginx/html/index.html'
4.5 文件拷贝
bash
# 从宿主机拷贝文件到 Pod
kubectl cp /etc/hosts web:/new-hosts
# 从 Pod 拷贝文件到宿主机
kubectl cp web:/var/log/nginx/access.log ./access.log
4.6 删除 Pod
bash
kubectl delete pod web
Pod 默认有 30 秒的优雅终止时间(terminationGracePeriodSeconds: 30),期间容器中的进程可完成清理工作。
5. ConfigMap 配置管理
ConfigMap 用于将非敏感的配置数据与容器镜像解耦,支持以环境变量或文件卷的形式注入 Pod。
5.1 创建 ConfigMap
bash
# 从键值对创建
kubectl create configmap mysql --from-literal=password=redhat
# 从文件创建
echo "Hello World" > index.html
kubectl create configmap web1 --from-file=./index.html
# 从目录创建(目录下所有文件都会成为 configmap 中的键)
mkdir web2
cp index.html error.html web2/
kubectl create configmap web2 --from-file=./web2
5.2 以环境变量方式引用
yaml
# pod-cm-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql
spec:
containers:
- image: docker.io/library/mysql:latest
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name: mysql
key: password
验证:
bash
kubectl exec -it mysql -- bash -c 'echo $MYSQL_ROOT_PASSWORD'
# 输出:redhat
5.3 以 Volume 方式挂载
挂载整个 ConfigMap(每个键作为一个文件)
yaml
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- image: docker.io/library/nginx:latest
name: web
volumeMounts:
- name: webcontent
mountPath: "/usr/share/nginx/html"
volumes:
- name: webcontent
configMap:
name: web2 # 包含 index.html 和 error.html
挂载指定键(两种写法)
yaml
# 写法一:使用 items 筛选
volumes:
- name: webcontent
configMap:
name: web2
items:
- key: index.html
path: index.html
# 写法二:使用 subPath 挂载单个文件
volumeMounts:
- name: webcontent
mountPath: "/usr/share/nginx/html/index.html"
subPath: index.html
注意 :通过 Volume 挂载的 ConfigMap 支持热更新(kubelet 定期同步),但使用
subPath挂载的文件不会自动更新。
5.4 实战案例:HAProxy + Web 负载均衡
需求 :部署两个 Nginx Pod(webapp-1、webapp-2),其网页内容通过 ConfigMap 提供;再部署一个 HAProxy Pod,配置文件由 ConfigMap 挂载,将请求负载均衡到两个后端。
步骤 1:创建后端 Web Pod 及对应 ConfigMap
bash
kubectl create cm webapp-1 \
--from-literal=index.html="hello webapp-1" \
--from-literal=error.html="sorry, error."
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: webapp-1
spec:
containers:
- name: nginx
image: docker.io/library/nginx:latest
volumeMounts:
- name: config
mountPath: "/usr/share/nginx/html"
volumes:
- name: config
configMap:
name: webapp-1
EOF
# 同理创建 webapp-2(略)
步骤 2:获取 Pod IP 并生成 HAProxy 配置
bash
kubectl get pods -o wide # 假设 webapp-1 IP: 10.224.84.80, webapp-2 IP: 10.224.149.25
cat > haproxy.cfg <<EOF
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:8080
default_backend servers
backend servers
server app1 10.224.84.80:80 check
server app2 10.224.149.25:80 check
EOF
kubectl create cm haproxy.cfg --from-file=haproxy.cfg=./haproxy.cfg
步骤 3:部署 HAProxy Pod
yaml
apiVersion: v1
kind: Pod
metadata:
name: haproxy
spec:
containers:
- name: haproxy
image: docker.io/library/haproxy
volumeMounts:
- name: config
mountPath: "/usr/local/etc/haproxy"
volumes:
- name: config
configMap:
name: haproxy.cfg
步骤 4:验证负载均衡
bash
HAPROXY_IP=$(kubectl get pod haproxy -o jsonpath='{.status.podIP}')
curl http://$HAPROXY_IP:8080 # 交替返回 hello webapp-1 / hello webapp-2
6. 知识点速查表
6.1 节点管理速查
| 操作 | 命令 |
|---|---|
| 查看节点列表 | kubectl get nodes |
| 查看节点详情 | kubectl describe node <node-name> |
| 标记节点不可调度 | kubectl cordon <node-name> |
| 驱逐节点并标记不可调度 | kubectl drain <node-name> --ignore-daemonsets |
| 删除节点 | kubectl delete node <node-name> |
| 重置节点(清除 K8s 组件) | kubeadm reset -f |
6.2 Namespace 与 Context 速查
| 操作 | 命令 |
|---|---|
| 列出命名空间 | kubectl get ns |
| 创建命名空间 | kubectl create ns <name> |
| 删除命名空间 | kubectl delete ns <name> |
| 查看当前上下文 | kubectl config current-context |
| 切换默认命名空间 | kubectl config set-context --current --namespace=<ns> |
| 列出所有上下文 | kubectl config get-contexts |
| 切换上下文 | kubectl config use-context <context-name> |
6.3 Pod 常用命令速查
| 操作 | 命令 |
|---|---|
| 创建 Pod | kubectl run <name> --image=<image> |
| 从 YAML 创建 | kubectl apply -f <file.yaml> |
| 查看 Pod 列表(含 IP) | kubectl get pods -o wide |
| 查看 Pod 详情 | kubectl describe pod <pod-name> |
| 查看日志 | kubectl logs <pod-name> |
| 在容器中执行命令 | kubectl exec <pod-name> -- <command> |
| 交互式进入容器 | kubectl exec -it <pod-name> -- /bin/bash |
| 拷贝文件 | kubectl cp <src> <pod-name>:<dest> |
| 删除 Pod | kubectl delete pod <pod-name> |
| 强制删除 Pod | kubectl delete pod <pod-name> --force --grace-period=0 |
6.4 ConfigMap 创建与引用速查
| 创建方式 | 命令示例 |
|---|---|
| 键值对 | kubectl create cm <name> --from-literal=key=value |
| 单个文件 | kubectl create cm <name> --from-file=./file.txt |
| 目录 | kubectl create cm <name> --from-file=./dir/ |
| 指定键名 | kubectl create cm <name> --from-file=custom-key=./file.txt |
| 引用方式 | YAML 配置关键字段 | 特点 |
|---|---|---|
| 环境变量 | valueFrom.configMapKeyRef |
不自动更新 |
| Volume 挂载全部 | volumes[].configMap.name |
每个键一个文件,支持热更新 |
| Volume 挂载指定项 | volumes[].configMap.items |
筛选键并可重命名文件 |
| 挂载单文件 | volumeMounts[].subPath |
不支持热更新 |
笔记基于 Kubernetes v1.30.2 环境验证,后续版本若有变更请参考官方文档。