一、什么是 Kubernetes

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它由 Google 最初设计并捐赠给云原生计算基金会(CNCF),现已成为容器编排领域的事实标准。

核心概念

Pod:最小的部署单元,包含一个或多个共享资源的容器。
Deployment:定义 Pod 的副本数和更新策略,支持滚动更新和回滚。
Service:为一组 Pod 提供稳定的 IP 和 DNS 名称,实现负载均衡。
Namespace:逻辑隔离集群资源,支持多租户环境。

核心组件

控制平面(Control Plane)

  1. API Server:提供集群管理的 REST API 接口。
  2. Scheduler:决定容器在哪个节点上运行。
  3. Controller Manager:负责节点状态、副本数等控制逻辑。
  4. etcd:分布式键值存储,保存集群状态数据。

工作节点(Worker Node)
5. kubelet:与控制平面通信,管理节点上的容器。
6. kube-proxy:处理网络规则和负载均衡。
7. 容器运行时(如 Docker、containerd):实际运行容器的软件。

二、K8s 集群的初始化

环境准备

小tips:内存不足时,可以去掉一个·计算节点

主机名 IP地址 最低配置
harbor 192.168.88.240 2CPU,4G内存
master 192.168.88.10 2CPU,4G内存
node1 192.168.88.11 2CPU,2G内存
node2 192.168.88.12 2CPU,2G内存
node3 192.168.88.13 2CPU,2G内存

控制节点配置

配置 yum 软件仓库

# 上传K8s相关包到Harbor主机
# 通过ftp服务对外提供的yum仓库访问路径
/var/ftp/rpms/
# 更新仓库清单:repodata
createrepo --update /var/ftp/rpms/

系统环境配置

# 在已配置yum源的基础上,新增yum源
vim /etc/yum.repos.d/k8s.repo
[k8s]
name=Rocky Linux $releasever - Kubernetes
baseurl="ftp://192.168.88.240/rpms"
enabled=1
gpgcheck=0

# 禁用swap交换分区和firewall
sed '/swap/d' -i /etc/fstab
swapoff -a
dnf remove -y firewalld-*
# 可通过以下命令检查内存及交换分区情况
free -h

安装软件包

# 配置本地域名解析
vim /etc/hosts
192.168.88.240  harbor
192.168.88.10   master
192.168.88.11   node1
192.168.88.12   node2
192.168.88.13   node3

# 安装Kubernetes相关工具和依赖包
dnf install -y kubeadm kubelet kubectl containerd.io ipvsadm nftables iproute-tc
# 生成containerd的默认配置文件
containerd config default > /etc/containerd/config.toml
# 编辑containerd的配置文件
vim /etc/containerd/config.toml
# 配置containerd使用Harbor镜像仓库的pause镜像
# 指定pause镜像的仓库地址
67:     sandbox_image = "harbor:443/k8s/pause:3.10"
# 启用systemd cgroup驱动
139:    SystemdCgroup = true
# 设置证书目录路径
162:    config_path = "/etc/containerd/certs.d"

# 创建containerd证书目录
mkdir -p /etc/containerd/certs.d
# 进入证书目录并创建Harbor仓库的配置目录
cd /etc/containerd/certs.d
mkdir harbor:443
# 编辑Harbor仓库的配置文件
vim harbor:443/hosts.toml
# 配置Harbor仓库的访问设置
server = "https://harbor:443"
[host."http://192.168.88.240:443"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true

# 将Harbor仓库的配置复制到默认配置目录
cp -a harbor:443 _default
# kubelet和containerd服务设置开机自启
systemctl enable --now kubelet containerd

配置内核参数

# 设置开机自动加载以下内核模块,文件名以.conf结尾即可
vim /etc/modules-load.d/k8s.conf
# 启用桥接网络的iptables支持,用于容器网络
br_netfilter
# 启用连接跟踪模块,用于网络连接跟踪
xt_conntrack
# 启动服务,加载模块
systemctl start systemd-modules-load.service

# 设置开机自动设置内核模块参数,优化Kubernetes网络性能
vim /etc/sysctl.d/99-k8s.conf
# 启用IP转发,允许节点转发数据包
net.ipv4.ip_forward = 1
# 允许桥接接口使用iptables规则
net.bridge.bridge-nf-call-iptables = 1
# 设置连接跟踪的最大数量,防止高负载下连接被拒绝
net.netfilter.nf_conntrack_max = 65536

# 设置内核模块参数
sysctl -p /etc/sysctl.d/99-k8s.conf

导入 K8s 镜像

# 安装Docker
dnf install -y docker-ce
# 配置私有镜像仓库
vim /etc/docker/daemon.json
{
    "registry-mirrors":["https://harbor:443"],
    "insecure-registries":["harbor:443"]
}
# 配置Docker服务开机自启,并查看镜像仓库是否配置成功
systemctl enable --now docker
docker info
...
Insecure Registries:
  harbor:443
  ::1/128
  127.0.0.0/8
 Registry Mirrors:
  https://harbor:443/
 Live Restore Enabled: false

# 上传K8s相关镜像到本地
# 登录Harbor仓库
docker login harbor:443
# 提前在Harbor仓库中新建k8s项目
# 加载镜像并上传到Harbor仓库
docker load -i init/v1.32.2.tar.xz
for img in $(docker images --format '{{.Repository}}:{{.Tag}}')
do
    [[ "${img}" =~ ^"harbor:443/".+ ]] && continue
    docker tag ${img} harbor:443/k8s/${img##*/}
    docker push harbor:443/k8s/${img##*/}
    docker rmi ${img} harbor:443/k8s/${img##*/}
done

添加 Tab 键支持

# 生成kubeadm和kubectl命令的Bash补全脚本
# 将其保存到/etc/bash_completion.d/下的文件中并交给source执行
source <(kubeadm completion bash | tee /etc/bash_completion.d/kubeadm)
source <(kubectl completion bash | tee /etc/bash_completion.d/kubectl)

初始化 master 节点

# --dry-run:模拟运行 --config:指定初始化的配置文件
kubeadm init --config=init/init.yaml --dry-run 2> error.log
cat error.log	

rm -rf error.log /etc/kubernetes/tmp
# 主控节点初始化,将初始化产生的信息保存到日志中
kubeadm init --config=init/init.yaml | tee init/init.log
# 若初始化失败,可将错误日志发给AI进行查看
# 管理授权,以下命令初始化成功后会输出到屏幕中
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 验证安装结果
kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   22s   v1.32.2

安装网络插件

上传镜像

# 上传K8s相关插件到本地
cd plugins/calico
# 加载镜像并上传到Harbor仓库
docker load -i calico.tar.xz
for img in $(docker images --format '{{.Repository}}:{{.Tag}}')
do
    [[ "${img}" =~ ^"harbor:443/".+ ]] && continue
    docker tag ${img} harbor:443/k8s/${img##*/}
    docker push harbor:443/k8s/${img##*/}
    docker rmi ${img} harbor:443/k8s/${img##*/}
done

安装 calico 插件

# 更新镜像地址
sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/k8s/\3,' calico.yaml
# 查看修改情况
grep image: calico.yaml
          image: harbor:443/k8s/cni:v3.29.2
          image: harbor:443/k8s/cni:v3.29.2
          image: harbor:443/k8s/node:v3.29.2
          image: harbor:443/k8s/node:v3.29.2
          image: harbor:443/k8s/kube-controllers:v3.29.2

# 通过资源清单文件安装网络组件
kubectl create -f calico.yaml

# 查看状态
kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   23m   v1.32.2

计算节点配置

获取凭证

# 在master节点上获取凭证
# 查看token
kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
abcdef.0123456789abcdef   23h         2026-03-21T16:13:21Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
# 获取hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt \
|openssl rsa -pubin -outform der |openssl dgst -sha256 -hex

# 删除token
kubeadm token delete abcdef.0123456789abcdef
bootstrap token "abcdef" deleted

# 创建token --ttl:指定过期时间,0表示永不过期
# 此命令会输出安装计算节点的命令,可将其保存到文件中
kubeadm token create --ttl=0 --print-join-command |tee info.txt

初始化 node 节点

# node节点执行控制节点的安装步骤2、3、4
kubeadm join <APIServer的IP>:6443 --token <你的token> \
--discovery-token-ca-cert-hash sha256:<ca 证书 hash>
# 在master节点上验证
kubectl get nodes
NAME     STATUS   ROLES           AGE    VERSION
master   Ready    control-plane   16m    v1.32.2
node1    Ready    <none>          104s   v1.32.2
node2    Ready    <none>          97s    v1.32.2

查看集群状态

# 以下容器运行起来即为搭建成功
kubectl -n kube-system get pods
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-7f5bcc6579-9zb7n   1/1     Running   0             12m
calico-node-bq6gd                          1/1     Running   0             12m
calico-node-d8bhp                          1/1     Running   0             4m35s
calico-node-g28ww                          1/1     Running   0             4m42s
coredns-74967867c-8bbcz                    1/1     Running   0             19m
coredns-74967867c-gwv76                    1/1     Running   0             19m
etcd-master                                1/1     Running   0             19m
kube-apiserver-master                      1/1     Running   0             19m
kube-controller-manager-master             1/1     Running   3 (11m ago)   19m
kube-proxy-bscnf                           1/1     Running   0             4m35s
kube-proxy-fwx98                           1/1     Running   0             19m
kube-proxy-xwmg2                           1/1     Running   0             4m42s
kube-scheduler-master                      1/1     Running   2             19m
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐