[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-namespacesPod容器相关常用命令
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=0Service服务相关常用命令(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-serviceIngress 域名路由
Ingress = 外网域名、HTTP 路由、网关入口
sh
# 查看所有域名路由
kubectl get ingress
# 查看指定ingress详情
kubectl describe ingress ingress名称ConfigMap 配置文件
ConfigMap = 你存储的配置信息,如数据库配置、应用配置等。相当于配置中心
sh
# 查看配置文件ConfigMap
kubectl get configmaps
# 查看密钥Secret(数据库密码等敏感信息)
kubectl get secretsYAML 部署 / 删除(标准云原生部署方式)
YAML = 你定义的资源配置文件,文件中定义Deployment、Service、ConfigMap等资源的使用方式。
sh
# 根据yaml文件创建/更新资源(若资源不存在则创建,若存在则更新)
kubectl apply --filename springboot-deploy.yaml
# 根据yaml文件删除所有资源
kubectl delete --filename springboot-deploy.yamlK3s 内置容器镜像命令(全称 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 数据库单机(有状态应用服务)
核心说明
- MySQL 是有状态应用 → 必须用 StatefulSet 部署(不能用 Deployment)
- MySQL一主二从集群:
- mysql-0 主节点(写)
- mysql-1 从节点(读)
- mysql-2 从节点(读)
- 数据持久化:K3s 自动创建 PVC + PV,每个节点都有一个本地存储目录,用于存储 MySQL 数据。
- 服务:
- 主节点写入服务: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 数据库。 
注意:数据库连接中,可以用root用户和testuser用户连接数据库。两者密码都是123456。
图片可以看到YAML文件中的提前配置好的testdb数据库。 
常用操作
查看资源使用情况
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级别的卷配置和容器级别的卷挂载配置。
配置说明如下
- 文件中先定义ConfigMap 配置资源,名称是mysql-configmap,用于存储mysql数据库的配置文件。
- 文件中再定义PVC 持久卷资源,名称是mysql-pvc,用于存储mysql数据库的数据。
- 文件中再定义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资源。
| 配置项 | 层级路径 | 作用范围 | 关系 |
|---|---|---|---|
| volumes | spec.template.spec.volumes | pod级别的卷配置,用于在 Pod 内标识一个存储资源。 | 父级 |
| volumeMounts | spec.template.spec.containers[].volumeMounts | 容器级别的卷挂载配置,用于定义对应容器可用的存储资源。 | 子级 |
为什么一个Deployment配置文件中两者必须同时定义?
因为两者分工不同,相互依赖。如果缺少其中任何一个,另一个就会报错。
- volumes:pod级别的卷配置,用于定义pod中的存储资源。即定义pod中的存储资源有哪些。并且因为pod中可以存在多个容器,所以每个容器都可以挂载不同的卷。
- volumeMounts:容器级别的卷挂载配置,用于定义对应容器可用的存储资源。即定义将资源挂载到容器中。
mermaid
graph LR
A[ConfigMap/PVC] --> B[volumes 定义数据来源]
B --> C[volumeMounts 建立挂载关系]
C --> D[容器内部文件系统]