Ubuntu部署k8s
本文详细介绍了Kubernetes单节点集群的部署流程,包含以下核心步骤: 基础环境配置:关闭防火墙和交换分区,设置内核参数和主机名 容器运行时配置:使用containerd作为K8s运行时,配置国内镜像源 K8s组件安装:通过阿里云源安装kubeadm、kubelet和kubectl 集群初始化:指定内网IP和国内镜像源,配置Calico网络插件 私有仓库对接:配置Harbor证书并创建访问凭证
一、部署前准备(所有节点执行,单节点仅本机)
这是 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
输出如下(STATUS为NotReady,后续安装网络插件后变为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命令即可,步骤如下:
- 新节点执行一、部署前准备+二、配置 Docker+Containerd+三、安装 kubeadm/kubelet/kubectl;
- 新节点执行 Master 的 join 命令(初始化时保存的):
kubeadm join 192.168.200.10:6443 --token xxxxx.xxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - 新节点执行七、步骤 1(信任 Harbor 证书);
- 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名称>
更多推荐



所有评论(0)