打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

如何搭建 Kubernetes 一站式平台

来自md5.pw
Koud Wind留言 | 贡献2026年4月12日 (日) 12:40的版本

1. 什么是 Kubernetes / k8s

k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 部署应用/调度资源/维护副本/处理故障/对外暴露服务等等...

对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性

但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显

而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的

为了易读性, 在这里会将 Kubernetes 简称为 k8s

2. 环境说明

运行 kubeadm 集群建议 control plane 节点至少具备 2 Core CPU2 GiB 运存, 推荐购买搬瓦工的 ECOMMERCE SLA 套餐

  • 操作系统以 Debian13 为例
  • 主机数量 1 台
  • 使用 root 用户
  • 主机承担 control plane 和 workload 调度
  • k8s pod网段为 10.10.0.0/16 , service网段为 192.168.0.0/16
  • 使用 Headlamp 管理k8s pods

3. 前置准备

3.1 加载模块并启用转发

cat <<'EOF' | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

cat <<'EOF' | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl --system

3.2 配置 hosts

tee -a /etc/hosts > /dev/null <<'EOF'
127.0.0.1 k8s-master
EOF

3.3 关闭 swap (可选)

swapoff -a
sed -ri '/\sswap\s/s/^/#/' /etc/fstab

4. 安装 containerd

更新软件源并安装 containerd 与 其他核心组件

apt update
apt install -y containerd apt-transport-https ca-certificates curl gpg

生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 bin_dir

mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml > /dev/null
sed -i 's#bin_dir = "/usr/lib/cni"#bin_dir = "/opt/cni/bin"#' /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

重启并设置自启

systemctl daemon-reload
systemctl restart containerd
systemctl enable containerd
systemctl status containerd

5. 安装 kubeadm kubelet kubectl

mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
systemctl enable --now kubelet

检查

kubeadm version
kubectl version --client
kubelet --version

6. 初始化单节点 k8s 集群

新建一个初始化配置

mkdir -p /main/k8s
nano /main/k8s/kubeadm-config.yaml

粘贴并自行修改配置后进行保存

apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
nodeRegistration:
  name: master
  criSocket: "unix:///run/containerd/containerd.sock"
localAPIEndpoint:
  advertiseAddress: <你的公网主机IP>
  bindPort: 6443

---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.35.0
networking:
  podSubnet: 10.10.0.0/16
  serviceSubnet: 192.168.0.0/16
  dnsDomain: cluster.local

# 若开启了Swap需要解除此注释!
#---
#apiVersion: kubelet.config.k8s.io/v1beta1
#kind: KubeletConfiguration
#cgroupDriver: systemd
#failSwapOn: false
#memorySwap:
#  swapBehavior: LimitedSwap

开始初始化

kubeadm init --config /main/k8s/kubeadm-config.yaml

初始化完成后配置 kubectl

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown "$(id -u)":"$(id -g)" $HOME/.kube/config

检查

kubectl get nodes
kubectl get pods -A

这时 master 大概率是 NotReady 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 Running 状态

7. 安装 Helm并设置补全

安装 Helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4
chmod 700 get_helm.sh
./get_helm.sh
helm version
命令补全:
  • zsh
    echo 'source <(kubectl completion zsh)' >> ~/.zshrc
    echo 'source <(helm completion zsh)' >> ~/.zshrc
    source ~/.zshrc
    
  • bash
    echo 'source <(kubectl completion bash)' >> ~/.bashrc
    echo 'source <(helm completion bash)' >> ~/.bashrc
    source ~/.bashrc
    
  • fish
    kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish > /dev/null
    helm completion fish | sudo tee /etc/fish/completions/helm.fish > /dev/null
    

8. 安装 CNI 插件

在资源紧凑的主机中我更推荐使用 Flannel , 这里也会提供 CalicoCilium 的安装, 根据应用场景自行选择其一

资源占用: Flannel < Calico < Cilium

8.1 Flannel

kubectl create namespace kube-flannel
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz

8.2 Calico

helm repo add projectcalico https://docs.tigera.io/calico/charts
helm repo update
kubectl create namespace tigera-operator
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN

8.3 Cilium

helm repo add cilium https://helm.cilium.io/
helm repo update
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system

检查CNI

kubectl get nodes
kubectl get pods -A

节点状态从 NotReady 变为 Ready , CoreDNS 进入 Running 状态, 至此, k8s 已经初步部署完成

9. Headlamp (可选)

9.1 什么是 Headlamp

Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作

它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比

Headlamp 的特点主要有三点:

  1. 界面更现代 更偏向日常运维与开发使用
  2. 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束
  3. 它具备插件扩展能力 可以根据团队需求定制界面和功能

我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口.

9.2 开始安装

先新建一个 values.yml 文件

mkdir -p /main/k8s/headlamp
nano /main/k8s/headlamp/values.yml

粘贴并自行修改配置后进行保存

replicaCount: 1

image:
  registry: ghcr.io
  repository: headlamp-k8s/headlamp
  tag: ""
  pullPolicy: IfNotPresent

nameOverride: ""
fullnameOverride: "headlamp"
namespaceOverride: ""


service:
  type: NodePort
  port: 80
  # 宿主机开放端口
  nodePort: 30080


env:
  - name: TZ
    value: "Asia/Shanghai"

config:
  pluginsDir: /headlamp/plugins

volumes:
  - name: plugins-volume
    hostPath:
      path: /main/k8s/headlamp/plugins
      type: DirectoryOrCreate

volumeMounts:
  - name: plugins-volume
    mountPath: /headlamp/plugins


resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 500m
    memory: 512Mi

用 Helm 安装

helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/
helm repo update
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml

通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 token, 使用命令生成

kubectl create token headlamp --namespace headlamp --duration 168h

若不通则进行检查

kubectl get nodes
kubectl get pods -A

9.3 查看资源使用概览

Headlamp中各种资源显示, 需要依赖 metrics-server

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set "args[0]=--kubelet-insecure-tls"

安装好后就可以正常显示资源占用情况