准备工作
- 环境规划
角色 | IP地址 | 主机名 | 配置 |
---|---|---|---|
主节点 | 192.168.145.153 | k8s-master | 2C/4G/20G |
从节点1 | 192.168.145.154 | k8s-worker1 | 2C/4G/20G |
从节点2 | 192.168.145.155 | k8s-worker2 | 2C/4G/20G |
- 系统要求
- CentOS 7 (64位)
- 禁用 SELinux 和防火墙
- 配置时间同步
- 配置 root 或非默认用户执行操作权限
一、环境初始化
- 更新系统
# 下载阿里云镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum update -y
- 关闭 SELinux 和防火墙
# 临时关闭
sudo setenforce 0
# 永久禁用
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sudo systemctl stop firewalld
sudo systemctl disable firewalld
- 禁用 Swap
# 临时关闭;关闭swap
sudo swapoff -a
# 永久关闭
sudo sed -i '/swap/d' /etc/fstab
# 可以通过这个命令查看swap是否关闭了
free
- 加载必要内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
说明
这些命令和配置用于确保 Kubernetes 和容器运行时(如 containerd)能够正常工作。以下是详细说明:
- 开启 overlay 和 br_netfilter 模块的原因
1.1 overlay 模块
作用:
overlay 是一种 Linux 文件系统,它允许多个文件系统层叠在一起工作。容器运行时(如 containerd、Docker)依赖 overlayfs 提供高效的文件系统操作,尤其是在创建和管理容器镜像时。
为什么需要加载?
如果未加载 overlay 模块,容器运行时可能无法创建和管理容器的文件系统,从而导致容器无法运行。
1.2 br_netfilter 模块
作用:
br_netfilter 模块允许 Linux 内核的网桥支持网络过滤功能。Kubernetes 需要此功能来处理 Pod 网络之间的流量,并确保网络规则(如 iptables)可以正确应用于桥接网络。
为什么需要加载?
Kubernetes 的 CNI 插件(如 Flannel、Calico)需要使用网桥设备来连接不同 Pod 的网络。如果未加载此模块,网络流量可能无法通过网桥进行过滤,导致 Kubernetes 网络异常。
- 调整内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
验证
lsmod | grep overlay
lsmod | grep br_netfilter
- 配置主机名和 hosts 文件
每台节点:
sudo hostnamectl set-hostname <对应主机名>
修改 /etc/hosts
:
cat <<EOF | sudo tee -a /etc/hosts
192.168.145.153 k8s-master
192.168.145.154 k8s-worker1
192.168.145.155 k8s-worker2
EOF
二、安装 containerd
- 安装 containerd
sudo yum install -y containerd.io
- 配置 containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置
#启用Containerd Cgroup用于限制容器资源使用量,如CPU、内存资源
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
#pause镜像的下载地址
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#g' /etc/containerd/config.toml
#检查 看看输出是否已经修改
grep 'sandbox_image' /etc/containerd/config.toml
grep 'SystemdCgroup' /etc/containerd/config.toml
# 配置镜像加速 注意要留一行空格
vim /etc/containerd/config.toml
#找到[plugins."io.containerd.grpc.v1.cri".registry.mirrors],在下方添加加速器地址
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.rainbond.cc"]
sudo systemctl restart containerd
sudo systemctl enable containerd
要检查下不成功的话手动修改
三、安装 Kubernetes
- 配置 Kubernetes 源
# 在所有master和node节点上执行
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=1
repo_gpgcheck=1
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
sudo yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
sudo systemctl enable kubelet
四、部署 Kubernetes 集群
- 初始化主节点
sudo kubeadm init \
--apiserver-advertise-address=192.168.145.153 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.1.0.0/16
# –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
# –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
# –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,我们这里使用 Calico
初始化完成后,记录 kubeadm join
命令,供后续节点加入使用。
- 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
##要在其他节点控制管理集群 将Master节点/root/.kube目录拷贝到节点上
scp -r /root/.kube 节点IP:/root
- 安装网络插件(如 Calico)
# 在master节点上执行
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
kubectl apply -f calico.yaml
- 加入从节点
在每个从节点执行:
sudo kubeadm join 192.168.145.153:6443 \
--token <your-token> \
--discovery-token-ca-cert-hash sha256:<hash> \
五、验证集群
- 查看容器状态
kubectl get pod -A
#等待所有pod运行正常,有无法运行的通过查看详细
kubectl describe pod <pod-name> -n kube-system
- 查看节点状态
kubectl get nodes
所有节点状态应为 Ready
。
- 运行测试 Pod
kubectl run nginx --image=nginx --port=80
kubectl expose pod nginx --type=NodePort
kubectl get svc
部署完成!