1.集群搭建
假设你的3台服务器信息如下:
步骤1:设置主机名
sudo hostnamectl set-hostname k8s-master 3台都设置对应的
步骤2:配置hosts文件(3台都要做)
bash
sudo tee -a /etc/hosts << EOF
192.168.83.141 k8s-master
192.168.83.142 k8s-worker1
192.168.83.143 k8s-worker2
EOF注意:把IP改成你实际的服务器IP。
步骤3:关闭Swap
bash
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab步骤4:时间同步(使用chrony)
bash
# 安装chrony
sudo apt update
sudo apt install -y chrony
# 配置NTP服务器
sudo tee /etc/chrony/chrony.conf << EOF
server ntp.aliyun.com iburst
server ntp.tencent.com iburst
server cn.pool.ntp.org iburst
driftfile /var/lib/chrony/chrony.drift
logdir /var/log/chrony
EOF
# 重启并启用服务
sudo systemctl restart chrony
sudo systemctl enable chrony
# 验证同步状态
chronyc tracking看到 Leap status : Normal 表示同步成功。
步骤5:加载内核模块
modprobe br_netfilter
# 它的作用是立即将 br_netfilter 内核模块加载到当前正在运行的内核中。
#执行完这条命令,模块就生效了,但这是临时的,系统重启后就会失效。
echo 'br_netfilter' | sudo tee /etc/modules-load.d/k8s.conf
#作用:这条命令是为系统重启后准备的。它的作用是创建一个配置文件(/etc/modules-load.d/k8s.conf),并写入br_netfilter。
#/etc/modules-load.d/ 目录:这是 systemd 管理的一个目录。
#系统在启动初期会读取这个目录下所有 .conf 文件,并自动加载其中列出的内核模块。
#tee 命令:它负责将管道前的 echo 输出写入到指定的文件中,并且因为需要写入 /etc/ 这种系统目录,通常需要 sudo 权限。步骤6:配置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
EOFsysctl --system 使配置生效
apt install -y ipset ipvsadm sysstat conntrack 安装一些Linux系统级别的网络和性能工具包
cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
systemctl restart systemd-modules-load.service把所有需要的模块名写进
/etc/modules-load.d/ipvs.conf文件。执行
systemctl restart systemd-modules-load.service,系统读取这个文件,把这些模块全部加载进内核。
步骤7:安装cir-docker
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz
tar xvf cri-dockerd-0.3.16.amd64.tgz
cd cri-dockerd
install -o root -g root -m 0755 cri-dockerd /usr/bin/cri-dockerd创建system服务文件
/etc/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target创建 socket 文件
vim /etc/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target重新读取配置并开开机启
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service cri-docker.socket
sudo systemctl start cri-docker.service cri-docker.socket步骤8:安装kubeadm、kubelet、kubectl
sudo mkdir -p /etc/apt/keyrings
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/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://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/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 # 锁定版本,apt upgrade时不会更新步骤9:初始化集群,主节点操作
生成一份默认的 kubeadm 初始化配置文件
kubeadm config print init-defaults > kubeadm_init.yaml
# ============================================================
# 第一部分:InitConfiguration - 初始化配置
# ============================================================
apiVersion: kubeadm.k8s.io/v1beta4 # kubeadm API 版本
bootstrapTokens: # 引导令牌,用于节点加入集群
- groups: # 令牌所属的用户组
- system:bootstrappers:kubeadm:default-node-token
token: 460g31.hv8lg8j9tvvd7kmu # 令牌字符串(请妥善保管)
ttl: 24h0m0s # 令牌有效期(24小时)
usages: # 令牌用途
- signing # 用于签名
- authentication # 用于认证
kind: InitConfiguration # 配置类型:初始化配置
localAPIEndpoint: # 本地 API Server 端点
advertiseAddress: 192.168.83.141 # Master 节点 IP(访问集群的地址)
bindPort: 6443 # API Server 监听端口
nodeRegistration: # 节点注册信息
criSocket: unix:///var/run/cri-dockerd.sock # CRI 运行时 socket(使用 Docker)
imagePullPolicy: IfNotPresent # 镜像拉取策略(不存在时才拉取)
imagePullSerial: true # 串行拉取镜像(逐个拉取)
taints: null # 节点污点(null 表示 Master 可调度 Pod)
timeouts: # 超时时间配置
controlPlaneComponentHealthCheck: 4m0s # 控制平面组件健康检查超时
discovery: 5m0s # 发现超时
etcdAPICall: 2m0s # etcd API 调用超时
kubeletHealthCheck: 4m0s # kubelet 健康检查超时
kubernetesAPICall: 1m0s # Kubernetes API 调用超时
tlsBootstrap: 5m0s # TLS 引导超时
upgradeManifests: 5m0s # 升级清单超时
# ============================================================
# 第二部分:ClusterConfiguration - 集群配置
# ============================================================
---
apiServer: {} # API Server 配置(留空使用默认)
apiVersion: kubeadm.k8s.io/v1beta4 # kubeadm API 版本
caCertificateValidityPeriod: 87600h0m0s # CA 证书有效期(10年)
certificateValidityPeriod: 8760h0m0s # 证书有效期(1年)
certificatesDir: /etc/kubernetes/pki # 证书存放目录
clusterName: kubernetes # 集群名称
controllerManager: {} # Controller Manager 配置(留空使用默认)
dns: {} # DNS 配置(留空使用默认 CoreDNS)
encryptionAlgorithm: RSA-2048 # 加密算法(RSA 2048位)
etcd: # etcd 配置
local: # 使用本地 etcd(而非外部 etcd)
dataDir: /var/lib/etcd # etcd 数据存储目录
imageRepository: registry.aliyuncs.com/google_containers # 镜像仓库(使用阿里云加速)
kind: ClusterConfiguration # 配置类型:集群配置
kubernetesVersion: 1.31.4 # Kubernetes 版本
networking: # 网络配置
dnsDomain: cluster.local # 集群内部 DNS 域名
serviceSubnet: 10.96.0.0/12 # Service 网段(ClusterIP 分配范围)
podSubnet: 10.244.0.0/16 # Pod 网段(容器 IP 分配范围,需与网络插件一致)
# ============================================================
# 第三部分:KubeProxyConfiguration - kube-proxy 配置
# ============================================================
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1 # kube-proxy API 版本
kind: KubeProxyConfiguration # 配置类型:kube-proxy 配置
mode: "ipvs" # 代理模式(ipvs 性能优于 iptables)kubeadm config images pull --config ./kubeadm_init.yaml 拉取镜像
kubeadm init --config ./kubeadm_init.yaml 初始化集群
初始化完成,输入它给的三条命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
步骤10:安装网络插件
kubectl apply -f kube-flannel.yml #应用网络插件

发现拉取失败,用下面命令查看Flannel 为什么拉取失败,因为用的docker的镜像源
kubectl describe pod -n kube-flannel kube-flannel-ds-cbmrc
#配置镜像
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io"
]
}
EOF
sudo systemctl restart docker
全部Running
步骤11:从节点加入集群
kubeadm join 192.168.83.141:6443 \
--token 460g31.hv8lg8j9tvvd7kmu \
--discovery-token-ca-cert-hash sha256:8df0dd2fcd07c06fa7822bb601326a9dd3c133e2885539f4298cb99406e14e77 \
--cri-socket unix:///var/run/cri-dockerd.sockkubectl get nodes 主节点查看集群,已经加入成功

步骤12(可选):K8s命令自动补全
apt install -y bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc2.K8s运行个简单的容器
kubectl run k8s-nginx --image=nginx:1.27.3生成一个 Deployment 的 YAML 配置文件,但先不真正创建资源,只把配置保存到文件里。
kubectl create deployment d-nginx --image=swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27.3-alpine --dry-run=client -o yaml > d-nginx.yaml
应用配置文件部署
kubectl apply -f d-nginx.yaml根据已有的Deployment 的 YAML 配置文件,生成一个 Service 的 YAML 配置文件,NodePort可以对外暴露端口
kubectl expose deployment/d-nginx --port 80 --type=NodePort --dry-run=client -o yaml > s-c-d-nginx.yaml
kubectl apply -f s-c-d-nginx.yaml
输入对应的三台机器IP加端口31560就能访问
评论区