部署 K8s 1.28.2(一主两从)-亲测无坑

发布于:2024-12-21 ⋅ 阅读:(10) ⋅ 点赞:(0)
准备工作
  1. 环境规划
角色 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
  1. 系统要求
    • CentOS 7 (64位)
    • 禁用 SELinux 和防火墙
    • 配置时间同步
    • 配置 root 或非默认用户执行操作权限
一、环境初始化
  1. 更新系统
# 下载阿里云镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum update -y
  1. 关闭 SELinux 和防火墙
# 临时关闭
sudo setenforce 0
# 永久禁用
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sudo systemctl stop firewalld
sudo systemctl disable firewalld
  1. 禁用 Swap
# 临时关闭;关闭swap
sudo swapoff -a
# 永久关闭
sudo sed -i '/swap/d' /etc/fstab
# 可以通过这个命令查看swap是否关闭了
free

  1. 加载必要内核模块
sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
说明

这些命令和配置用于确保 Kubernetes 和容器运行时(如 containerd)能够正常工作。以下是详细说明:

  1. 开启 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 网络异常。
  1. 调整内核参数
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

  1. 配置主机名和 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
  1. 安装 containerd
sudo yum install -y containerd.io
  1. 配置 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
  1. 配置 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
  1. 安装 kubeadm、kubelet 和 kubectl
sudo yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
sudo systemctl enable kubelet
四、部署 Kubernetes 集群
  1. 初始化主节点
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 命令,供后续节点加入使用。

  1. 配置 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
  1. 安装网络插件(如 Calico)
# 在master节点上执行
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
kubectl apply -f calico.yaml
  1. 加入从节点

在每个从节点执行:

sudo kubeadm join 192.168.145.153:6443 \
  --token <your-token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
五、验证集群
  1. 查看容器状态
kubectl get pod -A
#等待所有pod运行正常,有无法运行的通过查看详细
kubectl describe pod <pod-name> -n kube-system

  1. 查看节点状态
kubectl get nodes

所有节点状态应为 Ready

  1. 运行测试 Pod
kubectl run nginx --image=nginx --port=80
kubectl expose pod nginx --type=NodePort
kubectl get svc

部署完成!