K3s
k3s 是什么?适合什么场景
- k3s:轻量版 Kubernetes(K8s),把很多可选组件做成可插拔、默认更省资源、安装极简。
- 适合:
- 单机/小集群(1~几十节点)快速搭建 K8s
- CI / 测试环境 / 内网业务部署
- WSL2 / 轻量虚拟机上跑 K8s
- 默认特点:
- 内置一个简单的 ServiceLB(klipper-lb)负责
LoadBalancer - 默认使用
containerd作为运行时 - 默认集成网络插件(通常是 flannel)
- 默认使用
traefik作为 Ingress Controller(可选关掉) - 默认数据存储:单节点用 sqlite;多节点推荐外接 DB 或使用 k3s 内置的 etcd
- 内置一个简单的 ServiceLB(klipper-lb)负责
安装前准备
关闭 swap
shell
sudo swapoff -a放行端口(常见)
- 6443(Kubernetes API Server)
- 8472/UDP(flannel VXLAN,若使用 flannel)
- 10250(kubelet)
- 2379-2380(etcd,仅 HA/etcd 时)
- 30000-32767(NodePort)
单机安装
- 一条命令安装(官方脚本方式):
shell
curl -sfL https://get.k3s.io | sh -安装完成后:
- 服务名:
k3s - kubeconfig:
/etc/rancher/k3s/k3s.yaml - kubectl:
k3s kubectl(k3s 自带 kubectl)
- 服务名:
检查状态:
shell
sudo systemctl status k3s
sudo k3s kubectl get nodes -o wide
sudo k3s kubectl get pods -A- 把 kubectl 用起来(不想每次打 sudo):
shell
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
kubectl get nodes如果你的集群 API 地址是 127.0.0.1,但你想从别的机器访问,需要改 kubeconfig 里的 server 地址为真实 IP。
常见“安装参数/配置”方式
方式 A:安装时通过环境变量传参
shell
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable traefik" sh -方式 B:用配置文件(更推荐)
配置文件路径:
/etc/rancher/k3s/config.yaml
示例(常用):
yaml
write-kubeconfig-mode: '0644'
# 如果你不想要默认 Ingress(traefik)
disable:
- traefik
# 如果你不想要默认 ServiceLB(klipper-lb)
# disable:
# - servicelb
# 指定 node 名称(可选)
# node-name: "k3s-master"
# 指定 flannel 网段(可选)
# cluster-cidr: "10.42.0.0/16"
# service-cidr: "10.43.0.0/16"- 改完配置后重启:
shell
sudo systemctl restart k3s多节点集群(Server + Agent)
先装 Server(主节点)
- 主节点安装完后拿 token:
shell
sudo cat /var/lib/rancher/k3s/server/node-token再装 Agent(工作节点)
- 在工作节点执行:
shell
curl -sfL https://get.k3s.io | K3S_URL="https://<主节点IP>:6443" K3S_TOKEN="<token>" sh -- 检查主节点看到 worker 加入:
shell
kubectl get nodes -o widek3s 里的“常见组件/功能解释”
- Pod / Deployment / Service:K8s 最核心对象
- CoreDNS:集群内 DNS
- Metrics-server(可选):
kubectl top需要它 - Ingress:对外 HTTP 路由(k3s 默认 traefik)
- ServiceLB(klipper-lb):让
Service type=LoadBalancer在裸机也能工作 - CNI(flannel):Pod 网络
- StorageClass(local-path-provisioner):默认提供本地路径动态 PV(适合单机/测试)
常用命令速查(k3s/kubectl)
基础
shell
kubectl get nodes
kubectl get pods -A
kubectl get svc -A
kubectl get deploy -A
kubectl get ingress -A查看详情 / 排错
shell
kubectl describe pod <pod> -n <ns>
kubectl logs -f <pod> -n <ns>
kubectl logs -f deploy/<deploy> -n <ns>
kubectl exec -it <pod> -n <ns> -- sh
kubectl get events -A --sort-by=.metadata.creationTimestamp应用部署/删除
shell
kubectl apply -f app.yaml
kubectl delete -f app.yaml
kubectl rollout status deploy/<name> -n <ns>
kubectl rollout undo deploy/<name> -n <ns>资源占用(需要 metrics-server)
shell
kubectl top nodes
kubectl top pods -Ak3s 服务管理
shell
sudo systemctl restart k3s
sudo systemctl stop k3s
sudo journalctl -u k3s -f卸载
shell
sudo /usr/local/bin/k3s-uninstall.sh
# agent:
# sudo /usr/local/bin/k3s-agent-uninstall.sh安装 Kubernetes Dashboard
Dashboard 是官方 Web UI,但在生产上通常会更推荐 Lens / Rancher / OpenLens 等。
安装 Dashboard
- 直接上官方推荐的部署(会装到
kubernetes-dashboard命名空间):
shell
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml- 查看:
shell
kubectl get pods -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard创建登录账号(ServiceAccount + ClusterRoleBinding)
- 创建
admin-user.yaml:
shell
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard- 应用:
shell
kubectl apply -f admin-user.yaml- 生成登录 token:
shell
kubectl -n kubernetes-dashboard create token admin-user访问 Dashboard(本地端口转发)
- 最简单安全(不暴露公网):
shell
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard 8443:443