K8S环境搭建

步骤一:系统层配置

hostname修改

  • 安装步骤中,NetWork开启,设置主机名

  • 命令行修改

    • hostnamectl set-hostname k8sMaster
    • hostnamectl set-hostname k8sNodeOne
    • hostnamectl set-hostname k8sNodeTwo

配置静态ip

StepOne:网段网关(查看网络信息)

虚拟机处于哪个网段,以及网关是多少。

  1. 打开 VMware Workstation。
  2. 点击顶部菜单栏的 “编辑” (Edit) “虚拟网络编辑器” (Virtual Network Editor)
  3. 选择 VMnet8(如果你用的是 NAT 模式,这是最常用的模式)或 VMnet0(桥接模式)。
    • 如果是 NAT 模式(推荐): 点击 “NAT 设置” (NAT Settings)
    • 记下以下信息(非常重要):
      • 子网 IP (Subnet IP): 例如 192.168.136.0
      • 子网掩码 (Subnet Mask): 例如 255.255.255.0
      • 网关 IP (Gateway IP): 例如 192.168.136.2 (注意:VMware NAT 模式下网关通常以 .2 结尾,而不是 .1)
StepTwo:在虚拟机内部设置固定 IP
情况 A:CentOS 7 / RHEL

CentOS 7 使用 ifcfg 文件配置网络。

  1. 进入终端,切换到 root 用户。

  2. 找到网卡配置文件:

    cd /etc/sysconfig/network-scripts/
    ls
    # 找到类似 ifcfg-ens33 或 ifcfg-eth0 的文件
    
  3. 编辑该文件(例如 vi ifcfg-ens33),修改或添加以下内容:

    # 将 BOOTPROTO 改为 static
    BOOTPROTO="static"
    
    # 确保开机启动
    ONBOOT="yes"
    
    # 添加以下几行(根据第一步记下的信息填写)
    # IPADDR 是你想固定的 IP,必须在子网范围内,例如 192.168.136.100
    IPADDR=192.168.136.100
    # 子网掩码
    NETMASK=255.255.255.0
    # 网关 (VMware NAT 下通常是 .2)
    GATEWAY=192.168.136.2
    # DNS (可以用网关,也可以用谷歌 8.8.8.8)
    DNS1=192.168.136.2
    DNS2=8.8.8.8
    
  4. 保存并退出(:wq)。

  5. 重启网络服务:

    systemctl restart network
    

hosts修改

  • cat <>/etc/hosts 192.168.136.134 k8sMaster 192.168.136.135 k8sNodeOne 192.168.136.136 k8sNodeTwo EOF
  • 依次三台主机执行

Gemini3Pro提示词

  • 现在我要搭建kubernetes,已知条件如下:

    1,已经准备好三台centos主机

    2,三台主机无国外互联网环境

    3,已经做好的配置 hostname修改 安装步骤中,NetWork开启,设置主机名 命令行修改 hostnamectl set-hostname k8sMaster hostnamectl set-hostname k8sNodeOne hostnamectl set-hostname k8sNodeTwo

    hosts修改依次三台主机执行 cat <>/etc/hosts 192.168.136.137 k8sMaster 192.168.136.139 k8sNodeOne 192.168.136.138 k8sNodeTwo EOF

    现在教我从零开始搭建kubernetes

步骤二:基建整备 (OS Tuning)

1. 关闭防火墙与SELinux

# 停止并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 禁用SELinux (临时 + 永久)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

2. 关闭Swap (关键)

# 临时关闭
swapoff -a

# 永久关闭 (注释掉fstab中的swap行)
sed -i '/swap/s/^/#/' /etc/fstab

3. 内核参数调优与模块加载

# 加载必要模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用参数
sysctl --system

步骤三:安装容器

安装 containerd。比Docker更轻量,更符合K8s的CRI标准。

1. 安装 containerd

# 重装官方镜像源
sudo rm -rf /etc/yum.repos.d/*
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum clean all
sudo yum makecache

# 安装yum工具
yum install -y yum-utils

# 添加Docker官方源 (containerd在Docker源里,虽然我们不用Docker引擎)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装containerd
yum install -y containerd.io

# 生成默认配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

2. 修改Cgroup驱动 (架构师的特别提醒) 这是新手最容易翻车的地方。Systemd是CentOS的初始化系统,K8s希望Cgroup驱动也用Systemd,而不是Cgroupfs,否则会导致资源管理冲突。

# 使用sed命令将 SystemdCgroup = false 改为 true
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 启动 containerd 并设置开机自启
systemctl enable --now containerd

步骤四:安装 Kubernetes 组件

现在安装 K8s 的“三驾马车”:

  • kubelet: 运行在所有节点上的“节点代理”。
  • kubeadm: 集群引导工具。
  • kubectl: 命令行指挥棒。

1. 添加 Kubernetes 官方源 (v1.28+) 注意:Google的源近期有变动,这里使用新的社区源 pkgs.k8s.io。

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl
EOF

2. 安装工具

# 安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 启动 kubelet (现在它会处于crash loop状态,直到kubeadm init,这是正常的)
systemctl enable --now kubelet

步骤五:控制平面初始化 (Control Plane Setup)

⚠️ 注意:仅在 k8sMaster (192.168.136.137) 上执行

我们要初始化集群的大脑。这里我选择 Calico 作为网络插件,因为它支持BGP协议,且网络策略(Network Policy)功能强大,符合资深架构师的品味。为了配合Calico,我们需要指定Pod网段。

# 在 Master 节点执行
kubeadm init \
  --apiserver-advertise-address=192.168.136.137 \
  --image-repository registry.k8s.io \
  --kubernetes-version v1.29.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=192.168.0.0/16

(注:如果你的网络环境拉取 registry.k8s.io 较慢,可以考虑换成阿里云镜像源,但你说了要官方资源,所以我保留了官方源)

执行成功后,你会看到一段类似 kubeadm join … 的输出。请务必复制这段命令,保存好!这是Worker节点的“入场券”。

配置 kubectl 权限:

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

步骤六:部署网络插件 (CNI)

⚠️ 注意:仅在 k8sMaster 上执行

没有网络插件,CoreDNS起不来,Node状态会一直是 NotReady。我们安装 Calico。

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml

(稍等几分钟,等待Calico的Pod变绿)


步骤七:节点加入 (Scale Out)

⚠️ 注意:在 k8sNodeOne 和 k8sNodeTwo 上执行

使用你在第四阶段保存的那个 kubeadm join 命令。如果你弄丢了,可以在 Master 上运行 kubeadm token create —print-join-command 重新获取。

命令长这样(不要直接复制我的,用你生成的):

kubeadm join 192.168.136.137:6443 --token <你的token> \
    --discovery-token-ca-cert-hash sha256:<你的hash>

步骤八:验收 (Verification)

回到 Master 节点,检验我们的成果。

kubectl get nodes

如果一切顺利,你应该看到类似下面的输出:

NAME           STATUS   ROLES           AGE     VERSION
k8sMaster      Ready    control-plane   5m      v1.29.0
k8sNodeOne     Ready    <none>          2m      v1.29.0
k8sNodeTwo     Ready    <none>          2m      v1.29.0

架构师总结: 你现在拥有了一个基于 containerd 运行时、Calico 网络的标准 Kubernetes 集群。

  • 可扩展性:只要网络互通,随时可以通过 kubeadm join 增加算力。
  • 规范性:使用了 Systemd Cgroup 驱动,避免了不稳定的资源争抢。