主题
日常运维
常用别名速查
部署完成后,以下别名已写入 /root/.bashrc:
bash
kpa = kubectl get pod -A -o wide # 查看所有 Pod
kp = kubectl get pod -o wide # 查看当前 namespace Pod
kci = k3s ctr image import # 导入镜像
k = kubectl # 缩写
ke = kubectl exec -it # 进入容器
kd = kubectl describe # 查看详情进入运维容器
bash
# 进入 ops 容器(所有 kubectl/helm 操作在此执行)
docker exec -it yidun-ops bash
cd /deploy/k3s日常巡检
早晨巡检清单
bash
# 1. 节点状态
kubectl get node
# 2. 异常 Pod(非 Running/Completed 的)
kubectl get pod -A | grep -v -E "Running|Completed|STATUS"
# 3. 最近异常事件
kubectl get events -A --sort-by='.lastTimestamp' \
| grep -E "Warning|Error" | tail -20
# 4. 磁盘使用
df -h /data # K3s 数据盘
# 5. 中间件状态
kubectl get pod -n yidun-infra
kubectl get pod -n tidb关键服务可用性检查
bash
# Elasticsearch
curl -s http://localhost:30092/_cluster/health | jq .status
# MinIO
curl -s http://localhost:31311/minio/health/live
# Kafka(检查 Pod 状态)
kubectl get pod -n yidun-infra -l app.kubernetes.io/name=kafka
# MySQL
kubectl exec -it mysql-yidun-0 -n tidb -- \
mysql -u admin -p'eHSkDv7c77*j' -e "SELECT 1" 2>/dev/null应用升级
单模块升级
bash
# 1. 更新 values.yaml 中的镜像版本
vim k3s-yidun-apps/yidun-text/values.yaml
# 2. 执行升级
cd k3s-yidun-apps/yidun-text
bash install.sh upgrade
# 3. 查看滚动更新进度
kubectl rollout status deployment -n yidun-text
# 4. 验证
kubectl get pod -n yidun-text滚动升级所有平台模块
bash
cd k3s-yidun-apps/yidun-platform/01-app
bash install-all.sh upgrade回滚
bash
# 回滚到上一版本
helm rollback yidun-text -n yidun-text
# 查看历史版本
helm history yidun-text -n yidun-text扩容
增加 Worker 节点
- 确保新节点满足系统要求
- 配置 SSH 免密
- 在
auto-docker.conf的k8s_worker_ip中添加新节点 IP - 重新运行 bootstrap 初始化:
bash
# 更新 Ansible 配置
cd bootstrap
ansible-playbook -i inventory/dev/hosts.ini nodes.yml -b \
--limit <新节点IP>
# 执行 K3s 安装(仅针对新节点)
cd k3s_ansible
ansible-playbook -i inventory/dev/host.ini cluster.yml -b \
--limit <新节点主机名>为新节点打标签
bash
# 如果新节点需要承载某些中间件
kubectl label node <new-node> kafka=true
kubectl label node <new-node> elasticsearch=true镜像管理
导入新镜像
bash
# 方法 1:通过 K3s ctr 直接导入(无需 registry)
k3s ctr image import <image.tar>
# 方法 2:通过 Docker + Registry
docker load -i <image.tar>
docker tag <old-name> private-registry.yidun.internal/<repo>/<name>:<tag>
docker push private-registry.yidun.internal/<repo>/<name>:<tag>清理无用镜像
bash
# 清理 K3s 未使用镜像
k3s crictl rmi --prune
# 查看所有镜像
k3s crictl images
# 清理 Docker 镜像(宿主机)
docker image prune -a --filter "until=720h"证书与密钥
K3s 证书续期
K3s 证书默认 1 年有效期,需要提前续期:
bash
# 查看证书到期时间
openssl x509 -in /data/k3s/server/tls/serving-kube-apiserver.crt \
-noout -enddate
# K3s 证书自动轮转(K3s 1.21.1+ 支持)
systemctl restart k3s # 每次重启时自动检查并续期数据备份
MySQL 定期备份
bash
# 创建备份脚本 /etc/cron.daily/mysql-backup
#!/bin/bash
BACKUP_DIR=/data/backups/mysql
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
kubectl exec mysql-yidun-0 -n tidb -- \
mysqldump -u admin -p'eHSkDv7c77*j' \
--all-databases --single-transaction \
> $BACKUP_DIR/all-databases-$DATE.sql
# 保留最近 7 天
find $BACKUP_DIR -name "*.sql" -mtime +7 -deleteElasticsearch 快照
bash
# 注册 snapshot repository(使用 MinIO 作为后端)
curl -X PUT "http://localhost:30092/_snapshot/backup_repo" \
-H "Content-Type: application/json" \
-d '{
"type": "s3",
"settings": {
"endpoint": "http://<minio-ip>:31311",
"bucket": "es-snapshots",
"access_key": "admin",
"secret_key": "Minio@2020"
}
}'
# 创建快照
curl -X PUT "http://localhost:30092/_snapshot/backup_repo/snapshot_$(date +%Y%m%d)"K3s 集群维护
节点维护模式
bash
# 驱逐节点上的 Pod(维护前执行)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 维护完成后恢复调度
kubectl uncordon <node-name>查看集群组件状态
bash
# 查看控制面组件
kubectl get cs # componentstatuses
# 查看 etcd(HA 模式)
kubectl exec -n kube-system etcd-<master-node> -- \
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/data/k3s/server/tls/etcd/server-ca.crt \
--cert=/data/k3s/server/tls/etcd/server-client.crt \
--key=/data/k3s/server/tls/etcd/server-client.key \
member list安全操作
更新 registry 密码
bash
# 更新 Docker registry 认证
docker login private-registry.yidun.internal -u yidun -p<new-password>
# 同步更新各节点的 registry 配置
# K3s 的 registry 配置在:/etc/rancher/k3s/registries.yaml审计操作日志
bash
# 查看 K8s 审计日志(如果启用)
kubectl logs -n kube-system kube-apiserver-* | grep audit
# 查看近期操作
kubectl get events -A --sort-by='.lastTimestamp' | tail -50