Files
Deploy-Laboratory/docs/01-01-k3s-控制节点含traefik.md
2026-03-29 09:08:01 +08:00

197 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 01-01-k3s-控制节点含traefik
## TL;DR
- **自动化验收**:在控制端(如 `ylc65`)执行 `./ansible/bin/verify.sh run 01-01`
- **手工安装**:控制节点执行 `curl -sfL https://get.k3s.io | sh -s - server --data-dir=/storage`(或默认路径)
- **成功判据**node 为 `Ready``kube-system``coredns` / `traefik` Deployment 存在Traefik 入口可响应(常见为 `404`
- **失败排障**:见本文「排障」小节(事件/Pod/日志/磁盘压力)
> 说明:本篇聚焦 **单控制节点安装与基础验收**。若要一键自动化安装多节点集群,见 `01-05-节点初始化-ansible-实践.md`。
## 契约与真源
- **安装命令备忘**`ansible/files/01-01/k3s-server-install.example.sh`(与下文 curl 片段一致;非 K8s 清单)。
- **自动**`./ansible/bin/verify.sh run 01-01`(专用 kubectl 断言;与手工安装共用 `ansible/files/01-01/` 索引)。
## 前置条件
- 控制节点系统已完成基础网络配置
- 可使用 `sudo`,并可访问公网或本地镜像源
- 节点时间已同步NTP
- **方案二(数据盘)**:若使用自定义存储目录,需先将**独立数据盘**挂载到 `/storage`(本仓库验证环境为 **约 10G 系统盘 + 约 32G 数据盘**,四节点同构;**控制节点也必须**有独立数据盘,否则 Longhorn / containerd 与系统争用根分区,易出现 DiskPressure
## 存储方案说明
K3s 默认将数据(含 local-path 卷)放在 `--data-dir` 下。系统盘较小时,应将数据目录放到**单独挂载**的数据盘(如 `/storage`),避免占满系统盘。
| 方案 | 数据目录 | 适用场景 |
|------|----------|----------|
| **方案一(默认)** | `/var/lib/rancher/k3s` | 系统盘空间充足 |
| **方案二(数据盘)** | `/storage` | 系统盘小,数据盘单独挂载在 `/storage` |
> 自定义 `/storage` 仅解决单节点内系统盘/数据盘分离;节点或数据盘重建后数据不会自动迁移,高可用与备份见 `01-07`、`06-03`。
## 操作步骤
1. 在控制节点安装 K3s Server默认包含 Traefik
2. 等待核心组件进入 Running
3. 记录节点 IP供后续工作节点加入和入口验证
### 方案一:默认数据目录
```bash
curl -sfL https://get.k3s.io | sh -
```
### 方案二:数据盘(自定义数据目录)
确保数据盘已挂载到 `/storage` 后执行:
```bash
curl -sfL https://get.k3s.io | sh -s - server --data-dir=/storage
```
- 使用方案二时token 路径为 `/storage/server/token`(供 01-02 工作节点加入与 01-07 HA 使用)。
## 配置 kubectl供当前用户使用
安装后 K3s 生成的 kubeconfig 在 `/etc/rancher/k3s/k3s.yaml`,默认仅 root 可读。若希望**当前用户**在本机直接执行 `kubectl`(无需 sudo可任选其一
**方式一:复制到用户目录并设 KUBECONFIG**
```bash
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
chmod 600 ~/.kube/config
export KUBECONFIG=~/.kube/config
# 若希望每次登录自动生效,可把下面这一行(整行,不要带 #)写入 ~/.bashrc 或 ~/.profile
# export KUBECONFIG=~/.kube/config
# 写入示例: echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
```
**方式二:仅用 KUBECONFIG 指向原路径(需 root 放宽该文件权限)**
```bash
sudo chmod 644 /etc/rancher/k3s/k3s.yaml
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
```
之后即可用 `kubectl get nodes` 等命令做验证。
## 其他设备使用 kubectl 控制集群
从**笔记本、跳板机等非控制节点**用 kubectl 管理集群时,需要:① 在该设备上**安装 kubectl**;② 有一份 kubeconfig且其中的 API 地址指向控制节点(不能是 127.0.0.1)。
**0. 在其他设备上安装 kubectl**
在要执行 `kubectl` 的那台机器上安装 kubectl仅需一次
- **Linux通用**:从官方 release 下载与集群版本相近的二进制(建议与 K3s 自带的 Kubernetes 版本一致),放入 PATH
```bash
# 以 v1.28 为例,按实际 K3s 的 Kubernetes 版本选择
curl -LO https://dl.k8s.io/release/v1.28.0/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
kubectl version --client
```
- **Debian/Ubuntu**:可用包管理器安装(版本可能略旧):
```bash
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core/stable/deb/Release.key | sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core/stable/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update && sudo apt-get install -y kubectl
```
- **macOS**`brew install kubectl`(或从 [Kubernetes 官方文档](https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl/) 选择其他方式)。
- **Windows**:可用 `winget install Kubernetes.kubectl` 或从 [官方文档](https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/) 下载二进制并加入 PATH。
**1. 在控制节点上准备可外连的 kubeconfig**
在控制节点执行(将 `控制节点IP或主机名` 改为实际地址,如 `192.168.2.61``ylc61`
```bash
sudo sed 's/127.0.0.1/控制节点IP或域名/' /etc/rancher/k3s/k3s.yaml > /tmp/k3s-for-remote.yaml
sudo chmod 644 /tmp/k3s-for-remote.yaml
```
**2. 拷贝到其他设备**
在**其他设备**上执行(需能 SSH 到控制节点,或通过 U 盘/SCP 等方式拿到文件):
```bash
# 示例:从控制节点拉取到本机
scp 用户@控制节点IP或域名:/tmp/k3s-for-remote.yaml ~/.kube/config
# 若本机尚无 ~/.kube 目录
mkdir -p ~/.kube
# 再执行上述 scp并设置权限
chmod 600 ~/.kube/config
```
**3. 本机使用**
```bash
export KUBECONFIG=~/.kube/config
# 可写入 ~/.bashrc / ~/.zshrc
kubectl get nodes
```
**注意**:其他设备需能访问控制节点的 **6443** 端口K3s API。若中间有防火墙需放行控制节点 6443若用域名需能解析到控制节点 IP。
## 验证命令
若已按上节配置当前用户的 kubectl可直接执行 `kubectl`;否则使用 `sudo kubectl`
```bash
kubectl get nodes -o wide
kubectl -n kube-system get pods -o wide
kubectl -n kube-system get deploy,svc traefik -o wide
curl -I --max-time 3 http://127.0.0.1:80
```
## 预期
- `kubectl get nodes` 显示控制节点为 `Ready`
- `kube-system` 命名空间核心组件正常运行
- Traefik 服务已创建并可响应(常见为 `404`,表示入口已通)
## 清理
本篇为安装类文档:手工安装后一般 **不卸载 K3s**,而是继续后续实验。若你仅为排障临时验收,可在运行 `./ansible/bin/verify.sh run 01-01` 时设 `VERIFY_TEARDOWN=0` 保留现场(本篇用例默认不做破坏性清理)。
## 排障
- **节点不 Ready / DiskPressure**:优先确认 `/storage` 为独立挂载点(见 `docs/00-02-部署环境说明.md`),再看 `df -h``kubectl describe node <name>` 事件。
- **Traefik 不就绪**`kubectl -n kube-system get pods -o wide`;必要时 `kubectl -n kube-system logs deploy/traefik --tail=200`
- **CoreDNS 解析异常(影响后续 ACME**见下节「CoreDNS 上游 DNS」。
## CoreDNS 上游 DNSACME 用)
若后续要按 `03-02` / `03-03` 配置 ACMELet's Encrypt需确保集群内能解析 `acme-v02.api.letsencrypt.org`。宿主机若使用 **IPv6 DNS**`/etc/resolv.conf``240e:...`K3s Pod 网络仅 IPv4 时无法访问ACME 会报 `server misbehaving``network is unreachable`
**手动修复**(按需执行):
```bash
kubectl -n kube-system edit configmap coredns
```
将 Corefile 中的 `forward . /etc/resolv.conf` 改为:
```txt
forward . 223.5.5.5 8.8.8.8
```
然后重启 CoreDNS`kubectl -n kube-system rollout restart deploy/coredns`
> 若使用 Ansible 一键安装(`01-05`playbook 已自动完成此配置,无需手动修改。
## 下一步
- 继续 `01-02-k3s-工作节点.md`