使用kubeadm安装kubernetes-单master节点双worker节点
kubeadm 是 Kubernetes 官方提供的集群部署工具,用于快速初始化和管理符合生产级标准的 Kubernetes 集群。它专注于控制平面的生命周期管理(如初始化、升级、降级),简化了集群部署的复杂度。
本地安装资源规划
| IP地址 | 主机名称 | 角色 | 操作系统 | 主机参考配置 |
|---|---|---|---|---|
| 192.168.10.10 | master1 | master | Rocky9.4 | 4核心CPU/4GB内存/80G |
| 192.168.10.20 | worker1 | worker | Rocky9.4 | 4核心CPU/4GB内存/80G |
| 192.168.10.30 | worker2 | worker | Rocky9.4 | 4核心CPU/4GB内存/80G |
初始化集群环境
操作系统-所有主机的操作
各主机名修改
hostnamectl set-hostname master1 && bash # master节点
hostnamectl set-hostname worker1 && bash # worker1节点
hostnamectl set-hostname worker2 && bash # worker2节点
各主机hosts文件添加映射
cat <<EOF >> /etc/hosts
192.168.10.10 master1
192.168.10.20 worker1
192.168.10.30 worker2
EOF
★ 关闭selinux和防火墙
setenforce 0
systemctl stop firewalld.service
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl disable firewalld.service
★ 关闭交换分区
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
# 安装时间同步chrony软件
yum install chrony -y
systemctl enable chronyd.service --now
systemctl restart chronyd.service
vim /etc/chrony.conf
3 # pool 2.rocky.pool.ntp.org iburst
4 pool ntp1.aliyun.com
★ 动态加载内核模块
modprobe br_netfilter # 容器跨节点通信、Service 流量转发
modprobe ip_conntrack # NAT 和连接跟踪(Service 负载均衡)
modprobe iptable_filter # 容器网络防火墙规则
modprobe iptable_nat # 容器端口映射和 Service 的 NAT
modprobe overlay # 容器存储驱动(overlay2)
★ 持久化加载内核模块
cat > /etc/modules-load.d/modules.conf << EOF
br_netfilter
ip_conntrack
iptable_filter
iptable_nat
overlay
EOF
控制内核行为
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
systemctl restart systemd-modules-load.service
集群安装docker-所有主机均操作
所有主机均操作
yum -y install docker-ce-26.1.1-1.el9.x86_64
systemctl enable docker --now
安装好docker后containerd.io作为docker依赖也会被安装,在安装k8s前就无需再安装containerd.io了。Docker Hub 是默认镜像仓库,docker pull 比手动配置 containerd 镜像源更简单。
校验检查:
[root@master1 ~]# rpm -qa | grep containerd
containerd.io-1.6.32-3.1.el9.x86_64
启用Docker Cgroup控制组,用于限制进程的资源使用量,如CPU、内存。再配置镜像加速器,harbor地址,方便后期拉取镜像。
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"log-opts": {
"max-size": "5m",
"max-file":"3"
},
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["rgistory地址","harbor.cn"],
"registry-mirrors": [
"https://jockerhub.com",
"https://docker.nju.edu.cn"
]
}
EOF
安装k8s
所有主机均需要操作
添加阿里云kubernetes仓库:用于下载k8s需要的基础服务软件包。
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装 kubeadm kubelet kubectl:
dnf install -y kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0
systemctl enable kubelet
安装集群所需软件包
- kubeadm:用于初始化集群,并配置集群所需的组件并生成对应的安全证书和令牌;
- kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
- kubectl:用于管理k8集群的一个命令行工具;
生成且修改containerd的配置文件(原有的配置文件不可使用)并重启:
# 生成 containerd 的默认配置文件,
# 首次安装 containerd 时,默认可能没有配置文件,所以要自己生成
containerd config default > /etc/containerd/config.toml
# 修改为以下配置
vim /etc/containerd/config.toml
67 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
139 SystemdCgroup = true
systemctl restart containerd
systemctl enable containerd
查看集群所需镜像文件(普通情况下国外镜像我们无法下载的):
kubeadm config images list --kubernetes-version=v1.28.13
registry.k8s.io/kube-apiserver:v1.28.13
registry.k8s.io/kube-controller-manager:v1.28.13
registry.k8s.io/kube-scheduler:v1.28.13
registry.k8s.io/kube-proxy:v1.28.13
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1
准备国内的镜像:由于国外镜像无法直接访问,所以这里指定国内镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.13
这里可以先master节点先下载上面的k8s的镜像,然后将这些镜像进行打包的从操作(如下),最后发给其他的主机上。
[root@master1 ~]# ctr -n=k8s.io images export all.tar.gz \
registry.aliyuncs.com/google_containers/coredns:v1.10.1 \
registry.aliyuncs.com/google_containers/etcd:3.5.9-0 \
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.13 \
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.13 \
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.13 \
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.13 \
registry.aliyuncs.com/google_containers/pause:3.9
[root@master1 ~]# ll -h all.tar.gz
-rw-r--r--. 1 root root 221M May 14 13:15 all.tar.gz
[root@worker1 ~]# ctr -n=k8s.io images import k8sall.tar.gz
在master节点初始化集群
生成集群初始化配置文件:
[root@master1 ~]# kubeadm config print init-defaults > kubeadm.yaml
修改advertiseAddress,name,imageRepository,kubernetesVersion的值
添加podSubnet字段,加入kube proxy模式为ipvs的配置字段
[root@master1 ~]# vim kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.10.10 # 控制节点IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master1 # 控制节点名称
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 改为国内镜像
kind: ClusterConfiguration
kubernetesVersion: 1.28.13 # 修改成1.28.13版本
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 # 添加这个字段 指定pod网段
serviceSubnet: 10.96.0.0/12
scheduler: {}
# 加入以下配置使用ipvs转发规则 ---------------------------
--- |
apiVersion: kubeproxy.config.k8s.io/v1alpha1 |
kind: KubeProxyConfiguration |
mode: ipvs |
--- |
apiVersion: kubelet.config.k8s.io/v1beta1 |
kind: KubeletConfiguration |
cgroupDriver: systemd |
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification
当成功安装后会有:
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 should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.10.20:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:9492373459fec951514dfd207f17b1c2fb21ff66b9cba572b059e7ba5
初始化成功后,按照提示准备集群管理员配置文件:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
查看集群状态:
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 NotReady control-plane 26m v1.28.2
此时集群状态还是NotReady 状态,因为网络组件没有启动。
master节点部署Pod网络插件Calico
Calico 和 Flannel 是两种流行的 k8s 网络插件,它们都为集群中的 Pod 提供网络功能。
[root@master1 ~]# wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
vim calico.yaml
#修改pod网段ip ,把注释放开并修改vlaue值
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
提前下载calico.yaml中所需要的镜像文件并导出至所有主机,防止网络原因导致集群初始化失败。
[root@master1 ~]# docker pull docker.io/calico/kube-controllers:v3.25.0
docker pull docker.io/calico/node:v3.25.0
docker pull docker.io/calico/cni:v3.25.0
随后集体打包为calicoimg.tar.gz,为后面ctr方便:
[root@master1 ~]# docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o calicoimg.tar.gz
[root@master1 ~]# ctr -n=k8s.io images import calicoimg.tar.gz
[root@master1 ~]# kubectl apply -f calico.yaml
最后查看Calico相关的Pod状态为Running即可:
[root@master1 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-9d57d8f49-lk7sw 1/1 Running 0 10m
calico-node-drsmx 1/1 Running 0 10m
coredns-6554b8b87f-6rjtd 1/1 Running 0 39m
coredns-6554b8b87f-w5gzw 1/1 Running 0 39m
--snip--
查看集群节点状态是否为Ready
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 66m v1.28.2
kubectl get pod -A 查看相关的网络容器是否正常运行。
kubectl get node 查看节点的状态、角色、版本。
将工作节点加入集群
在master节点上查询能让node节点加入的命令。
[root@master1 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.10.10:6443 --token f7vfht.8vv3iq2uv5d79i69 --discovery-token-ca-cert-hash sha256:cedada77c9c723490fa47ab28d679d5195bb53808bb59d6360425cffd9def946
输出的内容就是worker节点需要的。
在worker1节点上输入上面输出的命令:
[root@worker1 ~]# kubeadm join 192.168.10.10:6443 --token f7vfht.8vv3iq2uv5d79i69 --discovery-token-ca-cert-hash sha256:cedada77c9c723490fa47ab28d679d5195bb53808bb59d6360425cffd9def946
--snip--
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
在主节点上查看:
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 7d v1.28.2
worker1 NotReady <none> 37s v1.28.2
等待后worker节点的STATUS就是 Ready 了。
master节点上运行pod
正常情况下,master节点是不会运行pod的,在master节点上运行pod通常出现在测试环境下。
kubectl taint node --all node-role.kubenetes.io/master-
node节点使用kubectl
默认情况下,kubectl是用在master节点上的,node节点运行不了这个命令是因为莫没有config认证。

浙公网安备 33010602011771号