Tóm tắt: Ghi /etc/rancher/k3s/config.yaml trước, rồi curl -sfL https://get.k3s.io | sh -. k3s là một binary chứa control plane, containerd, Flannel, CoreDNS, Traefik (ingress), ServiceLB (LoadBalancer bằng host port), local-path-provisioner và metrics-server. Kubeconfig ở /etc/rancher/k3s/k3s.yaml. Gỡ bằng /usr/local/bin/k3s-uninstall.sh.
Luồng hoạt động
flowchart LR C["Client :80/:443"] --> SLB["ServiceLB (svclb, host port)"] SLB --> T["Traefik (kube-system)"] T -->|"Ingress rule"| S["Service app"] S --> P["Pod"] P --> PVC["PVC local-path"] PVC --> D["/var/lib/rancher/k3s/storage"]
Cấu hình
Cài đặt
write-kubeconfig-mode: "0640"
tls-san:
- k3s.example.com # tên/IP sẽ dùng để gọi API từ máy khác
- 203.0.113.10
node-name: lab-01
# disable: # bỏ comment nếu muốn tự cài ingress / LB khác
# - traefik
# - servicelbsudo mkdir -p /etc/rancher/k3s # rồi tạo config.yaml như trên
curl -sfL https://get.k3s.io | sh -
# Ghim phiên bản / kênh (nên làm cho môi trường cần lặp lại được)
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.31.4+k3s1" sh -
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=stable sh -
sudo systemctl status k3s
sudo k3s kubectl get nodes -o wide
sudo k3s check-config # kiểm tra kernel/cgroup khi k3s không lênTham số trong config.yaml tương ứng flag của k3s server (vd disable: [traefik] ≡ --disable=traefik). Đổi config thì sudo systemctl restart k3s.
Kubeconfig
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config && sudo chown "$USER": ~/.kube/config
chmod 600 ~/.kube/config
kubectl get pods -A
# Dùng từ máy khác: đổi server 127.0.0.1 thành tên đã có trong tls-san
sed -i 's#https://127.0.0.1:6443#https://k3s.example.com:6443#' ~/.kube/configk3s.yaml chứa client cert quyền cluster-admin. Đừng write-kubeconfig-mode: "0644" trên máy nhiều user.
Traefik mặc định
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
namespace: app
spec:
ingressClassName: traefik
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app
port:
number: 80Traefik được cài bằng HelmChart trong kube-system. Không sửa file trong /var/lib/rancher/k3s/server/manifests/traefik.yaml (k3s ghi đè khi khởi động); tuỳ biến bằng HelmChartConfig:
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
logs:
access:
enabled: trueTLS tự động cho Ingress: cài cert-manager như ở ingress-nginx + cert-manager, đổi ingressClassName/class của solver thành traefik.
Storage local-path
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
namespace: app
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: local-path
resources:
requests:
storage: 5GiStorageClass local-path là mặc định, tạo thư mục trên node dưới /var/lib/rancher/k3s/storage. Dung lượng 5Gi không được giới hạn thật; dữ liệu gắn với node, không có replication. Binding mode WaitForFirstConsumer: PVC Pending tới khi có Pod dùng nó là bình thường.
Thông tin hữu ích
| Mục | Giá trị / lệnh |
|---|---|
| Log | journalctl -u k3s -f |
| Container runtime | sudo k3s crictl ps / sudo k3s crictl images |
| Token để join agent | /var/lib/rancher/k3s/server/node-token |
| Join thêm node agent | curl -sfL https://get.k3s.io | K3S_URL=https://k3s.example.com:6443 K3S_TOKEN=<token> sh - |
| Pod CIDR / Service CIDR mặc định | 10.42.0.0/16 / 10.43.0.0/16 |
| Port cần mở | TCP 6443 (API), TCP 10250 (kubelet, giữa các node), UDP 8472 (Flannel VXLAN, giữa các node) |
| Manifest tự apply khi khởi động | Thả file YAML vào /var/lib/rancher/k3s/server/manifests/ |
| Snapshot datastore | sudo k3s etcd-snapshot save (chỉ khi chạy embedded etcd với cluster-init: true; mặc định single node dùng SQLite tại /var/lib/rancher/k3s/server/db/) |
Gỡ bỏ
/usr/local/bin/k3s-killall.sh # dừng mọi container, xoá network interface, giữ dữ liệu
/usr/local/bin/k3s-uninstall.sh # gỡ server: xoá binary, service, /etc/rancher/k3s, /var/lib/rancher/k3s
/usr/local/bin/k3s-agent-uninstall.sh # trên node agentk3s-uninstall.sh xoá luôn /var/lib/rancher/k3s, bao gồm dữ liệu local-path PVC. Backup trước.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách xử lý |
|---|---|---|
kubectl báo permission denied đọc /etc/rancher/k3s/k3s.yaml |
File mode 0600 mặc định | Copy sang ~/.kube/config như trên, hoặc chạy sudo k3s kubectl |
Từ máy khác báo x509: certificate is valid for 127.0.0.1, ... not k3s.example.com |
Tên/IP chưa có trong tls-san |
Thêm vào tls-san, restart k3s (cert được sinh lại) |
Service LoadBalancer EXTERNAL-IP <pending> |
Port 80/443 trên host đã bị nginx/apache chiếm, hoặc đã disable servicelb | ss -ltnp | grep -E ':80|:443', kubectl get pods -n kube-system | grep svclb |
| Pod không gọi được DNS/Service, node khác không thông | firewalld/ufw chặn traffic Pod/Service CIDR hoặc VXLAN | Cho phép 10.42.0.0/16, 10.43.0.0/16 và UDP 8472, hoặc tắt firewalld theo khuyến nghị của k3s |
PVC mãi Pending |
Chưa có Pod dùng (WaitForFirstConsumer) | Tạo Pod/Deployment mount PVC |
Sửa traefik.yaml trong thư mục manifests bị mất |
k3s ghi đè file packaged khi khởi động | Dùng HelmChartConfig |
k3s không start, log báo cgroup |
Kernel/cgroup thiếu (Raspberry Pi cần cgroup_memory=1 cgroup_enable=memory) |
k3s check-config |