Skip to content
🗂️ 文章分类: 云原生  
🏷️ 文章标签: Kubernetes  
📅 文章创建时间: 2026-04-21
🕘️ 文章最后更新时间:2026-04-21

[toc]

K3s笔记2

常用命令详解

查看K3s状态信息

sh
# 查看k3s服务运行状态
systemctl status k3s

# 启动k3s集群
systemctl start k3s

# 停止k3s集群
systemctl stop k3s

# 重启k3s集群
systemctl restart k3s

# 设置开机自动启动k3s
systemctl enable k3s

# 查看k3s版本
k3s --version

查看K3s集群信息

sh
# 查看集群所有节点完整信息
kubectl get nodes

# 查看集群整体概况
kubectl cluster-info

# 查看客户端&服务端版本
kubectl version

# 查看集群全部事件(排错最强命令)
kubectl get events

命名空间相关常用命令(namespace 简写 ns)

Namespace = 你隔离的环境,每个命名空间都可以有自己的资源(Pod、Service、Deployment等)

sh
# 查看所有命名空间
kubectl get namespaces

# 创建命名空间
kubectl create namespace my-project

# 删除命名空间
kubectl delete namespace my-project

# 切换默认使用的命名空间(后续命令不用再加-n)
kubectl config set-context --current --namespace=my-project

查看集群全部资源

sh
# 查看当前命名空间所有资源
kubectl get all

# 查看集群全部命名空间所有资源
kubectl get all --all-namespaces

Pod容器相关常用命令

Pod = 你运行的容器实例

sh
# 查看当前命名空间所有Pod
kubectl get pods

# 查看**所有命名空间**全部Pod(最常用)
kubectl get pods --all-namespaces

# 查看指定命名空间Pod
kubectl get pods --namespace my-project

# 查看Pod详细信息(启动原因、报错、状态)
kubectl describe pods pod名称

# 实时查看Pod日志(SpringBoot日志排错必用)
kubectl logs --follow pod名称

# 进入Pod容器内部终端
kubectl exec --stdin --tty pod名称 -- /bin/bash

# 删除Pod(会自动重建)
kubectl delete pods pod名称

# 强制立刻删除Pod
kubectl delete pods pod名称 --force --grace-period=0

Service服务相关常用命令(service 简写 svc)

Service = 你暴露的服务入口

sh
# 查看所有服务
kubectl get services

# 查看所有命名空间服务
kubectl get services --all-namespaces

# 查看指定命名空间服务
kubectl get services --namespace my-project

# 查看服务详细信息、端口、IP
kubectl describe services 服务名称

Deployment控制器 相关常用命令(deployment 简写 dep)

Deployment = 管理 Pod、自动扩容、自愈、滚动更新

sh
# 查看所有部署
kubectl get deployments

# 查看所有命名空间部署
kubectl get deployments --all-namespaces

# 扩容/缩容Pod数量(SpringBoot扩实例)
kubectl scale deployments springboot-service --replicas=3

# 删除部署(同时删除Pod、服务)
kubectl delete deployments springboot-service

Ingress 域名路由

Ingress = 外网域名、HTTP 路由、网关入口

sh
# 查看所有域名路由
kubectl get ingress

# 查看指定ingress详情
kubectl describe ingress ingress名称

ConfigMap 配置文件

ConfigMap = 你存储的配置信息,如数据库配置、应用配置等。相当于配置中心

sh
# 查看配置文件ConfigMap
kubectl get configmaps

# 查看密钥Secret(数据库密码等敏感信息)
kubectl get secrets

YAML 部署 / 删除(标准云原生部署方式)

YAML = 你定义的资源配置文件,文件中定义Deployment、Service、ConfigMap等资源的使用方式。

sh
# 根据yaml文件创建/更新资源(若资源不存在则创建,若存在则更新)
kubectl apply --filename springboot-deploy.yaml

# 根据yaml文件删除所有资源
kubectl delete --filename springboot-deploy.yaml

K3s 内置容器镜像命令(全称 containerd )

k3s 默认不用 docker,用 containerd 容器运行时来管理容器。

sh
# 查看本地所有镜像
crictl images

# 删除本地镜像
crictl rmi 镜像名称

K3s 部署 Nginx 页面服务

在K3s集群中,部署一个Nginx服务,然后Nginx服务中部署一个静态页面。

创建一个nginx-k3s-deploy.yaml文件。文件内容如下

yaml
# nginx-k3s-deploy.yaml - 部署 Nginx 挂载静态文件目录

# 创建命名空间 nginx-namespace
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-namespace

---

# 创建 Nginx 配置 ConfigMap(包含nginx配置文件)
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configmap
  namespace: nginx-namespace        # 关联命名空间 nginx-namespace
data:
  default.conf: |
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;  # 支持 Vue 路由
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

---

# 创建 PV 持久卷,该持久卷将挂载宿主机目录
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv
  namespace: nginx-namespace
  labels:
    app: nginx-pv-label
spec:
  capacity:
    storage: 1Gi              # 1Gi 存储空间
  accessModes:
    - ReadWriteOnce           # 仅支持单节点读写
  hostPath:
    path: /path/to/your/vue/dist  # 替换为你的静态文件所在的目录路径

---

# 创建 PVC 持久卷声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  namespace: nginx-namespace
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      app: nginx-pv-label       # 与 PV 持久卷的标签匹配,标识该 PVC持久卷声明与 PV持久卷关联

---

# 创建Deployment资源 nginx-deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx-namespace    # 关联命名空间 nginx-namespace
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deployment-label
  template:
    metadata:
      labels:
        app: nginx-deployment-label
    spec:
      volumes:
      - name: nginx-deployment-pvc        # 定义pod级别的 PVC 持久卷声明资源
        persistentVolumeClaim:
          claimName: nginx-pvc            # 关联 PVC持久卷声明资源 nginx-pvc ,表示nginx-deployment-pvc 与 nginx-pvc 关联
      - name: nginx-deployment-configmap  # 定义pod级别的 ConfigMap 配置资源
        configMap:
          name: nginx-configmap           # 关联 nginx-configmap 配置资源 ,表示nginx-deployment-configmap 与 nginx-configmap 关联
      containers:
      - name: nginx-deployment-container  # 容器名称,nginx-deployment-container
        image: nginx:latest               # 容器镜像,nginx:latest
        ports:
        - containerPort: 80               # 容器端口,80,与服务端口一致
        volumeMounts:
        - name: nginx-deployment-pvc        # 将上面定义的nginx-deployment-pvc 持久卷声明 与 容器内的 /usr/share/nginx/html 目录挂载关联
          mountPath: /usr/share/nginx/html    
        - name: nginx-deployment-configmap  # 将上面定义的nginx-deployment-configmap 配置资源 与 容器内的 /etc/nginx/conf.d 目录挂载关联
          mountPath: /etc/nginx/conf.d      
        resources:                          
          requests:                           # 容器资源请求
            memory: "128Mi"
            cpu: "100m"   
          limits:                             # 容器资源限制
            memory: "256Mi"
            cpu: "200m"
        livenessProbe:                        # 容器存活探针
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
          timeoutSeconds: 5
        readinessProbe:                       # 容器就绪探针
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 5
          timeoutSeconds: 3
---

# 创建服务资源 nginx-service
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: nginx-namespace        # 关联命名空间 nginx-namespace
spec:
  type: NodePort                   # 服务类型NodePort
  selector:
    app: nginx-deployment-label    # 与 Deployment资源 nginx-deployment 标签匹配,表示nginx-service资源 与 nginx-deployment资源关联
  ports:
  - name: http                   # 服务端口名称,http,与容器端口一致
    port: 80                       # 服务端口,80,与容器端口一致
    targetPort: 80               # 容器端口,80,与服务端口一致
    nodePort: 30080              # 节点端口,30080,与服务端口一致

该文件部署后,Nginx的访问方式如下

plaintext
用户浏览器

http://<节点IP>:30080

Service (NodePort 30080)

Deployment (选择器匹配)

Pod (Nginx 容器)

/usr/share/nginx/html → Vue dist 静态文件
/etc/nginx/conf.d → Nginx 配置文件

K3s 部署 Mysql 数据库单机(有状态应用服务)

核心说明

  1. MySQL 是有状态应用 → 必须用 StatefulSet 部署(不能用 Deployment)
  2. MySQL一主二从集群:
    • mysql-0 主节点(写)
    • mysql-1 从节点(读)
    • mysql-2 从节点(读)
  3. 数据持久化:K3s 自动创建 PVC + PV,每个节点都有一个本地存储目录,用于存储 MySQL 数据。
  4. 服务:
    • 主节点写入服务:mysql-write
    • 从节点只读服务:mysql-read

创建Yaml部署文件

创建一个mysql-k3s-deploy.yaml文件。文件内容如下

yaml
# K3s 部署MySQL单机服务
# 如果是单机环境,建议使用 Deployment 控制器,而不是 StatefulSet 控制器。
# 如果是集群环境,建议使用 StatefulSet 控制器。

# 创建一个命名空间
apiVersion: v1
kind: Namespace                   # 资源类型:命名空间
metadata:
  name: mysql-k3s                 # 命名空间名称:mysql-k3s。作用:隔离环境,所有 MySQL 资源都放在这里。

---

# 创建配置资源
apiVersion: v1
kind: ConfigMap                 # 资源类型:配置
metadata:
  name: mysql-configmap             
  namespace: mysql-k3s          # 配置对应的命名空间:mysql-k3s
data:
  # 配置内容
  my.cnf: |
    [mysqld]
    # 基础设置
    port=3306
    skip-networking=0
    bind-address=0.0.0.0
    default_authentication_plugin=mysql_native_password
    
    # 字符集设置
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    
    # 日志设置
    log_error=/var/lib/mysql/error.log
    slow_query_log=1
    slow_query_log_file=/var/lib/mysql/slow.log
    long_query_time=2
    
    # 性能设置
    max_connections=200
    innodb_buffer_pool_size=256M
    innodb_log_file_size=64M

---

# 创建密钥存储资源
apiVersion: v1
kind: Secret                    # 资源类型:密码存储
metadata:
  name: mysql-secret            # 密码存储名称:mysql-secret
  namespace: mysql-k3s          # 密码存储命名空间:mysql-k3s 。作用:与配置文件在同一命名空间,方便引用。
type: Opaque                    # 普通密钥类型
data:
  # 创建了一个key为mysql-normal-password的密码键值对,密码需要是 base64 编码形式。MTIzNDU2是123456的base64编码
  mysql-normal-password: MTIzNDU2
  # 创建了一个key为mysql-root-password的密码键值对
  mysql-root-password: MTIzNDU2

---

# 创建持久卷资源
apiVersion: v1
kind: PersistentVolumeClaim    # 资源类型:持久卷
metadata:
  name: mysql-pvc       
  namespace: mysql-k3s          # 持久卷命名空间:mysql-k3s
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: local-path  # K3s 默认存储类:local-path

---

# 创建服务资源
apiVersion: v1
kind: Service    # 资源类型:服务
metadata:
  name: mysql-service
  namespace: mysql-k3s          # 服务命名空间:mysql-k3s
spec:
  type: NodePort                # 服务类型:NodePort,可在外部访问
  selector:
    app: mysql                  # 服务对应的选择器:app=mysql
  ports:
  - name: mysql                  # 服务端口名称:mysql-port
    port: 3306                     # 服务端口:3306,与容器端口一致
    targetPort: 3306              # 服务端口:3306,与容器端口一致
    nodePort: 30306              # NodePort 端口:30306,外部访问端口


--- 

# 创建mysql deployment 控制器资源,用于部署mysql的pod资源
apiVersion: apps/v1
kind: Deployment                # 资源类型:Deployment控制器
metadata:
  name: mysql-deployment        # Deployment名称
  namespace: mysql-k3s          # deployment控制器所在命名空间:mysql-k3s
spec:
  replicas: 1                   # 单机部署,副本为1
  selector:
    matchLabels:
      app: mysql                  # 对应的标签选择器:app=mysql
  template:
    metadata:
      labels:
        app: mysql                  # pod对应的标签:app=mysql
    spec:
      volumes:                               # pod级别的持久卷配置设置,定义Pod 可用的存储资源
      - name: mysql-k3s-config                   # 自定义名称,后续在容器中挂载时使用这个名称
        configMap:                          
          name: mysql-configmap                  # 数据来自mysql-configmap配置资源
      - name: mysql-k3s-data                     # 自定义名称,后续在容器中挂载时使用这个名称
        persistentVolumeClaim:  
          claimName: mysql-pvc                   # 数据来自mysql-pvc持久卷资源
      containers:                           # 容器配置设置
      - name: mysql                         # 容器名称:mysql-container
        image: mysql:8.0.20                 # 容器镜像:mysql:8.0.20
        ports:
        - containerPort: 3306               # 容器端口:3306
          name: mysql
        env:                                # 环境变量配置
        - name: MYSQL_DATABASE
          value: "testdb"
        - name: MYSQL_USER
          value: "testuser"
        - name: MYSQL_ROOT_PASSWORD        # 环境变量 MYSQL_ROOT_PASSWORD,用于连接mysql数据库的root用户密码
          valueFrom:                      
            secretKeyRef:
              name: mysql-secret           # 从mysql-secret密钥存储中获取key为mysql-root-password的密码
              key: mysql-root-password         
        - name: MYSQL_PASSWORD             # 环境变量 MYSQL_PASSWORD,用于连接mysql数据库的普通用户密码
          valueFrom:                  
            secretKeyRef:
              name: mysql-secret
              key: mysql-normal-password      
        volumeMounts:                       # 容器级别的卷挂载设置,定义对应容器可用的存储资源
        - name: mysql-k3s-config            # 挂载pod级别的mysql-k3s-configMap配置到容器的/etc/mysql/conf.d路径
          mountPath: /etc/mysql/conf.d
        - name: mysql-k3s-data              # 挂载pod级别的mysql-k3s-data持久卷到容器的/var/lib/mysql路径
          mountPath: /var/lib/mysql         
        resources:                          # 资源配置
          requests:                         # 请求资源配置
            memory: "512Mi"                 
            cpu: "250m"                     
          limits:                           # 限制资源配置
            memory: "1Gi"
            cpu: "500m"
        livenessProbe:                      # 存活探针
          exec:                             # 存活探针命令配置
            command:
            - mysqladmin
            - ping
            - -h
            - localhost
            - -u
            - root
            - -p$(MYSQL_ROOT_PASSWORD)
          initialDelaySeconds: 30           # 初始延迟时间:30秒。MySQL 启动较慢,给予 30 秒初始化时间
          periodSeconds: 20                 # 存活探针周期:20秒
          timeoutSeconds: 10                 # 存活探针超时时间:10秒
        readinessProbe:                     # 就绪探针               
          exec:                             # 就绪探针命令配置
            command:
            - mysqladmin
            - ping
            - -h
            - localhost
            - -u
            - root
            - -p$(MYSQL_ROOT_PASSWORD)
          initialDelaySeconds: 30           # 初始延迟时间:30秒。MySQL 启动较慢,给予 30 秒初始化时间
          periodSeconds: 30                 # 就绪探针周期:30秒
          timeoutSeconds: 10                # 就绪探针超时时间:10秒

部署步骤

需要先在目标服务器中安装好K3s服务。

sh
# 根据YAML文件部署 MySQL
kubectl apply -f mysql-k3s.yaml

# 大致输出示例:
# namespace/mysql-k3s created
# configmap/mysql-configMap created
# secret/mysql-secret created
# persistentvolumeclaim/mysql-pvc created
# service/mysql-service created
# deployment.apps/mysql-deployment created

# 查看所有资源
kubectl get all -n mysql-k3s

# 实时查看 Pod 状态
kubectl get pods -n mysql-k3s -w

# 查看 MySQL 容器日志
kubectl logs -n mysql-k3s -l app=mysql --tail=100

# 查看服务信息
kubectl get svc -n mysql-k3s

测试步骤

先获取节点 IP,用于后续测试。

sh
# 获取节点 IP
kubectl get nodes -o wide

# NAME       STATUS   ROLES     AGE   VERSION        INTERNAL-IP      EXTERNAL-IP   OS-IMAGE  KERNEL-VERSION  CONTAINER-RUNTIME           
# desktop-u7n8te2   Ready    control-plane   8d    v1.35.2+k3s1   172.22.111.149   <none>        Ubuntu 24.04.4 LTS   6.6.87.2-microsoft-standard-WSL2   containerd://2.1.5-k3s1

然后用节点 IP 通过数据库连接工具去连接 MySQL 数据库。 k8s_2026-04-24_174051_448.png

注意:数据库连接中,可以用root用户和testuser用户连接数据库。两者密码都是123456。

图片可以看到YAML文件中的提前配置好的testdb数据库。 k8s_2026-04-24_174308_632.png

常用操作

查看资源使用情况

sh
# 查看 Pod 资源使用
kubectl top pods -n mysql-k3s

# 查看 PVC 状态
kubectl get pvc -n mysql-k3s

重启 MySQL

sh
# 删除 Pod
kubectl delete pod -n mysql-k3s $(kubectl get pods -n mysql-k3s -l app=mysql -o name)

# 查看重启过程
kubectl get pods -n mysql-k3s -w

# 修改配置文件后重新部署
kubectl apply -f mysql-k3s.yaml

备份数据库

sh

# 备份数据库
kubectl exec -it -n mysql-k3s $(kubectl get pods -n mysql-k3s -l app=mysql -o name) -- \
mysqldump -u root -p123456 testdb > testdb_backup.sql

# 下载备份文件
kubectl cp -n mysql-k3s $(kubectl get pods -n mysql-k3s -l app=mysql -o name | cut -d'/' -f2):/testdb_backup.sql ./testdb_backup.sql

删除全部资源

如果后续想要删除全部相关的资源,可以执行以下命令:

sh
# 删除所有资源
kubectl delete -f mysql-k3s.yaml

# 删除命名空间
kubectl delete namespace mysql-k3s

文件中 关于 volumes 和 volumeMounts 的配置问题

再YAML文件中,关于volume 的配置,需要同时定义pod级别的卷配置和容器级别的卷挂载配置。

配置说明如下

  1. 文件中先定义ConfigMap 配置资源,名称是mysql-configmap,用于存储mysql数据库的配置文件。
  2. 文件中再定义PVC 持久卷资源,名称是mysql-pvc,用于存储mysql数据库的数据。
  3. 文件中再定义pod资源,名称是mysql-deployment,用于配置pod中的容器和存储配置。
  • 其中pod级别的存储配置有mysql-k3s-configMap资源和mysql-k3s-data资源。
    • mysql-k3s-configMap存储资源,数据引用自mysql-configmap配置。
    • mysql-k3s-data存储资源,数据引用自mysql-pvc持久卷。
  • 其中容器级别的存储配置mysql-k3s-config 和 mysql-k3s-data。
    • mysql-k3s-config 是引用自pod级别的mysql-k3s-configMap资源。
    • mysql-k3s-data 是引用自pod级别的mysql-k3s-data资源。
配置项层级路径作用范围关系
volumesspec.template.spec.volumespod级别的卷配置,用于在 Pod 内标识一个存储资源。父级
volumeMountsspec.template.spec.containers[].volumeMounts容器级别的卷挂载配置,用于定义对应容器可用的存储资源。子级
注意:`volumes.name` 和 `volumeMounts.name` 都是自定义名称 ,不是固定写法。但是 `volumeMounts.name` 必须与某个 `volumes.name` 完全一致。因为容器级别的卷必须要与pod级别的卷关联到一起,这样才能实现pod的存储资源挂载到容器中。

为什么一个Deployment配置文件中两者必须同时定义?

因为两者分工不同,相互依赖。如果缺少其中任何一个,另一个就会报错。

  • volumes:pod级别的卷配置,用于定义pod中的存储资源。即定义pod中的存储资源有哪些。并且因为pod中可以存在多个容器,所以每个容器都可以挂载不同的卷。
  • volumeMounts:容器级别的卷挂载配置,用于定义对应容器可用的存储资源。即定义将资源挂载到容器中。
mermaid
graph LR
    A[ConfigMap/PVC] --> B[volumes 定义数据来源]
    B --> C[volumeMounts 建立挂载关系]
    C --> D[容器内部文件系统]