一、部署前准备(所有节点执行,单节点仅本机)

这是 K8s 部署核心必做步骤,解决网络、权限、内核参数等基础问题,直接复制一键执行:

# 1. 关闭ufw防火墙(内网环境直接关闭,生产可精准开放端口)
sudo ufw disable && sudo systemctl stop ufw

# 2. 永久关闭交换分区(K8s强制要求,禁止内存交换)
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab

# 3. 配置内核参数(开启IP转发、网桥过滤,K8s网络必备)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 加载内核参数
sudo sysctl --system

# 4. 配置主机名(可选,建议设置为k8s-master,方便识别)
sudo hostnamectl set-hostname k8s-master
# 配置hosts映射(让本机解析自身IP,K8s组件必备)
echo "192.168.200.10  k8s-master" | sudo tee -a /etc/hosts

# 5. 安装依赖工具(避免后续命令缺失)
sudo apt update && sudo apt install -y curl wget apt-transport-https ca-certificates gnupg2

二、配置 Docker+Containerd(K8s 推荐运行时,兼容已有 Docker)

K8s 1.24 + 已弃用 Docker 原生运行时,需使用containerd(Docker 内置了 containerd,无需重新安装,仅需配置即可),步骤如下:

步骤 1:验证 Docker 已安装(此前部署 Harbor 已完成,直接配置)

docker --version # 确保版本≥20.10

步骤 2:配置 Containerd 并设置为 K8s 默认运行时

# 1. 生成containerd默认配置
containerd config default | sudo tee /etc/containerd/config.toml

# 2. 修改配置:替换sandbox镜像为国内源(解决拉取失败)、启用SystemdCgroup
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo sed -i 's/k8s.gcr.io\/pause:3.8/registry.aliyuncs.com\/google_containers\/pause:3.9/g' /etc/containerd/config.toml

# 3. 重启containerd并设置开机自启
sudo systemctl restart containerd && sudo systemctl enable containerd

三、安装 kubeadm、kubelet、kubectl(K8s 核心组件)

这三个是 K8s 集群的核心工具:

  • kubeadm:集群初始化 / 节点加入工具;
  • kubelet:集群节点的核心代理,运行在所有节点,管理 Pod;
  • kubectl:K8s 集群的命令行管理工具。

步骤 1:添加阿里云 K8s 软件源(国内最快,避免外网超时)

# 添加阿里云GPG密钥
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes.gpg

# 添加K8s源
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

步骤 2:安装指定版本组件(选 1.30 稳定版,版本一致避免兼容问题)

# 更新源并安装
sudo apt update && sudo apt install -y kubeadm=1.30.0-00 kubelet=1.30.0-00 kubectl=1.30.0-00

# 锁定版本(避免apt自动更新导致版本不一致)
sudo apt-mark hold kubeadm kubelet kubectl

步骤 3:验证安装成功

kubeadm version && kubectl version --client && kubelet --version

输出组件版本为v1.30.0即为成功。


四、初始化 K8s 单节点集群(核心步骤,仅 master 节点执行)

初始化命令指定本机内网 IP、国内镜像源、Calico 网络网段,解决镜像拉取失败、网络适配问题,全程内网无外网依赖。

步骤 1:拉取 K8s 核心组件镜像(提前拉取,避免初始化超时)

kubeadm 默认拉取国外k8s.gcr.io镜像,这里用阿里云镜像源一键拉取:

kubeadm config images pull \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.30.0

终端显示pulled所有镜像即为成功(无报错、无超时)。

步骤 2:初始化 K8s 集群

kubeadm init \
  --apiserver-advertise-address=192.168.200.10 \ # 本机内网IP(必须,集群通信核心)
  --image-repository registry.aliyuncs.com/google_containers \ # 国内镜像源
  --kubernetes-version v1.30.0 \ # K8s版本
  --pod-network-cidr=192.168.0.0/16 \ # Calico网络网段(固定,与后续网络插件匹配)
  --service-cidr=10.96.0.0/12 \ # 服务网段(默认,无需修改)
  --ignore-preflight-errors=all # 忽略前置检查(新手友好,避免小问题导致初始化失败)

初始化成功标志

终端最后输出节点配置命令 + 加入集群命令,类似以下内容(保存好,后续扩展多节点用):

plaintext

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:
  export KUBECONFIG=/etc/kubernetes/admin.conf

You can now join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.200.10:6443 --token xxxxx.xxxxxx \
  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

步骤 3:配置 K8s 集群访问权限(root 用户执行,让 kubectl 能管理集群)

# 执行初始化成功后提示的命令
export KUBECONFIG=/etc/kubernetes/admin.conf
# 永久生效(重启服务器后无需重新执行)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" | sudo tee -a /root/.bashrc
# 加载配置
source /root/.bashrc

步骤 4:检查集群节点状态(此时为 NotReady,正常,需安装网络插件)

kubectl get nodes

输出如下(STATUSNotReady,后续安装网络插件后变为Ready):

plaintext

NAME         STATUS     ROLES           AGE     VERSION
k8s-master   NotReady   control-plane   1m      v1.30.0

五、安装 Calico 网络插件(必做,解决节点 NotReady)

K8s 集群必须安装网络插件才能实现 Pod / 节点之间的通信,Calico 是目前适配性最强、最稳定的网络插件,直接安装官方稳定版:

# 下载并应用Calico网络插件yaml(国内源,快速拉取)
kubectl apply -f https://mirrors.aliyun.com/kubernetes/calico/v3.26.1/calico.yaml

验证网络插件安装成功

# 查看Calico Pod状态(所有Pod为Running即为成功)
kubectl get pods -n kube-system | grep calico

等待 2-3 分钟(插件初始化),再次检查节点状态,STATUS 变为 Ready即为网络配置成功:

kubectl get nodes
# 成功输出
NAME         STATUS   ROLES           AGE     VERSION
k8s-master   Ready    control-plane   5m      v1.30.0

六、取消 Master 节点污点(单节点必备,让 Master 运行业务 Pod)

K8s 默认给 Master 节点添加污点,禁止在 Master 上运行业务 Pod(生产多节点建议保留,单节点必须取消):

# 取消污点,让Master可以运行Pod
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master- # 兼容旧版本K8s

执行成功输出node/k8s-master untainted即为成功。


七、对接已有 Harbor 私有仓库(核心,让 K8s 拉取 Harbor 镜像)

你已部署192.168.200.10 Harbor,需让 K8s 集群能拉取 Harbor 中的镜像部署 Pod,仅需 2 步(单节点仅本机执行,多节点所有节点执行):

步骤 1:所有节点信任 Harbor 自签证书(复用此前生成的证书)

# 1. 创建containerd证书目录(K8s用containerd运行时,需给containerd配置证书)
sudo mkdir -p /etc/containerd/certs.d/192.168.200.10
# 2. 复制Harbor证书到containerd目录(此前生成的证书在/data/harbor/certs)
sudo cp /data/harbor/certs/harbor.crt /etc/containerd/certs.d/192.168.200.10/
# 3. 同时给Docker配置证书(兼容原有Docker)
sudo cp /data/harbor/certs/harbor.crt /etc/docker/certs.d/192.168.200.10/
# 4. 重启containerd和Docker,证书生效
sudo systemctl restart containerd && sudo systemctl restart docker

步骤 2:创建 K8s Secret(保存 Harbor 登录凭证,让 Pod 能拉取私有镜像)

K8s 访问私有仓库需通过 Secret 保存账号密码,执行命令并输入 Harbor 账号admin、密码Harbor12345

# 创建secret,名称为harbor-registry,类型为docker-registry
kubectl create secret docker-registry harbor-registry \
  --docker-server=192.168.200.10 \ # Harbor仓库IP
  --docker-username=admin \ # Harbor账号
  --docker-password=Harbor12345 \ # Harbor密码
  --docker-email=xxx@xxx.com # 邮箱随意填写,无实际作用

执行成功输出secret/harbor-registry created即为成功。

验证 Secret 创建成功

kubectl get secrets

输出中能看到harbor-registry即为成功。


八、验证 K8s 集群(部署 Harbor 中的 Nginx 镜像,测试核心功能)

用你此前推送到 Harbor 的镜像192.168.200.10/library/nginx:v1.0部署 Pod,验证集群能拉取私有镜像、Pod 正常运行、端口访问正常。

步骤 1:创建 Nginx 部署文件(nginx-harbor.yaml)

cat <<EOF | tee nginx-harbor.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-harbor
  namespace: default
spec:
  replicas: 2 # 2个Pod副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets: # 引用之前创建的Harbor Secret
      - name: harbor-registry
      containers:
      - name: nginx
        image: 192.168.200.10/library/nginx:v1.0 # Harbor中的镜像
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-harbor-svc
  namespace: default
spec:
  type: NodePort # 节点端口,可通过服务器IP+端口访问
  selector:
    app: nginx
  ports:
  - port: 80 # 服务端口
    targetPort: 80 # Pod端口
    nodePort: 30080 # 节点端口(30000-32767之间)
EOF

步骤 2:应用部署文件,启动 Pod 和 Service

kubectl apply -f nginx-harbor.yaml

步骤 3:验证 Pod 和 Service 运行状态

# 查看Pod(所有Pod为Running即为成功,说明拉取Harbor镜像正常)
kubectl get pods
# 查看Service(TYPE为NodePort,PORT(S)为80:30080/TCP即为成功)
kubectl get svc

正常输出示例:

plaintext

# Pod状态
NAME                            READY   STATUS    RESTARTS   AGE
nginx-harbor-7f987d6c89-2xq9s   1/1     Running   0          1m
nginx-harbor-7f987d6c89-9k87s   1/1     Running   0          1m

# Service状态
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-harbor-svc   NodePort    10.96.xxx.xxx   <none>        80:30080/TCP   1m
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP        10m

步骤 4:访问 Nginx 服务(验证端口正常)

打开浏览器,输入服务器 IP + 节点端口http://192.168.200.10:30080,能看到 Nginx 默认页面即为集群完全部署成功

也可在服务器本地执行 curl 测试:

curl http://192.168.200.10:30080

输出 Nginx 默认 HTML 页面即为成功。


九、K8s 单节点扩展为多节点(可选,生产环境必备)

若后续需要添加 Worker 节点,仅需在新的 Ubuntu 节点执行第一步~第三步,然后执行 Master 节点初始化成功后输出的kubeadm join命令即可,步骤如下:

  1. 新节点执行一、部署前准备+二、配置 Docker+Containerd+三、安装 kubeadm/kubelet/kubectl
  2. 新节点执行 Master 的 join 命令(初始化时保存的):
    kubeadm join 192.168.200.10:6443 --token xxxxx.xxxxxx \
      --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
  3. 新节点执行七、步骤 1(信任 Harbor 证书);
  4. Master 节点执行kubectl get nodes,能看到新节点为Ready即为加入成功。

若 join 命令的 token 过期,在 Master 节点执行kubeadm token create --print-join-command重新生成即可。


十、K8s 常用核心运维命令(日常管理必备)

# 查看节点状态
kubectl get nodes
# 查看Pod(所有命名空间)
kubectl get pods -A
# 查看Pod详情(排查Pod启动失败)
kubectl describe pod <Pod名称>
# 查看Pod日志(实时日志)
kubectl logs -f <Pod名称>
# 启动/停止/删除部署
kubectl apply -f <yaml文件>
kubectl delete -f <yaml文件>
# 查看服务
kubectl get svc -A
# 进入Pod内部
kubectl exec -it <Pod名称> -- /bin/bash
# 查看集群信息
kubectl cluster-info
# 重启Pod(删除后自动重建)
kubectl delete pod <Pod名称>
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐