首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

k8s离线安装部署

在 Kubernetes(K8s)离线环境中进行安装和部署需要一些准备工作,因为无法直接使用在线的包管理工具和镜像仓库。以下是一个详细的步骤指南,帮助你在离线环境中成功部署 Kubernetes 集群。

前提条件

  1. 硬件要求
    • 至少 1 台控制平面节点(推荐 3 台以实现高可用性)。
    • 至少 2 台工作节点(根据需求扩展)。
    • 每个节点至少 2 核 CPU 和 2 GB 内存(推荐更多资源)。
  2. 操作系统
    • 推荐使用 Ubuntu 18.04+、CentOS 7 或其他主流 Linux 发行版。
  3. 网络配置
    • 节点之间网络互通,且防火墙规则允许必要的端口通信。
    • 确保所有节点的时间同步(推荐使用 NTP)。
  4. 离线资源准备
    • 下载 Kubernetes 组件二进制文件。
    • 获取所需的 Docker 镜像并保存为 tar 文件。
    • 准备 etcd、CNI 插件(如 Calico、Flannel)等相关组件的离线包。

步骤一:准备工作节点

1.1 更新系统并安装基础工具

在所有节点上执行以下命令:

代码语言:javascript
复制
bashsudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

对于 CentOS:

代码语言:javascript
复制
bashsudo yum update -y
sudo yum install -y epel-release
sudo yum install -y vim wget curl git

1.2 安装 Docker 或容器运行时

Kubernetes 需要一个容器运行时,Docker 是最常用的选择之一。

安装 Docker(以 Ubuntu 为例)​

代码语言:javascript
复制
bashsudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

验证 Docker 安装:

代码语言:javascript
复制
bashdocker --version

1.3 禁用交换分区

Kubernetes 对交换分区的使用有限制,建议禁用交换分区。

代码语言:javascript
复制
bashsudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

步骤二:准备离线安装包

2.1 下载 Kubernetes 组件二进制文件

在一台有网络的机器上下载所需版本的 Kubernetes 二进制文件:

代码语言:javascript
复制
bashcurl -LO "https://dl.k8s.io/v1.26.0/kubernetes-server-linux-amd64.tar.gz"
tar -zxvf kubernetes-server-linux-amd64.tar.gz

将解压后的 kubeletkubectlkubeadm 二进制文件复制到所有节点的 /usr/local/bin/ 目录下,并赋予执行权限。

代码语言:javascript
复制
bashsudo cp kubelet kubectl kubeadm /usr/local/bin/
sudo chmod +x /usr/local/bin/kubelet /usr/local/bin/kubectl /usr/local/bin/kubeadm

2.2 获取并保存 Docker 镜像

在有网络的机器上拉取所需的 Kubernetes 镜像,并保存为 tar 文件:

代码语言:javascript
复制
bashkubeadm config images list --kubernetes-version v1.26.0

根据输出结果,逐个拉取镜像并保存:

代码语言:javascript
复制
bashdocker pull k8s.gcr.io/kube-apiserver:v1.26.0
docker pull k8s.gcr.io/kube-controller-manager:v1.26.0
docker pull k8s.gcr.io/kube-scheduler:v1.26.0
docker pull k8s.gcr.io/kube-proxy:v1.26.0
docker pull k8s.gcr.io/pause:3.6
docker pull k8s.gcr.io/etcd:3.5.1-0
# 根据需要拉取其他镜像

保存镜像为 tar 文件:

代码语言:javascript
复制
bashdocker save -o kube-apiserver_v1.26.0.tar k8s.gcr.io/kube-apiserver:v1.26.0
# 重复上述命令保存其他镜像

将所有 tar 文件传输到离线节点。

2.3 导入 Docker 镜像到离线节点

在每个离线节点上加载镜像:

代码语言:javascript
复制
bashdocker load -i kube-apiserver_v1.26.0.tar
# 重复加载其他镜像

验证镜像是否加载成功:

代码语言:javascript
复制
bashdocker images

步骤三:初始化控制平面节点

在控制平面节点上执行初始化命令。假设使用 kubeadm 进行初始化:

代码语言:javascript
复制
bashsudo kubeadm init --apiserver-advertise-address=<控制平面节点IP> --pod-network-cidr=192.168.0.0/16 --kubernetes-version v1.26.0

初始化完成后,按照输出提示配置 kubectl

代码语言:javascript
复制
bashmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

步骤四:部署网络插件

Kubernetes 需要网络插件来实现 Pod 之间的通信。这里以 Calico 为例。

4.1 下载 Calico 离线配置

在有网络的机器上下载 Calico 的 YAML 配置文件:

代码语言:javascript
复制
bashcurl https://docs.projectcalico.org/manifests/calico.yaml -O

修改 calico.yaml 中的 IP 地址池配置,确保与 kubeadm init 时的 --pod-network-cidr 一致。

calico.yaml 传输到离线节点。

4.2 应用 Calico 配置

在控制平面节点上应用配置:

代码语言:javascript
复制
bashkubectl apply -f calico.yaml

等待网络插件部署完成。

步骤五:加入工作节点

在工作节点上执行 kubeadm join 命令。这个命令在控制平面节点初始化时会提供。

示例:

代码语言:javascript
复制
bashsudo kubeadm join <控制平面节点IP>:6443 --token <token> \
    --discovery-token-ca-cert-hash sha256:<hash>

如果 token 过期,可以在控制平面节点上重新生成:

代码语言:javascript
复制
bashkubeadm token create --print-join-command

将生成的 kubeadm join 命令复制到工作节点并执行。

步骤六:验证集群状态

在控制平面节点上运行以下命令,检查集群状态:

代码语言:javascript
复制
bashkubectl get nodes

所有节点应显示为 Ready 状态。

常见问题排查

  1. 镜像拉取失败
    • 确保所有需要的镜像都已正确导入到每个节点的 Docker 中。
  2. 网络插件无法启动
    • 检查网络插件的 YAML 文件是否正确,确保 CIDR 配置一致。
    • 查看相关 Pod 的日志以获取更多信息。
  3. 节点无法加入集群
    • 检查 kubeadm join 命令是否正确。
    • 确保控制平面节点的防火墙允许工作节点的连接。
    • 确认 token 和 CA 证书哈希值正确。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券