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

相关推荐
光影少年2 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
小龙在慢慢变强..2 小时前
目录结构(FHS 标准)
linux·运维·服务器
2035去旅行2 小时前
嵌入式开发,如何选择C标准库
linux·arm开发
刘延林.2 小时前
win11系统下通过 WSL2 安装Ubuntu 24.04 使用RTX 5080 GPU
linux·运维·ubuntu
星恒讯工业路由器2 小时前
星恒讯工业生产自动化解决方案
运维·物联网·自动化·智能路由器·信息与通信
a8a3022 小时前
Laravel9.x新特性全解析
运维·spring boot·nginx
beyond阿亮2 小时前
IEC104 Client Simulator - IEC104 主站/客户端模拟器 仿真器免费使用教程
运维·服务器·网络
郑寿昌2 小时前
GPU显存HPA:K8s智能扩缩实战
云原生·容器·kubernetes
sakiko_2 小时前
UIKit学习笔记2-组件嵌套、滚动视图等
笔记·学习·objective-c·swift·uikit