侧边栏壁纸
博主头像
LLJJJJ的博客

行动起来,活在当下

  • 累计撰写 3 篇文章
  • 累计创建 4 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

学习K8s集群搭建

Administrator
2026-07-20 / 2 评论 / 4 点赞 / 83 阅读 / 0 字

1.集群搭建

假设你的3台服务器信息如下:

角色

主机名

IP地址(示例)

Master节点

k8s-master

192.168.83.141

Worker节点1

k8s-worker1

192.168.83.142

Worker节点2

k8s-worker2

192.168.83.143

步骤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
EOF

sysctl --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
  1. 把所有需要的模块名写进 /etc/modules-load.d/ipvs.conf 文件。

  2. 执行 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:安装网络插件

kube-flannel.yml

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.sock

kubectl get nodes 主节点查看集群,已经加入成功

步骤12(可选):K8s命令自动补全

apt install -y bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

2.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就能访问

4

评论区