Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础

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-1webapp-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 环境验证,后续版本若有变更请参考官方文档。

相关推荐
fake_ss1982 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
Upsy-Daisy2 小时前
AI Agent 项目学习笔记(二):Spring AI 与 ChatClient 主链路解析
人工智能·笔记·学习
Cat_Rocky3 小时前
Kubernetes集群升级指南以及自动更新证书
云原生·容器·kubernetes
米高梅狮子3 小时前
第2章 docker容器
运维·docker·云原生·容器·架构·kubernetes·自动化
kidwjb3 小时前
信号量在进程中的使用
linux·进程间通信
闵孚龙3 小时前
Claude Code Ultraplan 远程多代理规划全解析:AI Agent、CCR远程容器、异步规划、状态机、计划传送与企业级自动化治理
运维·人工智能·自动化
C+++Python4 小时前
C++ 进阶学习完整指南
java·c++·学习
杨浦老苏4 小时前
AI原生笔记应用Tolaria
笔记·ai·markdown·obsidian
中屹指纹浏览器5 小时前
浏览器网络栈隔离技术研究:TCP/IP底层指纹生成与规避原理
经验分享·笔记
sulikey5 小时前
个人Linux操作系统学习笔记2 - gcc与库的理解
linux·笔记·学习·操作系统·gcc·