Skip to content

K3s

k3s 是什么?适合什么场景

  • k3s:轻量版 Kubernetes(K8s),把很多可选组件做成可插拔、默认更省资源、安装极简。
  • 适合:
    • 单机/小集群(1~几十节点)快速搭建 K8s
    • CI / 测试环境 / 内网业务部署
    • WSL2 / 轻量虚拟机上跑 K8s
  • 默认特点:
    • 内置一个简单的 ServiceLB(klipper-lb)负责 LoadBalancer
    • 默认使用 containerd 作为运行时
    • 默认集成网络插件(通常是 flannel)
    • 默认使用 traefik 作为 Ingress Controller(可选关掉)
    • 默认数据存储:单节点用 sqlite;多节点推荐外接 DB 或使用 k3s 内置的 etcd

安装前准备

关闭 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 wide

k3s 里的“常见组件/功能解释”

  • 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 -A

k3s 服务管理

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