之前写过一篇文章介绍了如何使用 k3sup 来快速安装 k3s 集群,虽然之前已经走过一遍教程,但是实际上还是没有充分利用起来,这一次就从学习的角度再次从头开始利用 K3s 构建一个生产级别的 K8s 集群。

现在我有三台 Ubuntu 24 的 VPS,想要在其上,构建一个 k3s/rancher 的架构,并且在其中部署一个高可用服务,该服务有一个 MySQL 数据库,有一个 app service ,暴露 8080 端口,可以让用户通过域名来访问该服务,并且该服务能够水平扩展。

硬件和网络配置

  • 假设三台机器 IP, master
    • master1.einverne.info
    • master2.einverne.info
    • master3.einverne.info
  • Agent node
    • agent1

在 Master1 上执行如下命令

curl -sfL https://get.k3s.io | sh -s - server \
  --cluster-init \
  --tls-san master1.einverne.info \
  --tls-san master2.einverne.info \
  --tls-san master3.einverne.info \
  --node-taint CriticalAddonsOnly=true:NoExecute

说明

  • --tls-san 参数用于在 k3s 服务器 TLS 证书中添加额外的主机名或 IP 地址作为 Subject Alternative Name(SAN,主题备用名称)。
  • --node-taint CriticalAddonsOnly=true:NoExecute 用来设置节点污点(Node Taint),污点是 K8s 中应用于节点的一种属性,使节点能够排斥特定类型的 Pod,污点是让节点拒绝某些 Pod 调度,Node Affinity 则是相反,吸引 Pod 到特定节点
    • CriticalAddonsOnly 表示只允许关键组件运行
    • NoExecute 效果,不仅阻止新 Pod 调度到该节点,还会驱逐已经在节点上运行但不能容忍该污点的 Pod

等待安装完成,然后获取 Token

sudo cat /var/lib/rancher/k3s/server/node-token

复制输出的 Token,然后在其他 master 节点上安装。

在 Master2 和 Master3 中使用。

export TOKEN=your-token

在 Master2 和 Master3 上执行,安装 Master 节点

# TOKEN为上一步获取的token
curl -sfL https://get.k3s.io | K3S_TOKEN=$TOKEN sh -s - server \
  --server https://master1.einverne.info:6443 \
  --tls-san master1.einverne.info \
  --tls-san master2.einverne.info \
  --tls-san master3.einverne.info \
  --node-taint CriticalAddonsOnly=true:NoExecute

验证集群状态,在任意一个 master 节点中执行

sudo kubectl get nodes

三个节点都处于 Ready 状态,并且具有 control-plane 角色。

Agent Node

在 Agent 节点上执行

export TOKEN=your-token
curl -sfL https://get.k3s.io | K3S_URL=https://master1.einverne.info:6443 K3S_TOKEN=$TOKEN sh -

在 Master 节点上验证节点状态

sudo kubectl get nodes

配置 kubectl 访问

为了方便在本地管理集群,可以在本地配置 kubectl

从 master 节点复制 kubeconfig

# 在 master1 上执行
mkdir ~/.kube/
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER ~/.kube/config
sudo chmod 600 ~/.kube/config
export KUBECONFIG=~/.kube/config

建议将  export KUBECONFIG=~/.kube/config  写入你的  ~/.bashrc  或  ~/.bash_profile,这样每次登录都能自动生效。

将输出的内容保存到本地的 ~/.kube/config 文件中,并修改 server 地址为任一节点 IP

server: https://master1.einverne.info:6443

另外如果要让 kubectl 自动补全,可以执行

source <(kubectl completion zsh)

安装 Helm

Ubuntu 下

curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

其他平台

部署 Rancher 管理平台

[[Rancher]] 是一个强大的 Kubernetes 管理平台,使用 Helm 来部署。

安装 cert-manager

首先安装 [[cert-manager]],用于处理 SSL 证书。

# 创建命名空间
kubectl create namespace cert-manager

# 添加Helm仓库
helm repo add jetstack https://charts.jetstack.io
helm repo update

# 安装cert-manager CRDs
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.0/cert-manager.crds.yaml

# 安装cert-manager
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v1.17.0

验证 cert-manager 部署

kubectl -n cert-manager rollout status deploy/cert-manager
kubectl -n cert-manager rollout status deploy/cert-manager-webhook

返回 success 表示成功。

安装 Rancher

注意将下面命令中的 hostname 替换成自己的 hostname,配置 DNS,将rancher.example.com指向任一节点 IP,或者配置负载均衡器指向所有节点,然后将密码设置成自己的密码。

# 创建命名空间
kubectl create namespace cattle-system

# 添加Helm仓库
# https://ranchermanager.docs.rancher.com/getting-started/installation-and-upgrade/install-upgrade-on-a-kubernetes-cluster#kubernetes-cluster
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
helm repo update

# 安装 Rancher
export PASSWORD=your-complex-password
# 替换rancher.example.com为你的实际域名
helm install rancher rancher-latest/rancher \
  --namespace cattle-system \
  --set hostname=rancher.example.com \
  --set bootstrapPassword=$PASSWORD \
  --set ingress.tls.source=letsEncrypt \
  --set letsEncrypt.email=admin@einverne.info \
  --set letsEncrypt.ingress.class=traefik

验证 Rancher 是否正常运行

kubectl -n cattle-system rollout status deploy/rancher

当所有 Pod 处于 Running 状态,可以通过浏览器访问。

K3s v1.21+与 Rancher 存在兼容性问题,Kubernetes v1.21+版本无法降级时的临时方案可以减少 Rancher 副本数量

kubectl scale deploy rancher -n cattle-system --replicas=1

k8s Pod 典型的异常及排查

状态 排查和建议
Pending kubectl describe pod <pod> -n <namespace> 检查调度和资源分配问题
CrashLoopBackOff kubectl logs -f <pod> -n <ns> 查看容器日志
ImagePullBackOff kubectl describe pod <pod> -n <ns> 检查镜像拉取错误
Evicted kubectl describe node 检查节点磁盘,内存等资源使用情况
  • [[K3s]]
  • [[k3sup]]
  • [[minikube]]