最新 Kubernetes 安装教程 – wiki基地


最新 Kubernetes (K8s) 安装详解:基于 kubeadm 的实践指南

Kubernetes(简称 K8s)已成为容器编排领域的领导者,是云原生应用部署和管理的事实标准。掌握 Kubernetes 的安装与配置是每一位 DevOps 工程师、系统管理员以及希望深入了解云原生技术的开发者的必备技能。随着 Kubernetes 版本的快速迭代,安装方法和最佳实践也在不断更新。本教程旨在提供一个基于 kubeadm 工具的、详细且符合当前最佳实践的 Kubernetes 集群安装指南。

kubeadm 是 Kubernetes 官方提供的集群生命周期管理工具,它简化了创建、升级和管理 Kubernetes 集群的过程,尤其适合用于学习、测试以及中小型生产环境。本教程将重点介绍使用 kubeadm 在一组 Linux 服务器(推荐 Ubuntu/Debian 或 CentOS/RHEL 系)上从零开始搭建一个基本的单 Master、多 Worker 节点的 Kubernetes 集群。

目标读者:

  • 具备 Linux 基础操作知识。
  • 了解 Docker 或其他容器技术的基本概念。
  • 希望手动搭建和理解 Kubernetes 集群内部工作原理。

教程环境假设:

  • 至少两台(推荐三台或更多)满足最低配置要求的 Linux 服务器/虚拟机。一台作为 Master 节点,其余作为 Worker 节点。
  • 所有节点网络互通,且可以访问外网以下载所需镜像和软件包。
  • 拥有所有节点的 root 或 sudo 权限。

集群规划:

  • Master 节点: 1 台 (例如:k8s-master, IP: 192.168.1.100)
  • Worker 节点: 至少 1 台 (例如:k8s-worker1, IP: 192.168.1.101; k8s-worker2, IP: 192.168.1.102)
  • 操作系统: Ubuntu 20.04 LTS / CentOS 7/8 (本教程命令以 Ubuntu 为主,会标注 CentOS/RHEL 的差异)
  • Kubernetes 版本: 选择一个最新的稳定版本 (例如 v1.28.x)
  • 容器运行时: containerd (Kubernetes v1.24+ 已移除 dockershim,推荐使用 containerd 或 CRI-O)
  • 网络插件 (CNI): Calico (提供网络策略功能,性能优异)

最低硬件要求 (建议):

  • Master 节点: 2+ CPU, 2+ GB RAM, 20+ GB 磁盘
  • Worker 节点: 1+ CPU, 2+ GB RAM, 20+ GB 磁盘

第一步:环境准备 (所有节点)

在开始安装 Kubernetes 组件之前,需要在所有节点(Master 和 Worker)上执行以下准备步骤。

1. 设置主机名和 hosts 文件:

确保每个节点都有唯一的主机名,并且所有节点可以通过主机名互相解析。

“`bash

设置主机名 (示例: Master 节点)

sudo hostnamectl set-hostname k8s-master

设置主机名 (示例: Worker 节点)

sudo hostnamectl set-hostname k8s-worker1

编辑 /etc/hosts 文件,添加所有节点的 IP 和主机名映射 (在所有节点上执行)

sudo nano /etc/hosts

添加类似以下内容:

192.168.1.100 k8s-master
192.168.1.101 k8s-worker1
192.168.1.102 k8s-worker2
“`

2. 关闭防火墙 (或配置规则):

为了简化安装过程,可以先关闭防火墙。生产环境强烈建议配置精细的防火墙规则,允许 Kubernetes 各组件所需的端口通信。

“`bash

Ubuntu/Debian

sudo ufw disable

CentOS/RHEL

sudo systemctl stop firewalld
sudo systemctl disable firewalld
“`

Kubernetes 所需端口列表 (部分核心端口):

  • Master 节点:
    • TCP Inbound: 6443 (Kubernetes API Server), 2379-2380 (etcd server client API), 10250 (Kubelet API), 10251 (kube-scheduler), 10252 (kube-controller-manager)
  • Worker 节点:
    • TCP Inbound: 10250 (Kubelet API), 30000-32767 (NodePort Services)
  • 所有节点 (Pod 网络,取决于 CNI 插件):
    • 例如 Calico 可能需要 TCP 179 (BGP), IP-in-IP (Proto 4) 或 VXLAN (UDP 4789)

3. 关闭 SELinux (CentOS/RHEL):

Kubernetes 与 SELinux 的兼容性有时存在问题,建议禁用。

“`bash

临时禁用

sudo setenforce 0

永久禁用 (修改配置文件)

sudo sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/’ /etc/selinux/config

或者设为 disabled,但 permissive 更安全些,重启后生效

重启系统或等待下次重启生效

“`

4. 关闭 Swap 分区:

kubelet 要求必须关闭 Swap 分区才能正常工作。

“`bash

临时关闭

sudo swapoff -a

永久关闭 (注释掉 /etc/fstab 文件中 swap 相关的行)

sudo sed -i ‘/ swap / s/^(.*)$/#\1/g’ /etc/fstab

验证

free -h
“`

5. 配置内核参数:

启用 br_netfilter 模块并设置必要的 sysctl 参数,以允许 iptables 正确地查看桥接流量。

“`bash

创建配置文件

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

加载模块

sudo modprobe overlay
sudo modprobe br_netfilter

设置 sysctl 参数,持久化生效

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 参数,无需重启

sudo sysctl –system
“`

6. 安装容器运行时 (containerd):

Kubernetes 需要一个符合 CRI (Container Runtime Interface) 标准的容器运行时。containerd 是一个流行的、轻量级的选择。

“`bash

(Ubuntu/Debian)

更新 apt 包索引并安装依赖

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

添加 Docker/Containerd 的官方 GPG 密钥 (即使只装 containerd,也常用 Docker 的源)

注意:源和密钥地址可能变化,请参考 containerd 官方文档获取最新指令

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

添加 Docker/Containerd 的 apt 仓库

echo \
“deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新 apt 包索引并安装 containerd

sudo apt-get update
sudo apt-get install -y containerd.io

(CentOS/RHEL)

安装 yum-utils

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加 Docker/Containerd 的 yum 仓库

sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 containerd

sudo yum update
sudo yum install -y containerd.io

— 通用配置 —

生成 containerd 默认配置文件

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

配置 containerd 使用 systemd cgroup driver (重要!)

Kubernetes 推荐使用 systemd cgroup driver,需要与 kubelet 配置保持一致

sudo sed -i ‘s/SystemdCgroup = false/SystemdCgroup = true/’ /etc/containerd/config.toml

重启 containerd 使配置生效并设置开机自启

sudo systemctl restart containerd
sudo systemctl enable containerd
“`

7. 安装 Kubernetes 组件 (kubeadm, kubelet, kubectl):

我们需要安装三个核心组件:
* kubeadm: 用于初始化集群和加入节点。
* kubelet: 运行在每个节点上的代理,负责管理 Pod 和容器。
* kubectl: 命令行工具,用于与集群交互。

“`bash

(Ubuntu/Debian)

更新 apt 包索引并安装依赖

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

添加 Kubernetes 的官方 GPG 密钥 (推荐使用新的社区维护的源)

注意:仓库地址和 GPG 密钥可能会变化,请参考 Kubernetes 官方文档

使用新的社区源 pkgs.k8s.io

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg –dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo ‘deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /’ | sudo tee /etc/apt/sources.list.d/kubernetes.list

更新 apt 包索引并安装指定版本的 K8s 组件 (替换 x.y.z 为你想安装的具体版本)

查询可用版本:apt-cache madison kubeadm

K8S_VERSION=”1.28.4-1.1″ # 示例版本,请查找最新的稳定版
sudo apt-get update
sudo apt-get install -y kubelet=${K8S_VERSION} kubeadm=${K8S_VERSION} kubectl=${K8S_VERSION}

锁定版本,防止意外升级

sudo apt-mark hold kubelet kubeadm kubectl

(CentOS/RHEL)

添加 Kubernetes 的 yum 仓库

注意:仓库地址可能变化,请参考 Kubernetes 官方文档

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

安装指定版本的 K8s 组件 (替换 x.y.z 为你想安装的具体版本)

查询可用版本:yum list kubeadm –showduplicates | sort -r

K8S_VERSION=”1.28.4-0″ # 示例版本,请查找最新的稳定版 (CentOS/RHEL 版本号格式不同)
sudo yum install -y kubelet-${K8S_VERSION} kubeadm-${K8S_VERSION} kubectl-${K8S_VERSION} –disableexcludes=kubernetes

设置 kubelet 开机自启 (但先不启动,等待 kubeadm init/join 完成)

sudo systemctl enable –now kubelet # 使用 –now 会立即启动,但通常在 kubeadm init/join 后才需要,可以先只 enable
sudo systemctl enable kubelet
“`

至此,所有节点的通用环境准备工作完成。


第二步:初始化 Master 节点

选择一台节点作为 Master 节点 (e.g., k8s-master),执行以下操作。

1. (可选) 预拉取镜像:

kubeadm init 会自动拉取所需的控制平面镜像。如果网络不稳定,可以先手动预拉取。

bash
sudo kubeadm config images pull --kubernetes-version=v1.28.4 # 使用你安装的具体版本号

2. 执行 kubeadm init 初始化控制平面:

这是最关键的一步。需要指定一些参数:

  • --apiserver-advertise-address: Master 节点的 IP 地址。
  • --pod-network-cidr: Pod 网络的 CIDR 范围,必须与后续安装的网络插件 (CNI) 配置一致。Calico 通常使用 192.168.0.0/1610.244.0.0/16
  • --kubernetes-version: 指定 K8s 版本 (可选,如果已安装特定版本 kubeadm,它通常会自动匹配)。
  • --control-plane-endpoint: 如果计划构建高可用集群,或者希望使用一个固定的端点(如 VIP 或 DNS),则指定此项。对于单 Master,可以省略或设为 Master IP。
  • --image-repository: 如果无法访问 registry.k8s.io,可以指定国内镜像仓库,例如 registry.aliyuncs.com/google_containers

“`bash

示例命令 (使用 Calico 默认的 CIDR)

sudo kubeadm init \
–apiserver-advertise-address=192.168.1.100 \
–pod-network-cidr=192.168.0.0/16 \
–kubernetes-version=v1.28.4 \
# –image-repository registry.aliyuncs.com/google_containers # 如果需要,取消注释并使用国内镜像源

如果一切顺利,输出会包含以下重要信息:

1. 配置 kubectl 的指令 (给普通用户使用)

2. 用于 Worker 节点加入集群的 kubeadm join 命令 (包含 token 和 CA 证书哈希) – 务必记录下来!

“`

3. 配置 kubectl:

kubeadm init 成功后,会提示如何配置 kubectl 以便与新集群通信。通常是为当前用户(非 root)设置。

“`bash

为当前用户配置 kubectl

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

验证 kubectl 配置是否成功,并查看节点状态 (此时 Master 节点应为 NotReady,因为 CNI 未安装)

kubectl get nodes
kubectl cluster-info
“`

4. 安装网络插件 (CNI):

Kubernetes 集群需要网络插件来实现 Pod 之间的通信以及 Pod 与 Service 之间的通信。这里我们选择安装 Calico。

“`bash

访问 Calico 官方文档获取最新的安装清单文件 URL

https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises

下载 Calico operator 和 custom resources manifests

注意:URL 可能随版本更新,请检查官方文档

curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml -O # 请替换为最新稳定版 URL

(重要)检查下载的 calico.yaml 文件,确认其中的 CALICO_IPV4POOL_CIDR 是否与 kubeadm init 时指定的 –pod-network-cidr 一致。

如果不一致,需要修改 yaml 文件中的 value 字段。

默认 Calico 使用 192.168.0.0/16,如果 kubeadm init 时用了其他 CIDR,需在此修改。

nano calico.yaml

(找到 name: CALICO_IPV4POOL_CIDR 的地方修改 value)

应用 Calico manifests

kubectl apply -f calico.yaml

等待 Calico Pod 启动完成

可以使用以下命令观察 calico-system 命名空间下的 Pod 状态

watch kubectl get pods -n calico-system

当所有 Calico Pod 都处于 Running 状态后,Master 节点的状态应该变为 Ready

kubectl get nodes

输出应显示 Master 节点状态为 Ready

“`

Master 节点安装和配置完成!


第三步:将 Worker 节点加入集群

在所有 Worker 节点 (e.g., k8s-worker1, k8s-worker2) 上执行以下操作。

1. 确保 Worker 节点已完成第一步的所有环境准备工作。

2. 使用 kubeadm join 命令加入集群:

使用在 Master 节点 kubeadm init 成功后输出的 kubeadm join 命令。该命令包含了 Master 节点的地址、Token 和 CA 证书哈希。

“`bash

在 Worker 节点上执行 (使用你从 Master 节点记录的实际命令)

sudo kubeadm join 192.168.1.100:6443 –token \
–discovery-token-ca-cert-hash sha256:

如果忘记了 token 或 token 过期 (默认 24 小时),可以在 Master 节点上重新生成:

kubeadm token create –print-join-command

“`

3. 在 Master 节点上验证 Worker 节点状态:

回到 Master 节点,执行以下命令查看集群节点状态。

“`bash
kubectl get nodes -o wide

等待几分钟,你应该能看到所有 Worker 节点都已加入集群,并且状态为 Ready。

“`


第四步:验证集群功能

集群基本搭建完成,可以部署一个简单的应用来验证。

1. 在 Master 节点上创建一个 Nginx Deployment:

bash
kubectl create deployment nginx-test --image=nginx:latest --replicas=2

2. 查看 Deployment 和 Pod 状态:

“`bash
kubectl get deployment nginx-test
kubectl get pods -o wide

应该能看到两个 Nginx Pod 正在运行,并分布在不同的 Worker 节点上 (如果有多台 Worker)。

“`

3. 创建一个 Service 暴露 Nginx:

创建一个 NodePort 类型的 Service,将 Nginx 服务暴露到节点端口。

bash
kubectl expose deployment nginx-test --type=NodePort --port=80

4. 查看 Service 信息,获取 NodePort 端口:

“`bash
kubectl get service nginx-test

找到类似 PORT(S) 80:3xxxx/TCP 的信息,其中 3xxxx 就是 NodePort 端口。

“`

5. 通过任意节点的 IP 和 NodePort 访问 Nginx:

在浏览器或使用 curl 访问 http://<任意Worker节点IP>:<NodePort>http://<Master节点IP>:<NodePort>

“`bash
curl http://192.168.1.101:3xxxx # 使用实际的 Worker 节点 IP 和获取到的 NodePort

应该能看到 Nginx 的欢迎页面 HTML 源码。

“`

如果能够成功访问,说明你的 Kubernetes 集群已基本正常工作!


第五步:重要后续步骤与考虑

这个基础集群已经搭建完成,但在生产环境中使用之前,还有很多重要的方面需要考虑和配置:

  1. 高可用性 (HA):
    • 控制平面 HA: 部署多个 Master 节点,使用 Keepalived + HAProxy 或类似的负载均衡方案提供虚拟 IP (VIP)。kubeadm 支持 HA 配置。
    • etcd HA: etcd 作为集群状态存储,需要部署为集群模式(通常 3 或 5 个实例)。kubeadm 可以配置堆叠式 (stacked) etcd 或外部 etcd 集群。
  2. 存储 (Storage):
    • 部署 StorageClass 和 PersistentVolume Provisioner,例如 Ceph (Rook), GlusterFS, NFS Subdir External Provisioner, 或云厂商提供的 CSI 驱动,以实现动态卷分配。
  3. 监控 (Monitoring):
    • 部署 Prometheus + Grafana 进行指标监控。
    • 部署 Metrics Server 以支持 kubectl top 命令和 HPA (Horizontal Pod Autoscaler)。kubeadm 后通常需要手动安装 Metrics Server。
  4. 日志 (Logging):
    • 部署 EFK (Elasticsearch, Fluentd, Kibana) 或 Loki + Promtail + Grafana (PLG) 堆栈进行集中式日志管理。
  5. 网络策略 (Network Policies):
    • 如果使用了支持网络策略的 CNI (如 Calico),配置 NetworkPolicy 资源来限制 Pod 间的网络访问,增强安全性。
  6. Ingress Controller:
    • 部署 Ingress Controller (如 Nginx Ingress, Traefik) 来管理外部访问集群服务的入口,提供 L7 负载均衡、SSL/TLS 终止和基于路径/域名的路由。
  7. 安全性强化:
    • 配置 RBAC (Role-Based Access Control) 策略。
    • 定期进行安全审计。
    • 管理 Secret。
    • 考虑使用网络安全工具。
  8. 备份与恢复:
    • 定期备份 etcd 数据 (使用 etcdctl snapshot save)。
    • 备份 PV 数据。
    • 备份 Kubernetes 资源对象 (YAML 定义)。
  9. 集群升级:
    • 熟悉使用 kubeadm upgrade 命令进行 Kubernetes 版本升级的流程。

总结

本教程详细介绍了使用 kubeadm 工具在 Linux 服务器上安装最新稳定版 Kubernetes 集群的步骤,包括环境准备、安装 containerd、安装 K8s 组件、初始化 Master 节点、安装 Calico CNI 网络插件、将 Worker 节点加入集群以及基础的功能验证。

通过手动搭建,你可以更深入地理解 Kubernetes 的架构和各个组件的作用。虽然 kubeadm 简化了许多步骤,但它仍然为你提供了一个相对“原生”的 Kubernetes 体验。以此为基础,你可以继续探索 Kubernetes 的高级特性,如存储、网络策略、监控、日志、高可用性等,逐步构建出满足实际需求的健壮集群。

请记住,Kubernetes 和相关生态系统在不断发展,务必经常查阅官方文档以获取最新的信息和最佳实践。祝你在 Kubernetes 的学习和实践之路上一切顺利!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部