目录
四、安装部署 Flannel 网络插件(仅Master节点执行)
环境准备与前置条件:
一、环境准备:
操作系统要求:Centos 7.9
- 三台兼容的 Linux 主机,每台机器的规格为:
- CPU:2核 或者更多
- 内存:2GB 或者更多的RAM
- 硬盘:40GB(最低20GB)
- 网络规划(私有网络):
- master01:192.168.1.10/24
- node01:192.168.1.11/24
- node02:192.168.1.12/24
二、前置条件:
- 配置主机名、网卡
- 关闭 SELinux 和防火墙以及 swap空间
- 查看主机、内存、磁盘信息
- 配置本地yum源以及网络yum源
- 配置hosts文件
- 配置免密登录
#!/bin/bash
# CentOS 7 环境初始化脚本
# 执行要求:使用 root 用户运行
# 移除 set -e,改为手动判断关键步骤(避免小问题导致整体退出)
# set -e
# 定义颜色输出函数,便于区分信息类型
function echo_green() {
echo -e "\033[32m$1\033[0m"
}
function echo_red() {
echo -e "\033[31m$1\033[0m"
}
function echo_yellow() {
echo -e "\033[33m$1\033[0m"
}
# ===================== 1. 配置主机名 =====================
echo_yellow "===== 开始配置主机名 ====="
current_hostname=$(hostname)
if [ "$current_hostname" = "node01" ]; then
echo_green "主机名已是 node01,无需修改"
else
# 临时修改主机名
hostname node01
# 永久修改主机名(CentOS 7 方式)
hostnamectl set-hostname node01
# 验证修改结果
new_hostname=$(hostname)
if [ "$new_hostname" = "node01" ]; then
echo_green "主机名已成功修改为 node01"
else
echo_red "主机名修改失败,请手动检查"
fi
fi
# ===================== 2. 配置 ens34 网卡 =====================
echo_yellow "===== 开始配置 ens34 网卡 ====="
# 网卡配置文件路径
nic_file="/etc/sysconfig/network-scripts/ifcfg-ens34"
# 检查网卡是否存在
if [ ! -f "$nic_file" ]; then
echo_red "ens34 网卡配置文件不存在,请确认网卡名称"
else
# 提取当前网卡配置信息
current_ip=$(ip addr show ens34 | grep 'inet ' | awk '{print $2}' | head -n1)
current_gateway=$(grep 'GATEWAY=' "$nic_file" | awk -F= '{print $2}' | head -n1)
current_dns=$(grep 'DNS=' "$nic_file" | awk -F= '{print $2}' | tr '\n' ' ')
# 目标配置
target_ip="192.168.1.11/24"
target_gateway="192.168.1.1"
target_dns="8.8.8.8 114.114.114.114"
# 判断是否需要修改
if [ "$current_ip" = "$target_ip" ] && [ "$current_gateway" = "$target_gateway" ] && [ "$current_dns" = "$target_dns" ]; then
echo_green "ens34 网卡配置符合要求,无需修改"
else
echo_yellow "开始修改 ens34 网卡配置..."
# 备份原有配置文件
cp "$nic_file" "${nic_file}.bak$(date +%Y%m%d%H%M%S)"
# 清空原有配置(保留基础结构),重新写入配置
cat > "$nic_file" << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=ens34
DEVICE=ens34
ONBOOT=yes
IPADDR=192.168.1.11
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=114.114.114.114
EOF
# 重启网络服务(CentOS 7 推荐使用 nmcli,兼容 network)
systemctl restart network || nmcli connection reload && nmcli connection up ens34
# 验证配置
new_ip=$(ip addr show ens34 | grep 'inet ' | awk '{print $2}' | head -n1)
new_gateway=$(grep 'GATEWAY=' "$nic_file" | awk -F= '{print $2}')
new_dns1=$(grep 'DNS1=' "$nic_file" | awk -F= '{print $2}')
new_dns2=$(grep 'DNS2=' "$nic_file" | awk -F= '{print $2}')
new_dns="${new_dns1} ${new_dns2}"
if [ "$new_ip" = "$target_ip" ] && [ "$new_gateway" = "$target_gateway" ] && [ "$new_dns" = "$target_dns" ]; then
echo_green "ens34 网卡配置修改成功"
else
echo_red "ens34 网卡配置修改失败,请手动检查"
fi
fi
fi
ifdown /etc/sysconfig/network-scripts/ifcfg-ens34 && ifup /etc/sysconfig/network-scripts/ifcfg-ens34
# ===================== 3. 关闭 SELinux 和防火墙 =====================
echo_yellow "===== 开始关闭 SELinux 和防火墙 ====="
# 关闭 SELinux
current_selinux=$(getenforce)
if [ "$current_selinux" = "Disabled" ]; then
echo_green "SELinux 已关闭,无需操作"
else
# 临时关闭 SELinux
setenforce 0
# 永久关闭 SELinux(修改配置文件)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 验证
new_selinux=$(getenforce)
if [ "$new_selinux" = "Permissive" ] || [ "$new_selinux" = "Disabled" ]; then
echo_green "SELinux 已临时关闭,永久关闭配置已生效(重启后完全禁用)"
else
echo_red "SELinux 关闭失败,请手动检查"
fi
fi
# 关闭防火墙
firewall_status=$(systemctl is-active firewalld)
if [ "$firewall_status" = "inactive" ]; then
echo_green "防火墙已关闭,无需操作"
else
# 临时关闭防火墙
systemctl stop firewalld
# 永久禁用防火墙
systemctl disable firewalld
# 验证
new_firewall_status=$(systemctl is-active firewalld)
if [ "$new_firewall_status" = "inactive" ]; then
echo_green "防火墙已临时关闭,且已设置开机禁用"
else
echo_red "防火墙关闭失败,请手动检查"
fi
fi
# ===================== 4. 关闭 swap 空间(修复核心) =====================
echo_yellow "===== 开始关闭 swap 空间 ====="
# 检查 swap 是否开启(兼容空输出)
swap_status=$(swapon --show | wc -l)
if [ "$swap_status" -eq 0 ]; then
echo_green "swap 空间已关闭,无需操作"
else
# 临时关闭 swap(增加 -f 强制关闭,兼容被进程占用场景)
swapoff -a -f
# 验证临时关闭结果
new_swap_status=$(swapon --show | wc -l)
if [ "$new_swap_status" -ne 0 ]; then
echo_yellow "警告:swap 临时关闭失败(可能被进程占用),继续执行后续步骤"
else
echo_green "swap 已临时关闭"
fi
# 永久关闭 swap(先检查 fstab 中是否有 swap 条目,避免 sed 报错)
if grep -q '^[^#]*swap' /etc/fstab; then
sed -i '/swap/s/^/#/' /etc/fstab
echo_green "已注释 fstab 中的 swap 条目(永久关闭)"
else
echo_yellow "fstab 中无未注释的 swap 条目,无需修改"
fi
fi
# ===================== 5. 查看主机、内存、磁盘信息 =====================
echo_yellow "===== 主机、内存、磁盘信息 ====="
echo_green "1. 主机信息:"
hostnamectl
echo -e "\n"
echo_green "2. 内存信息:"
free -h
echo -e "\n"
echo_green "3. 磁盘信息:"
df -h
echo -e "\n"
# ===================== 6. 配置本地 yum 源(dvd.repo) =====================
echo_yellow "===== 开始配置本地 yum 源 ====="
repo_dir="/etc/yum.repos.d"
local_repo="${repo_dir}/dvd.repo"
backup_dir="${repo_dir}/centos"
# 检查是否已存在 dvd.repo
if [ -f "$local_repo" ]; then
echo_green "本地 yum 源 dvd.repo 已存在,无需配置"
else
# 创建备份目录
mkdir -p "$backup_dir"
# 移动原有 repo 文件到备份目录(忽略无文件的错误)
mv "${repo_dir}"/*.repo "$backup_dir/" 2>/dev/null || echo_yellow "无原有 repo 文件需要移动"
# 创建 dvd.repo 配置文件
cat > "$local_repo" << EOF
[dvd]
name=CentOS-7 - DVD
baseurl=file:///mnt/cdrom
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
# 挂载光盘(如果未挂载,忽略错误)
mkdir -p /mnt/cdrom
mount /dev/cdrom /mnt/cdrom 2>/dev/null || echo_yellow "光盘已挂载或挂载失败(请确保光盘镜像已加载)"
# 清理并重建 yum 缓存
yum clean all && yum makecache
echo_green "本地 yum 源 dvd.repo 配置完成"
fi
# ===================== 7. 安装网络 yum 源依赖包 =====================
echo_yellow "===== 检查并安装网络 yum 源依赖包 ====="
# 网络 yum 源依赖包:wget(用于下载阿里云 repo 文件)
if command -v wget &>/dev/null; then
echo_green "wget 已安装,无需操作"
else
yum install -y wget
if command -v wget &>/dev/null; then
echo_green "wget 安装成功"
else
echo_red "wget 安装失败,请手动检查"
fi
fi
# ===================== 8. 配置阿里云 yum 源 =====================
echo_yellow "===== 开始配置阿里云 yum 源 ====="
aliyun_repo="${repo_dir}/CentOS-Base.repo"
# 检查是否已配置阿里云源(通过特征字符串判断)
if grep -q "mirrors.aliyun.com" "$aliyun_repo" 2>/dev/null; then
echo_green "阿里云 yum 源已配置,无需操作"
else
# 下载阿里云 CentOS 7 源配置(忽略网络临时错误)
wget -O "$aliyun_repo" https://mirrors.aliyun.com/repo/Centos-7.repo 2>/dev/null || {
echo_red "阿里云 yum 源下载失败,请检查网络"
exit 1
}
# 清理并重建 yum 缓存
yum clean all && yum makecache
echo_green "阿里云 yum 源配置完成"
fi
echo_green "===== 所有环境初始化操作完成 ====="
#配置 hosts 文件(三个节点均需配置)
cat > /etc/hosts << EOF
192.168.1.10 master
192.168.1.11 node01
192.168.1.12 node02
EOF
#!/bin/bash
#==================== 配置免密登录 ====================
# 自动生成密钥(无密码,一路回车)
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" <<< "" >/dev/null 2>&1
# 你的所有节点清单(已帮你填好)
NODES=(
master01
node01
node02
)
# 自动分发公钥
echo "正在批量配置免密登录..."
for NODE in "${NODES[@]}"; do
ssh-copy-id -o StrictHostKeyChecking=no $NODE >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✅ $NODE 免密配置成功"
else
echo "❌ $NODE 免密配置失败"
fi
done
echo -e "\n==== 验证免密结果 ===="
for NODE in "${NODES[@]}"; do
ssh $NODE "hostname" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✅ 可免密登录:$NODE"
else
echo "❌ 无法免密:$NODE"
fi
done
安装及配置k8环境:
一、安装k8s环境(所有节点执行)
- 配置内核模块与网络转发
- 配置containerd和kubernetes的yum源(建议用国内源,方便快捷,例如:阿里云),并验证是否配置成功
- 安装 containerd 并验证是否能正常拉取镜像
- 安装kubernetes
#!/bin/bash
#==================== 内核模块与网络转发配置 ======================
##查看内核模块
lsmod | grep overlay && lsmod | grep br_netfilter
##配置内核模块
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF
##加载模块
modprobe overlay && modprobe br_netfilter
##验证内核模块是否加载成功
lsmod | grep overlay && lsmod | grep br_netfilter
##开启网络转发
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
#应用内核参数
sysctl --system
#备份无法使用的yum源
mv /etc/yum.repos.d/dvd.repo /etc/yum.repos.d/dvd.repo.bak
#==================== 配置containerd yum源 ======================
cat > /etc/yum.repos.d/docker-ce.repo << 'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7.9/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg
EOF
#==================== 配置kubernetes yum源 ======================
cat << EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
EOF
#==================== 验证yum源 ======================
yum clean all && yum makecache
yum repolist
#==================== 安装containerd ======================
#安装containerd
yum -y install containerd.io
#备份containerd配置文件
cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
#生成containerd配置文件
containerd config default | tee /etc/containerd/config.toml
#修改containerd配置文件
##将/SystemdCgroup = false 改为 SystemdCgroup = true
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
##将镜像源改为国内的镜像源
##将 sandbox_image = "registry.k8s.io/pause:3.6" 改为 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"
sed -i 's|registry.k8s.io/pause:3.6|registry.aliyuncs.com/google_containers/pause:3.10.1|g' /etc/containerd/config.toml
##重启containerd,并验证是否启动成功
systemctl enable containerd --now && systemctl restart containerd && systemctl status containerd
#==================== 安装kubernetes ======================
#安装kubernetes
yum -y install kubeadm kubectl kubelet cri-tools
##生成crictl配置文件
cat > /etc/crictl.yaml <<-'EOF'
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10s
debug: false
EOF
##验证crictl是否可以拉取镜像
crictl images
二、初始化k8s环境(仅Master节点执行)
初始化 k8s 集群前建议提前拉取镜像,并安装 conntrack 依赖包,如果不安装会导致初始化失败
#!/bin/bash
#==================== 初始化kubernetes集群(仅在Master节点执行) ======================
##提前拉取镜像
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
##安装初始化依赖包
yum -y install conntrack
##初始化kubernetes集群
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=11.0.1.196 \
--image-repository=registry.aliyuncs.com/google_containers
###备注:
#各参数含义与本机地址说明
#--pod-network-cidr=10.244.0.0/16
#含义:Pod 网络网段,用于分配给集群中各节点的 Pod 使用。
#本机地址:无,是一个全局的虚拟网段,不对应本机物理网卡。
#常见值:10.244.0.0/16(Flannel 推荐)、10.85.0.0/16(Calico 推荐)。
#--apiserver-advertise-address=192.168.32.131
#含义:API Server 通告地址,即 Master 节点的本机 IP 地址,用于集群内组件访问 API Server。
#本机地址:是,必须填写 Master 节点的真实 IP(如 192.168.32.131)。
#查看方法:ip a 或 hostname -I 取本机可用 IP。
#--image-repository=registry.aliyuncs.com/google_containers
#含义:镜像仓库地址,用于拉取 Kubernetes 所需的组件镜像。
#本机地址:无,是阿里云的公共镜像源地址。
#==================== 配置kubeadm token ======================
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
三、node加入节点(仅所有Node节点执行)
Node节点加入直接复制Master节点的token命令到各个Node节点即可,需要注意的是,执行加入节点之前需要将 conntrack 依赖包在各个Node节点安装好,否则也会报错
#!/bin/bash
#安装依赖包(仅在所有node节点执行)
yum -y install conntrack
#启用 kubelet 服务
systemctl enable kubelet --now
#==================== node节点加入(复制Master节点的token命令) ======================
## kubeadm join xxxxxxxx:6443 --token xxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxx
四、安装部署 Flannel 网络插件(仅Master节点执行)
方法一:执行该命令下载插件并部署
#==================== 安装Flannel插件(仅在Master节点执行) ======================
kubectl apply -f https://gethub.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#备注:由于下载的是gethub上的yaml文件,会经常存在下载失败的现象发生,建议按照方法二执行,方便快捷
方法二:本地任意目录下新建一个 kube-flannel.yaml 的文件,执行部署命令
#====================== 写入kube-flannel.yaml文件 ====================
cat > kube-flannel.yaml << EOF
---
kind: Namespace
apiVersion: v1
metadata:
name: kube-flannel
labels:
k8s-app: flannel
pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: flannel
name: flannel
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: flannel
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: flannel
name: flannel
namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-flannel
labels:
tier: node
k8s-app: flannel
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds
namespace: kube-flannel
labels:
tier: node
app: flannel
k8s-app: flannel
spec:
selector:
matchLabels:
app: flannel
template:
metadata:
labels:
tier: node
app: flannel
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
hostNetwork: true
priorityClassName: system-node-critical
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni-plugin
image: ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel1
command:
- cp
args:
- -f
- /flannel
- /opt/cni/bin/flannel
volumeMounts:
- name: cni-plugin
mountPath: /opt/cni/bin
- name: install-cni
image: ghcr.io/flannel-io/flannel:v0.28.1
command:
- cp
args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
volumeMounts:
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
containers:
- name: kube-flannel
image: ghcr.io/flannel-io/flannel:v0.28.1
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
resources:
requests:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: false
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: EVENT_QUEUE_DEPTH
value: "5000"
- name: CONT_WHEN_CACHE_NOT_READY
value: "false"
volumeMounts:
- name: run
mountPath: /run/flannel
- name: flannel-cfg
mountPath: /etc/kube-flannel/
- name: xtables-lock
mountPath: /run/xtables.lock
volumes:
- name: run
hostPath:
path: /run/flannel
- name: cni-plugin
hostPath:
path: /opt/cni/bin
- name: cni
hostPath:
path: /etc/cni/net.d
- name: flannel-cfg
configMap:
name: kube-flannel-cfg
- name: xtables-lock
hostPath:
path: /run/xtables.lock
type: FileOrCreate
EOF
#==================== 执行部署Flannel命令 ====================
kubectl apply -f kube-flannel.yaml
五、验证k8s是否部署成功(仅Master节点执行)
执行如下命令查看是否部署成功
[root@master01 ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-8qh9q 1/1 Running 0 83m
kube-flannel kube-flannel-ds-gjkq6 1/1 Running 0 83m
kube-flannel kube-flannel-ds-jkfwk 1/1 Running 0 83m
kube-system coredns-855c4dd65d-kl5rh 1/1 Running 0 12h
kube-system coredns-855c4dd65d-vlj7g 1/1 Running 0 12h
kube-system etcd-master01 1/1 Running 0 12h
kube-system kube-apiserver-master01 1/1 Running 0 12h
kube-system kube-controller-manager-master01 1/1 Running 0 12h
kube-system kube-proxy-6s584 1/1 Running 0 12h
kube-system kube-proxy-fv4lt 1/1 Running 0 11h
kube-system kube-proxy-thp2r 1/1 Running 0 11h
kube-system kube-scheduler-master01 1/1 Running 0 12h
[root@master01 ~]#
[root@master01 ~]#
[root@master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 12h v1.31.14
node01 Ready <none> 11h v1.31.14
node02 Ready <none> 11h v1.31.14
#备注若执行 kubectl get pods -A 命令查看结果如上所示,所有Pod 皆为 Running ,此外再使用 kubectl get nodes 命令查看所有节点状态均为 Ready 状态,则说明部署成功
&spm=1001.2101.3001.5002&articleId=159532055&d=1&t=3&u=46505821a97e410daed97c16beef078d)
914

被折叠的 条评论
为什么被折叠?



