Kubernetes 管理实战手册

前言

本文整理自 Kubernetes 管理核心文档,涵盖kubectl命令使用、Metrics Server部署、节点标签管理、Dashboard可视化配置、YAML语法详解等核心内容,所有操作均附实际命令和配置示例,适合 K8s 初学者入门及运维人员参考。

一、kubectl 命令大全(从基础到进阶)

1.1 命令帮助与基础认知

kubectl是 Kubernetes 集群管理的核心命令行工具,可通过以下命令查看帮助文档:

[root@master ~]# kubectl -h
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/

1.2 基础命令(Beginner/Intermediate)

命令描述
create通过文件名或标准输入创建资源(如 Pod、Service)
expose将 Replication Controller、Pod 等资源公开为新的 Kubernetes Service
run在集群中运行特定镜像(快速创建 Pod)
set为对象设置指定特性(如资源限制、标签)
get显示一个或多个资源(如 Pod、Node、Service),支持多种输出格式
explain获取资源的文档参考资料(如kubectl explain pod.spec查看 Pod 配置详情)
edit使用默认编辑器编辑服务器上的资源(如kubectl edit pod <pod-name>)
delete通过文件名、资源名称或标签选择器删除资源(如kubectl delete pod <name>)

示例:查看节点信息

# 查看节点列表
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   17d   v1.28.0
node1    Ready    <none>          17d   v1.28.0
node2    Ready    <none>          17d   v1.28.0

# 查看节点详细信息(含IP、系统版本)
[root@master ~]# kubectl get nodes -o wide

1.3 部署命令(Deploy Commands)

用于管理应用部署、扩容缩容及自动伸缩:

命令描述
rollout管理资源的发布(如回滚 Deployment:kubectl rollout undo deployment <name>)
scale为 Deployment、ReplicaSet 等设置新的副本数量(如kubectl scale deployment <name> --replicas=3)
autoscale为资源配置自动伸缩(如kubectl autoscale deployment <name> --min=2 --max=5)

1.4 集群管理命令(Cluster Management)

核心用于集群节点维护和资源监控:

命令描述
cluster-info显示集群信息(如 API Server、CoreDNS 地址)
top显示资源(CPU / 内存 / 存储)使用情况(需 Metrics Server 支持)
cordon标记节点为不可调度(禁止新 Pod 调度到该节点)
uncordon取消节点不可调度标记(恢复 Pod 调度)
drain清空节点(驱逐已有 Pod,准备维护)
taint更新节点污点(控制 Pod 调度策略,如kubectl taint node node1 key=value:NoSchedule)

示例:查看集群信息与资源使用

# 查看集群核心组件地址
[root@master ~]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.100.136:6443
CoreDNS is running at https://192.168.100.136:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

# 查看Pod资源使用(需Metrics Server)
[root@master ~]# kubectl top pod -n kube-system
NAME                                       CPU(cores)   MEMORY(bytes)
calico-kube-controllers-658d97c59c-8nnql   1m           23Mi
calico-node-5t2r8                          52m          136Mi

1.5 故障诊断命令(Troubleshooting)

用于定位 Pod、节点故障,核心命令如下:

命令描述
describe显示资源详细信息(含事件日志,如kubectl describe pod <pod-name>)
logs打印 Pod 中容器的日志(如kubectl logs <pod-name> -c <container-name>)
exec在容器中执行命令(如kubectl exec -it <pod-name> -- /bin/bash)
port-forward将本地端口转发到 Pod(如kubectl port-forward <pod-name> 8080:80)
cp在本地与容器间拷贝文件(如kubectl cp <local-file> <pod-name>:/path)

示例:排查 Pod 启动失败

# 查看Pod详细事件(定位ImagePullBackOff、CrashLoopBackOff原因)
[root@master ~]# kubectl describe pod metrics-server-xxxx -n kube-system

二、Metrics Server 部署与问题解决

Metrics Server 是 K8s 资源监控的核心组件,支持kubectl top命令,部署步骤如下:

2.1 部署前准备

  • 集群版本≥1.19,节点网络互通
  • 需配置--kubelet-insecure-tls(v0.8.0 + 版本安全要求)

2.2 部署步骤

  1. 下载官方配置文件

    [root@master ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
    
  2. 修改配置(解决镜像拉取与安全配置)

    • 替换为国内镜像(阿里云),避免公网拉取失败
    • 添加--kubelet-insecure-tls参数,允许非加密访问 Kubelet
    # 替换镜像仓库
    [root@master ~]# sed -i 's/registry.k8s.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
    
    # 编辑配置文件,添加--kubelet-insecure-tls
    [root@master ~]# vim metrics-server-components.yaml
    # 在containers.args中添加:
    containers:
    - args:
      - --cert-dir=/tmp
      - --secure-port=10250
      - --kubelet-insecure-tls  # 新增该行
      - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
      - --kubelet-use-node-status-port
      - --metric-resolution=15s
      image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.8.0
    
  3. 应用配置并部署

    [root@master ~]# kubectl apply -f metrics-server-components.yaml
    
  4. 验证部署结果

    # 查看Pod状态(需等待1-2分钟)
    [root@master ~]# kubectl get pods -n kube-system | grep metrics-server
    metrics-server-57999c5cf7-ppvqq   1/1     Running   0          176m
    
    # 测试资源监控(成功则返回节点CPU/内存使用)
    [root@master ~]# kubectl top node
    NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
    master   78m          3%     384Mi           10%
    node1    137m         6%     1178Mi          32%
    node2    100m         5%     1202Mi          32%
    

2.3 常见问题解决

(1)ImagePullBackOff:镜像拉取失败
  • 原因:镜像地址错误、仓库不可访问、私有仓库无认证
  • 解决:
    1. 确认镜像名称 / 标签正确(如v0.8.0而非latest)
    2. 替换为国内镜像(参考 2.2 步骤 2)
    3. 若私有仓库,添加imagePullSecrets(需提前创建 Secret)
(2)CrashLoopBackOff:容器反复重启
  • 原因:缺少--kubelet-insecure-tls参数,无法访问 Kubelet
  • 解决:编辑 Deployment,在args中添加--kubelet-insecure-tls(参考 2.2 步骤 2)
(3)删除异常 Pod

若 Pod 处于Terminating或异常状态,可强制删除:

# 常规删除
[root@master ~]# kubectl delete pod metrics-server-xxxx -n kube-system

# 强制删除(无等待时间)
[root@master ~]# kubectl delete pod metrics-server-xxxx -n kube-system --grace-period=0 --force

三、Node 节点管理(配置与权限)

3.1 节点基础信息查看

# 查看节点标签(--show-labels)
[root@master ~]# kubectl get nodes --show-labels
NAME     STATUS   ROLES           AGE   VERSION   LABELS
master   Ready    control-plane   17d   v1.28.0   beta.kubernetes.io/arch=amd64,kubernetes.io/hostname=master...
node1    Ready    <none>          17d   v1.28.0   beta.kubernetes.io/arch=amd64,kubernetes.io/hostname=node1...

# 查看节点详细描述(含资源分配、事件)
[root@master ~]# kubectl describe node master

3.2 节点标签管理(Label)

通过标签实现 Pod 调度筛选、资源分组,核心操作如下:

  1. 添加标签

    # 为node2添加标签:region=nanjing
    [root@master ~]# kubectl label node node2 region=nanjing
    node/node2 labeled
    
    # 为node1添加多维度标签:region=hefei,zone=south,env=test
    [root@master ~]# kubectl label node node1 region=hefei zone=south env=test
    
  2. 查看标签

    # 查看指定标签(-L 标签名)
    [root@master ~]# kubectl get nodes -L region,zone
    NAME     STATUS   ROLES           AGE   VERSION   REGION    ZONE
    master   Ready    control-plane   17d   v1.28.0           
    node1    Ready    <none>          17d   v1.28.0   hefei     south
    node2    Ready    <none>          17d   v1.28.0   nanjing   
    
  3. 修改标签(–overwrite)

    # 将node1的zone标签从south改为west
    [root@master ~]# kubectl label node node1 zone=west --overwrite=true
    
  4. 删除标签(标签名后加 -)

    # 删除node1的env标签
    [root@master ~]# kubectl label node node1 env-
    
  5. 按标签筛选节点

    # 筛选zone=south的节点
    [root@master ~]# kubectl get nodes -l zone=south
    
    # 筛选env不等于test1的节点
    [root@master ~]# kubectl get nodes -l env!=test1
    

3.3 Node 节点配置 kubectl 权限

默认情况下,Worker 节点(如 node1、node2)无kubectl操作权限,需复制 Master 节点的admin.conf配置文件:

  1. 在 Worker 节点创建.kube 目录

    [root@node1 ~]# mkdir /root/.kube
    
  2. 从 Master 复制配置文件到 Worker

    # 在Master节点执行,将admin.conf复制到node1
    [root@master ~]# scp /etc/kubernetes/admin.conf node1:/root/.kube/config
    # 输入node1的root密码(示例:123123)
    root@node1's password: 
    
  3. 验证权限

    # 在node1执行,查看节点列表(成功则权限配置完成)
    [root@node1 ~]# kubectl get nodes
    NAME     STATUS   ROLES           AGE   VERSION
    master   Ready    control-plane   17d   v1.28.0
    node1    Ready    <none>          17d   v1.28.0
    node2    Ready    <none>          17d   v1.28.0
    

四、Kubernetes Dashboard 可视化配置

Dashboard 是 K8s 官方 Web 界面,支持 Pod 管理、资源查看、日志查询,部署步骤如下:

4.1 下载与修改配置文件

  1. 下载官方配置

    [root@master ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
    
  2. 修改 Service 为 NodePort 类型(便于外部访问)

    [root@master ~]# vim recommended.yaml
    # 找到Service配置部分,添加nodePort和type: NodePort
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      ports:
      - port: 443
        targetPort: 8443
        nodePort: 30001  # 新增:外部访问端口
      selector:
        k8s-app: kubernetes-dashboard
      type: NodePort  # 新增:改为NodePort类型
    

4.2 部署 Dashboard

# 应用配置
[root@master ~]# kubectl apply -f recommended.yaml

# 查看Pod状态(确保Running)
[root@master ~]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-5657497c4c-jpc9d   1/1     Running   0          2m29s
kubernetes-dashboard-746fbfd67c-nm5c7        1/1     Running   0          2m29s

# 查看Service端口(确认30001端口已暴露)
[root@master ~]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.110.180.64   <none>        8000/TCP        3m25s
kubernetes-dashboard        NodePort    10.111.182.77   <none>        443:30001/TCP   3m25s

4.3 访问 Dashboard 与获取 Token

  1. 浏览器访问

    • 地址:https://<节点IP>:30001(如https://192.168.100.128:30001)
    • 提示 “不安全连接”:忽略警告,继续访问(浏览器选择 “高级”→“继续访问”)
  2. 创建管理员账户与 Token

    • 创建 vim rbac.yaml

      配置文件:

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: dashboard-admin
        namespace: kube-system
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: dashboard-admin
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: cluster-admin
      subjects:
      - kind: ServiceAccount
        name: dashboard-admin
        namespace: kube-system
      
    • 应用配置并获取 Token:

      # 应用RBAC配置
      [root@master ~]# kubectl apply -f rbac.yaml
      
      # 生成Token(有效期1小时,每次执行生成新Token)
      [root@master ~]# kubectl create token dashboard-admin --namespace kube-system
      # 输出示例(需复制该Token用于登录):
      eyJhbGciOiJSUzI1NiIsImtpZCI6IklFQUdhejk2MXdicVZ1b1NpblpBZko2WEJqWDFSdUYtWTFwLUpWZFdfS0EifQ...
      
  3. 登录 Dashboard

    • 选择 “Token” 登录方式,粘贴上述 Token,点击 “登录”
    • 成功后可查看集群资源、Pod 日志、部署应用等

五、YAML 语法与资源清单详解

5.1 YAML 基础语法

YAML 是 K8s 资源配置的标准格式,核心语法规则:

  1. 缩进:仅允许空格(不支持 Tab),相同层级缩进一致
  2. 注释:#开头,注释内容到行尾
  3. 数据结构:
    • 对象:键值对(如name: Tom),行内写法{name: Tom, age: 20}
    • 数组:-开头(如- java - python - go),行内写法[java, python, go]
    • 纯量:单个值(字符串、数字、布尔值,如number: 3.14、isSet: true)

示例:复合结构(对象 + 数组)

languages:
  - java
  - python
  - go
websites:
  YAML: yaml.org
  Ruby: ruby-lang.org

5.2 K8s 资源清单核心字段

K8s 资源(Pod、Deployment、Service 等)的 YAML 配置需包含以下核心字段:

字段类型说明
apiVersionStringK8s API 版本(如v1、apps/v1,可通过kubectl api-versions查询)
kindString资源类型(如Pod、Deployment、Service)
metadataObject资源元数据(名称、命名空间、标签等)
metadata.nameString资源名称(同一命名空间下唯一)
metadata.namespaceString资源所属命名空间(默认default)
specObject资源详细配置(核心字段,随资源类型变化)

示例:Pod 资源清单关键配置

apiVersion: v1
kind: Pod
metadata:
  name: tomcat-pod
  namespace: default
  labels:
    app: tomcat
spec:
  containers:
  - name: tomcat
    image: tomcat:9.0.85-jdk11  # 镜像地址
    ports:
    - containerPort: 8080       # 容器内部端口
    resources:                  # 资源限制
      limits:
        cpu: "1"
        memory: "1Gi"
      requests:
        cpu: "500m"
        memory: "512Mi"
  restartPolicy: Always         # 重启策略(Always/OnFailure/Never)

5.3 常用资源配置示例

(1)创建命名空间(Namespace)
# create_web2.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: web2  # 命名空间名称

应用配置:kubectl apply -f create_web2.yaml

(2)Deployment+Service 部署 Tomcat
# tomcat.yaml(含ConfigMap、Deployment、Service)
apiVersion: v1
kind: ConfigMap
metadata:
  name: tomcat-web-content
data:
  index.html: |
    <html><body>Hello Tomcat</body></html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-test
spec:
  replicas: 2  # 2个副本
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0.85-jdk11
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: web-content
          mountPath: /usr/local/tomcat/webapps/ROOT/index.html
          subPath: index.html
      volumes:
      - name: web-content
        configMap:
          name: tomcat-web-content
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  type: NodePort  # NodePort类型,外部可访问
  selector:
    app: tomcat
  ports:
  - port: 80        # Service端口
    targetPort: 8080 # 容器端口
    nodePort: 30080  # 外部访问端口

应用配置后访问:http://<节点IP>:30080(如http://192.168.100.128:30080)

六、命名空间(Namespace)管理

6.1 命名空间作用

  • 资源隔离:不同命名空间的资源(Pod、Service)相互独立
  • 权限控制:可按命名空间配置 RBAC 权限
  • 资源配额:限制命名空间的 CPU、内存使用上限

注意:Node、PersistentVolume 等资源不属于任何命名空间。

6.2 命名空间操作命令

  1. 查看命名空间

    # 简写:kubectl get ns
    [root@master ~]# kubectl get namespaces
    NAME                   STATUS   AGE
    default                Active   19d
    kube-node-lease        Active   19d
    kube-public            Active   19d
    kube-system            Active   19d
    kubernetes-dashboard   Active   47h
    
  2. 创建命名空间

    • 命令创建:kubectl create namespace web1
    • YAML 创建:参考 5.3 节 “创建命名空间” 示例
  3. 查看命名空间下的资源

    # 查看kube-system命名空间下的所有资源
    [root@master ~]# kubectl get all --namespace=kube-system
    
    # 查看所有命名空间的Pod(-A=--all-namespaces)
    [root@master ~]# kubectl get pods -A
    
  4. 删除命名空间

    # 命令删除(会自动删除该命名空间下所有资源)
    [root@master ~]# kubectl delete namespace web1
    
    # YAML删除(需指定创建时的YAML文件)
    [root@master ~]# kubectl delete -f create_web2.yaml
    

注意:default、kube-system、kube-public为系统命名空间,不可删除。

结语

本文涵盖 Kubernetes 管理的核心操作,从kubectl命令到 Metrics Server、Dashboard 部署,再到 YAML 配置与命名空间管理,所有步骤均经过实操验证。建议初学者按 “命令熟悉→组件部署→资源配置” 的顺序学习,遇到问题可通过kubectl describe、kubectl logs等命令排查。后续可深入学习 HPA 自动伸缩、StatefulSet 有状态应用等进阶内容。

更多推荐