【笔记】使用 kubeadm 安装 1 Master 2 Worker 的 Kubernetes 集群

【笔记】使用 kubeadm 安装 1 Master 2 Worker 的 Kubernetes 集群
关键词: #Kubernetes 、 #部署手册


耗时: 20 分钟
碰到的难点:代理配置,Linux内核模块和参数,sed命令修改配置, systemctl daemon-reload的作用

实验目标

使用 kubeadm 部署一个
1 Master + 2 Worker 的 Kubernetes 集群。

实验环境

项目 配置
操作系统 Rocky Linux release 9.4 (Blue Onyx)
内核版本 5.14.0-427.13.1.el9_4.x86_64
CPU 架构 x86_64
Kubernetes v1.32.2
Containerd 1.7.29
网络插件 Calico v3.29.2
容器网络 CIDR 10.244.0.0/16
Master 数量 1
Worker 数量 2

网络规划

节点 主机名 IP 地址
Master master-1 192.168.250.153
Worker1 worker-1 192.168.250.152
Worker2 worker-2 192.168.250.175

安装步骤

一、环境准备 ( Master 和 Worker 都 执行 )

关闭防火墙和selinux

1.1 分别配置主机名(每个节点执行的命令不同)

  • master-1
hostnamectl set-hostname master-1
  • worker-1
hostnamectl set-hostname worker-1
  • worker-2
hostnamectl set-hostname worker-2

1.2 配置hosts文件本地解析

cat >> /etc/hosts << EOF
192.168.250.153 master-1
192.168.250.152 worker-1
192.168.250.175 worker-2
EOF

1.3 配置时钟同步

dnf -y install chrony 
cat >> /etc/chrony.conf << EOF
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
EOF
systemctl enable --now chronyd 

1.4 关闭交换分区

swapoff -a
sed -i '/swap/d' /etc/fstab
free -h

1.5 修改内核参数

cat >> /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
EOF
modprobe br_netfilter
cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

1.6 安装 容器运行时 Containerd

安装 containerd

dnf install -y yum-utils 
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf -y install containerd.io-1.7.29 

修改 containerd 配置文件
创建默认配置文件

cd /etc/containerd
mv config.toml config.toml.orig
containerd config default > /etc/containerd/config.toml

修改配置

sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
grep -i SystemdCgroup  /etc/containerd/config.toml
sed -i "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
grep -i sandbox_image /etc/containerd/config.toml

注:期望的配置状态: /etc/containerd/config.toml

  ...
    [plugins."io.containerd.grpc.v1.cri"]
      ...
+     sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
-     sandbox_image = "registry.k8s.io/pause:3.8"
  ...
            [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
              ...
+             SystemdCgroup = true
-             SystemdCgroup = false
 ...

启动 containerd 服务

systemctl enable --now containerd
systemctl status containerd --no-pager
ctr version 

1.7 安装 kubeadm 和 k8s 组件

cat >> /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOF
dnf install -y kubeadm-1.32.2 kubelet-1.32.2 kubectl-1.32.2
systemctl enable --now kubelet

二、Master节点初始化

2.1 生成 kubeadm 初始化的配置文件

cd
kubeadm config print init-defaults > kubeadm-config.yaml
sed -ri "s|(advertiseAddress:[[:space:]]*).*|\1192.168.250.153|" kubeadm-config.yaml
sed -ri "s|(name:[[:space:]]*).*|\1master-1|" kubeadm-config.yaml
sed -ri "s|(imageRepository:[[:space:]]*).*|\1registry.aliyuncs.com/google_containers|" kubeadm-config.yaml
sed -ri "s|(kubernetesVersion:[[:space:]]*).*|\11.32.2|" kubeadm-config.yaml
sed -ri '/(serviceSubnet:[[:space:]]*).*/a\ \ podSubnet: 10.244.0.0/16' kubeadm-config.yaml

期望的配置

  apiVersion: kubeadm.k8s.io/v1beta4
  bootstrapTokens:
  - groups:
    - system:bootstrappers:kubeadm:default-node-token
    token: abcdef.0123456789abcdef
    ttl: 24h0m0s
    usages:
    - signing
    - authentication
  kind: InitConfiguration
  localAPIEndpoint:
+   advertiseAddress: 192.168.250.153
-   advertiseAddress: 1.2.3.4
    bindPort: 6443
  nodeRegistration:
    criSocket: unix:///var/run/containerd/containerd.sock
    imagePullPolicy: IfNotPresent
    imagePullSerial: true
+   name: master-1
-   name: node
    taints: null
  timeouts:
    controlPlaneComponentHealthCheck: 4m0s
    discovery: 5m0s
    etcdAPICall: 2m0s
    kubeletHealthCheck: 4m0s
    kubernetesAPICall: 1m0s
    tlsBootstrap: 5m0s
    upgradeManifests: 5m0s
  ---
  apiServer: {}
  apiVersion: kubeadm.k8s.io/v1beta4
  caCertificateValidityPeriod: 87600h0m0s
  certificateValidityPeriod: 8760h0m0s
  certificatesDir: /etc/kubernetes/pki
  clusterName: kubernetes
  controllerManager: {}
  dns: {}
  encryptionAlgorithm: RSA-2048
  etcd:
    local:
      dataDir: /var/lib/etcd
+ imageRepository: registry.aliyuncs.com/google_containers
- imageRepository: registry.k8s.io
  kind: ClusterConfiguration
+ kubernetesVersion: 1.32.2
- kubernetesVersion: 1.32.0
  networking:
    dnsDomain: cluster.local
    serviceSubnet: 10.96.0.0/12
+   podSubnet: 10.244.0.0/16
  proxy: {}
  scheduler: {}

2.2 下载集群初始化所需镜像

kubeadm config --config=kubeadm-config.yaml images list
kubeadm config --config=kubeadm-config.yaml images pull
ctr -n k8s.io image list

2.3 集群初始化

kubeadm init --config=kubeadm-config.yaml 

2.4 配置 kubectl 的认证文件

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

三、Worker 节点加入集群 (在 worker 节点执行)

在 Master 节点运行如下命令,生成Worker节点加入集群命令的命令,然后在各个 Worker 节点上运行

kubeadm token create --print-join-command

注:示例命令

kubeadm join 192.168.250.153:6443 --token wg0ev4.cz{{placehold}}oyq --discovery-token-ca-cert-hash sha256:ba{{placehold}}07e

四、安装网络插件 Calico

4.1 配置代理(在所有节点配置代理)

注:接下来,为了避免安装网络插件 Calico 因网络不好需要导入离线镜像的麻烦,我在这次实验中在这里配置代理,方便拉取相关镜像

全局代理

cat >> /etc/profile.d/proxy.sh << 'EOF'
PROXY_URL=http://192.168.250.1:10090
NO_PROXY_URL=localhost,127.0.0.1,::1,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8,.svc,.cluster.local,.localdomain,.example.com

export HTTP_PROXY=$PROXY_URL
export HTTPS_PROXY=$PROXY_URL
export ALL_PROXY=$PROXY_URL

export http_proxy=$PROXY_URL
export https_proxy=$PROXY_URL
export all_proxy=$PROXY_URL

export NO_PROXY=$NO_PROXY_URL
export no_proxy=$NO_PROXY_URL
EOF
. /etc/profile.d/proxy.sh

containerd代理

mkdir /usr/lib/systemd/system/containerd.service.d
cat >> /usr/lib/systemd/system/containerd.service.d/http-proxy.conf << EOF
[Service]
Environment="no_proxy=localhost,127.0.0.1,::1,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8,.svc,.cluster.local,.localdomain,.example.com"
Environment="https_proxy=http://192.168.250.1:10090"
Environment="NO_PROXY=localhost,127.0.0.1,::1,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8,.svc,.cluster.local,.localdomain,.example.com"
Environment="HTTPS_PROXY=http://192.168.250.1:10090"
Environment="HTTP_PROXY=http://192.168.250.1:10090"
Environment="http_proxy=http://192.168.250.1:10090"
Environment="ALL_PROXY=http://192.168.250.1:10090"
Environment="all_proxy=http://192.168.250.1:10090"
EOF

systemctl daemon-reload
systemctl restart containerd

4.2 安装网络插件 Calico (仅在一个 master 节点执行)

curl https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/calico.yaml -O
kubectl create -f calico.yaml 

验证

kubectl get po -n kube-system -o wide
kubectl get po -A
kubectl get no
kubectl get cs
posted @ 2026-10-14 11:43  笔记和文档  阅读(2)  评论(0)    收藏  举报