Pods was rejected as an implicit dependency for 'libPods.a' because its architectures 'x86_64' didn'

本文介绍在iOS开发中使用cocoaPods引入第三方包时遇到的架构不匹配错误,并提供详细的解决步骤。包括如何设置项目的Architectures、BaseSDK、BuildActiveArchitectureOnly、SupportedPlatforms和ValidArchitectures等。

引入cocoaPods后,第一次编译报这个错误

Pods was rejected as an implicit dependency for 'libPods.a' because its architectures 'x86_64' didn't contain all required architectures 'i386'

查了些资料,在网上有一种解决方法是去设置pod工程的  valid Architectures 与你的项目工程的 valid Architectures 一致

试了试没有成功,

现在编写iOS程序,引用到第三方包,运用cocoapods进行包管理已经成为了一个趋势了,但是最近运用cocoapods构建的应用却在64bit的iOS7系统中有警告的产生,具体的警告信息如下面所示:

Pods was rejected as an implicit dependency for ‘libPods.a’ because its architectures ‘i386’ didn’t contain all required architectures ‘x86_64’

具体的解决方案如下: 在TAGETS =》 Build Settings 中重新设置值.

  1. Architectures: Standard architectures (armv7, armv7s)
  2. Base SDK: Latest iOS (iOS 7.0)
  3. Build Active Architecture Only: YES
  4. Supported Platforms: iOS
  5. Valid Architectures: arm64 armv7 armv7s

最后,如下代码

post_install do |installer| installer.project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ARCHS'] = "armv7" end end end

纪念下,另外,想使用任何包,可以先到

http://www.cocoapods.org 搜索,真的很好用

<think>我们遇到了三个主要问题: 1. 安装docker-ce需要GLIBC_2.34,但系统不满足。 2. 安装docker-ce-cli需要GLIBC_2.34,但系统不满足。 3. containerd.io与已安装的docker-runc冲突。 解决方案: 1. 升级系统或安装兼容的docker版本(但可能没有兼容版本)。 2. 移除冲突的docker-runc包,然后安装containerd.io。 3. 考虑使用其他容器运行时(如containerd)或者使用系统自带的容器运行时。 但是,我们的目标是在离线环境中安装Kubernetes,而Kubernetes支持多种容器运行时。我们可以不使用docker,而是直接使用containerd。 因此,调整策略: - 跳过docker的安装,直接安装containerd。 - 在下载脚本中,我们不再安装docker,而是直接安装containerd和runc。 修改步骤: 1. 在下载脚本中,移除安装docker的步骤。 2. 在下载容器运行时部分,我们已经下载了containerd和runc,所以直接使用这些rpm包安装即可。 3. 在安装脚本中,安装containerd而不是docker。 但是,在下载脚本中,我们之前是尝试安装docker,现在改为直接安装containerd。 然而,错误信息显示,在下载脚本运行的环境中,我们尝试安装docker时出现了问题。因此,我们需要修改下载脚本,避免安装docker。 具体修改: 1. 在下载脚本的main函数中,移除安装docker的代码。 2. 改为直接安装containerd和runc(通过rpm包)。 但是注意:下载脚本本身运行在在线环境(用于下载离线包),因此我们需要确保下载脚本能够正确安装containerd(作为下载环境的一部分,用于拉取镜像)。如果下载环境不需要containerd,我们可以直接使用docker命令,但这里我们遇到了问题。 替代方案:在下载环境中,我们使用podman代替docker,因为podman不需要守护进程,且与docker命令兼容。 修改计划: 1. 在下载脚本中,使用podman代替docker。 2. 安装podman(通过yum),然后使用podman拉取镜像。 因为我们的系统是CentOS/RHEL 8,podman是默认的容器工具。 具体步骤: - 在下载脚本的main函数中,安装podman(使用dnf安装)。 - 使用podman代替docker命令拉取镜像。 同时,为了避免containerd.io与docker-runc的冲突,我们可以在下载环境中不安装docker相关的包,只安装podman。 修改下载脚本: 1. 移除安装docker的步骤。 2. 安装podman: ```bash dnf install -y podman ``` 3. 将脚本中所有的`docker`命令替换为`podman`。 注意:podman和docker的命令在拉取镜像和保存镜像是兼容的。 但是,在安装脚本中(离线环境安装Kubernetes),我们使用的是containerd作为容器运行时,因此不需要docker。所以安装脚本中我们安装containerd,这个不变。 总结修改: 1. 在下载脚本中,安装podman代替docker。 2. 使用podman拉取镜像并保存。 3. 在下载脚本中,不再安装docker,因此不会出现docker-ce和docker-runc的冲突。 另外,GLIBC版本问题:如果系统版本较低,可能无法安装podman?但通常CentOS 8的podman对glibc的要求应该满足。如果遇到同样问题,可能需要升级系统或使用低版本podman。 如果系统实在无法安装podman,我们还可以使用containerd的客户端工具ctr,但是ctr命令较为复杂,不如podman方便。 因此,我们选择使用podman。 修改后的下载脚本main函数部分(与容器工具相关的部分): ```bash main() { # ... 其他代码 ... # 配置国内镜像源 configure_yum_mirrors # 检查podman是否安装,如果没有则安装 if ! command -v podman &> /dev/null; then log "安装podman..." dnf install -y podman >>$LOG_FILE 2>&1 podman --version | tee -a $LOG_FILE fi # 执行下载步骤 create_dirs download_system_deps download_container_runtime download_kubernetes download_k8s_images # 在这个函数中,我们使用podman代替docker download_network_addon generate_repo_metadata generate_install_script # ... 其他代码 ... } ``` 然后,修改`download_k8s_images`和`download_network_addon`函数,将`docker`替换为`podman`。 例如: ```bash download_k8s_images() { # ... for image in "${images[@]}"; do # ... podman pull $image >>$LOG_FILE 2>&1 || { # ... } podman save -o "$OFFLINE_DIR/images/$img_name.tar" $image >>$LOG_FILE 2>&1 # ... done # ... } ``` 同样,在`download_network_addon`函数中,将docker命令替换为podman。 这样,我们避免了在下载环境中安装docker,从而避免了GLIBC版本问题和包冲突问题。 此外,在下载容器运行时组件时,我们只下载containerd和runc的rpm包,不下载docker相关包,因此不会触发冲突。 最后,在安装脚本中(用于离线环境),我们安装containerd,而不是docker,所以不会出现docker-runc的冲突。 因此,我们重新整合脚本,提供修复后的完整下载脚本。 注意:由于下载环境可能没有安装podman,我们使用dnf安装,而dnf源已经配置为国内源,所以安装速度会很快。 完整脚本如下(只修改了相关部分,其他部分保持不变):</think>针对您遇到的错误,我将提供一个完整的解决方案,包括修复脚本和详细解释。问题主要涉及 GLIBC 版本不兼容和包冲突,以下是修复方案: ### 修复后的 Kubernetes 离线下载脚本 ```bash #!/bin/bash # Kubernetes 离线部署包下载脚本(兼容低版本 GLIBC) # 支持 CentOS/RHEL 8 系统 # 版本: v1.5 # 最后更新: 2025-07-30 set -euo pipefail trap 'handle_error $? $LINENO' ERR # ===== 配置参数 ===== K8S_VERSION="1.31.0" # Kubernetes 版本 CALICO_VERSION="3.27.0" # Calico 网络插件版本 CONTAINERD_VERSION="1.7.17" # Containerd 版本 OFFLINE_DIR="${1:-/opt/k8s-offline}" # 离线包保存目录 MIRROR_SITE="https://mirrors.aliyun.com" # 镜像源 LOG_FILE="/var/log/k8s-offline-download.log" # 日志文件 # ===== 国内镜像源配置 ===== DOCKER_MIRROR="https://mirrors.aliyun.com/docker-ce" K8S_IMAGE_MIRROR="registry.aliyuncs.com/google_containers" CALICO_MIRROR="docker.m.daocloud.io" CALICO_MANIFEST_MIRROR="https://docs.tigera.io" # ===== 颜色定义 ===== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 无颜色 # ===== 错误处理 ===== handle_error() { local exit_code=$1 local line_no=$2 echo -e "${RED}[ERROR] 下载失败 (退出码: $exit_code, 行号: $line_no)${NC}" | tee -a $LOG_FILE echo -e "${YELLOW}查看详细日志: tail -n 50 $LOG_FILE${NC}" exit $exit_code } # ===== 日志记录 ===== log() { local msg=$1 local level=${2:-INFO} local color=$NC case $level in SUCCESS) color=$GREEN ;; ERROR) color=$RED ;; WARNING) color=$YELLOW ;; DOWNLOAD) color=$BLUE ;; *) color=$NC ;; esac echo -e "${color}[$level] $msg${NC}" | tee -a $LOG_FILE } # ===== 创建目录结构 ===== create_dirs() { log "创建离线包目录结构..." local dirs=( "rpms" "images" "tools" "manifests" "binaries" "repo" "configs" "scripts" "cni" ) for dir in "${dirs[@]}"; do mkdir -p "$OFFLINE_DIR/$dir" done log "目录结构创建完成: $OFFLINE_DIR" SUCCESS } # ===== 配置国内Yum源 ===== configure_yum_mirrors() { log "配置国内Yum镜像源..." # 备份原有源 mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null || true # 添加阿里云源 cat > /etc/yum.repos.d/CentOS-Base.repo <<'EOF' [base] name=CentOS-$releasever - Base - mirrors.aliyun.com baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official [extras] name=CentOS-$releasever - Extras - mirrors.aliyun.com baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official [epel] name=Extra Packages for Enterprise Linux $releasever - $basearch baseurl=https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch enabled=1 gpgcheck=0 EOF # 添加Kubernetes国内源 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 # 清理缓存 dnf clean all dnf makecache log "Yum镜像源配置完成" SUCCESS } # ===== 下载系统依赖包 ===== download_system_deps() { log "下载系统依赖包..." # 依赖包列表 local deps=( "socat" "conntrack-tools" "ebtables" "ethtool" "ipset" "iptables" "nfs-utils" "chrony" "bash-completion" "createrepo" "device-mapper-persistent-data" "lvm2" "yum-utils" ) # 下载依赖包 dnf download --resolve --alldeps --destdir="$OFFLINE_DIR/rpms" "${deps[@]}" >>$LOG_FILE 2>&1 || { log "依赖包下载失败" ERROR exit 1 } # 验证下载 local rpm_count=$(find "$OFFLINE_DIR/rpms" -name "*.rpm" | wc -l) if [ "$rpm_count" -lt 20 ]; then log "下载的RPM包数量不足 ($rpm_count),可能存在问题" WARNING else log "下载完成: $rpm_count 个系统依赖包" SUCCESS fi } # ===== 下载容器运行时 ===== download_container_runtime() { log "下载容器运行时组件..." # 解决冲突:移除冲突的docker-runc包 if rpm -q docker-runc &>/dev/null; then log "检测到冲突的docker-runc包,正在移除..." rpm -e --nodeps docker-runc >>$LOG_FILE 2>&1 || { log "移除docker-runc失败" WARNING } fi # 下载 containerd(兼容低版本GLIBC) log "下载兼容GLIBC的containerd版本..." dnf download --resolve --destdir="$OFFLINE_DIR/rpms" \ containerd-${CONTAINERD_VERSION} \ runc \ container-selinux >>$LOG_FILE 2>&1 || { log "containerd 下载失败" ERROR exit 1 } # 下载 CNI 插件 local cni_plugins=( "containernetworking-plugins" "cni-plugins" ) for plugin in "${cni_plugins[@]}"; do dnf download --resolve --destdir="$OFFLINE_DIR/cni" $plugin >>$LOG_FILE 2>&1 || { log "$plugin 下载失败" WARNING } done log "容器运行时组件下载完成" SUCCESS } # ===== 下载Kubernetes组件 ===== download_kubernetes() { log "下载Kubernetes $K8S_VERSION 组件..." # 下载核心组件(兼容低版本GLIBC) local k8s_packages=( "kubelet-$K8S_VERSION" "kubeadm-$K8S_VERSION" "kubectl-$K8S_VERSION" "kubernetes-cni" ) dnf download --resolve --destdir="$OFFLINE_DIR/rpms" "${k8s_packages[@]}" >>$LOG_FILE 2>&1 || { log "Kubernetes组件下载失败" ERROR exit 1 } log "Kubernetes组件下载完成" SUCCESS } # ===== 下载Kubernetes镜像 ===== download_k8s_images() { log "下载Kubernetes $K8S_VERSION 镜像..." # 核心镜像列表(使用国内镜像源) local images=( "$K8S_IMAGE_MIRROR/kube-apiserver:v$K8S_VERSION" "$K8S_IMAGE_MIRROR/kube-controller-manager:v$K8S_VERSION" "$K8S_IMAGE_MIRROR/kube-scheduler:v$K8S_VERSION" "$K8S_IMAGE_MIRROR/kube-proxy:v$K8S_VERSION" "$K8S_IMAGE_MIRROR/pause:3.9" "$K8S_IMAGE_MIRROR/etcd:3.5.12-0" "$K8S_IMAGE_MIRROR/coredns:v1.11.1" ) # 下载并保存镜像 for image in "${images[@]}"; do local img_name=$(echo $image | awk -F/ '{print $NF}' | tr ':' '-') log "DOWNLOAD 下载镜像: $image" DOWNLOAD # 使用podman代替docker(避免GLIBC依赖问题) if command -v podman &>/dev/null; then podman pull $image >>$LOG_FILE 2>&1 || { log "镜像下载失败: $image" ERROR continue } podman save -o "$OFFLINE_DIR/images/$img_name.tar" $image >>$LOG_FILE 2>&1 else # 回退到docker docker pull $image >>$LOG_FILE 2>&1 || { log "镜像下载失败: $image" ERROR continue } docker save -o "$OFFLINE_DIR/images/$img_name.tar" $image >>$LOG_FILE 2>&1 fi log "镜像保存成功: $img_name.tar" SUCCESS done log "Kubernetes镜像下载完成" SUCCESS } # ===== 下载网络插件 ===== download_network_addon() { log "下载Calico网络插件 v$CALICO_VERSION..." # 下载Calico镜像(使用国内镜像源) local calico_images=( "$CALICO_MIRROR/calico/cni:v$CALICO_VERSION" "$CALICO_MIRROR/calico/node:v$CALICO_VERSION" "$CALICO_MIRROR/calico/kube-controllers:v$CALICO_VERSION" "$CALICO_MIRROR/calico/pod2daemon-flexvol:v$CALICO_VERSION" ) for image in "${calico_images[@]}"; do local img_name=$(echo $image | awk -F/ '{print $NF}' | tr ':' '-') log "DOWNLOAD 下载镜像: $image" DOWNLOAD # 使用podman代替docker if command -v podman &>/dev/null; then podman pull $image >>$LOG_FILE 2>&1 || { log "镜像下载失败: $image" ERROR continue } podman save -o "$OFFLINE_DIR/images/$img_name.tar" $image >>$LOG_FILE 2>&1 else docker pull $image >>$LOG_FILE 2>&1 || { log "镜像下载失败: $image" ERROR continue } docker save -o "$OFFLINE_DIR/images/$img_name.tar" $image >>$LOG_FILE 2>&1 fi log "镜像保存成功: $img_name.tar" SUCCESS done # 下载Calico manifest local calico_manifest_url="$CALICO_MANIFEST_MIRROR/archive/v$CALICO_VERSION/manifests/calico.yaml" curl -sSL -o "$OFFLINE_DIR/manifests/calico.yaml" "$calico_manifest_url" || { log "Calico manifest下载失败" WARNING # 使用备用源 curl -sSL -o "$OFFLINE_DIR/manifests/calico.yaml" "https://ghproxy.com/$calico_manifest_url" || { log "备用源下载失败" ERROR exit 1 } } # 修改CIDR配置 sed -i 's/# - name: CALICO_IPV4POOL_CIDR/- name: CALICO_IPV4POOL_CIDR/' "$OFFLINE_DIR/manifests/calico.yaml" sed -i 's/# value: "192.168.0.0\/16"/ value: "192.168.0.0\/16"/' "$OFFLINE_DIR/manifests/calico.yaml" log "网络插件下载完成" SUCCESS } # ===== 生成仓库元数据 ===== generate_repo_metadata() { log "生成本地仓库元数据..." # 移动所有RPM到仓库目录 find "$OFFLINE_DIR" -name "*.rpm" -exec mv {} "$OFFLINE_DIR/repo/" \; 2>/dev/null || { log "没有RPM包可移动,请检查下载步骤" WARNING } # 创建仓库元数据 createrepo "$OFFLINE_DIR/repo" >>$LOG_FILE 2>&1 || { log "创建仓库元数据失败" ERROR exit 1 } # 创建仓库配置文件 cat > "$OFFLINE_DIR/configs/local-repo.conf" <<EOF [k8s-offline] name=Kubernetes Offline Repository baseurl=file://$OFFLINE_DIR/repo enabled=1 gpgcheck=0 priority=1 EOF # 验证仓库 if [ -f "$OFFLINE_DIR/repo/repodata/repomd.xml" ]; then log "仓库元数据生成完成" SUCCESS else log "仓库元数据文件缺失" ERROR exit 1 fi } # ===== 生成安装脚本 ===== generate_install_script() { log "生成安装脚本..." # 创建主安装脚本 cat > "$OFFLINE_DIR/scripts/install-k8s.sh" <<'EOF' #!/bin/bash # Kubernetes 离线安装脚本(解决GLIBC和包冲突) # 版本: v1.2 set -euo pipefail # ===== 配置参数 ===== OFFLINE_DIR=$(dirname $(realpath $0))/.. POD_CIDR="192.168.0.0/16" SERVICE_CIDR="10.96.0.0/12" LOG_FILE="/var/log/k8s-install.log" # ===== 颜色定义 ===== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 无颜色 # ===== 日志函数 ===== log() { local msg=$1 local level=${2:-INFO} local color=$NC case $level in SUCCESS) color=$GREEN ;; ERROR) color=$RED ;; WARNING) color=$YELLOW ;; *) color=$NC ;; esac echo -e "${color}[$level] $msg${NC}" | tee -a $LOG_FILE } # ===== 解决包冲突 ===== resolve_conflicts() { log "解决包冲突..." # 检查并移除冲突的docker-runc包 if rpm -q docker-runc &>/dev/null; then log "检测到冲突的docker-runc包,正在移除..." rpm -e --nodeps docker-runc >>$LOG_FILE 2>&1 || { log "移除docker-runc失败" WARNING } fi # 检查并移除冲突的containerd.io包 if rpm -q containerd.io &>/dev/null; then log "检测到冲突的containerd.io包,正在移除..." rpm -e --nodeps containerd.io >>$LOG_FILE 2>&1 || { log "移除containerd.io失败" WARNING } fi log "包冲突解决完成" SUCCESS } # ===== 准备系统环境 ===== prepare_system() { log "准备系统环境..." # 禁用 SELinux setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 禁用交换空间 swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab # 加载内核模块 cat > /etc/modules-load.d/k8s.conf <<EOL br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOL modprobe br_netfilter modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh modprobe nf_conntrack # 配置 sysctl cat > /etc/sysctl.d/k8s.conf <<EOL net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 EOL sysctl --system log "系统准备完成" SUCCESS } # ===== 配置本地仓库 ===== setup_local_repo() { log "配置本地仓库..." cp "$OFFLINE_DIR/configs/local-repo.conf" /etc/yum.repos.d/k8s-offline.repo # 清理缓存 dnf clean all dnf makecache log "本地仓库配置完成" SUCCESS } # ===== 安装容器运行时 ===== install_container_runtime() { log "安装容器运行时..." # 解决包冲突 resolve_conflicts # 安装 containerd dnf install -y containerd runc container-selinux --nobest # 配置 containerd mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml # 启动并启用服务 systemctl daemon-reload systemctl enable --now containerd log "容器运行时安装完成" SUCCESS } # ===== 安装Kubernetes组件 ===== install_kubernetes() { log "安装Kubernetes组件..." dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes --nobest # 启用 kubelet systemctl enable kubelet log "Kubernetes组件安装完成" SUCCESS } # ===== 加载镜像 ===== load_images() { log "加载容器镜像..." for img in $(find "$OFFLINE_DIR/images" -name "*.tar"); do log "加载镜像: $(basename $img)" ctr -n k8s.io images import $img done log "容器镜像加载完成" SUCCESS } # ===== 初始化集群 ===== init_cluster() { log "初始化Kubernetes集群..." kubeadm init \ --pod-network-cidr=$POD_CIDR \ --service-cidr=$SERVICE_CIDR \ --ignore-preflight-errors=Swap \ --upload-certs \ --cri-socket=unix:///run/containerd/containerd.sock # 配置kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config log "集群初始化完成" SUCCESS } # ===== 安装网络插件 ===== install_network_addon() { log "安装Calico网络插件..." kubectl apply -f "$OFFLINE_DIR/manifests/calico.yaml" log "网络插件安装完成" SUCCESS } # ===== 生成加入命令 ===== generate_join_command() { log "生成工作节点加入命令..." local join_command=$(kubeadm token create --print-join-command) echo -e "\n${YELLOW}工作节点加入命令:${NC}" echo -e "${GREEN}$join_command${NC}" echo -e "\n在工作节点上执行此命令加入集群" # 保存到文件 echo "$join_command" > /root/join-cluster.sh chmod +x /root/join-cluster.sh log "加入命令已保存到 /root/join-cluster.sh" SUCCESS } # ===== 主安装函数 ===== main_install() { # 检查root权限 if [ "$(id -u)" -ne 0 ]; then log "请使用root用户执行此脚本" ERROR exit 1 fi prepare_system setup_local_repo install_container_runtime install_kubernetes load_images init_cluster install_network_addon generate_join_command echo -e "\n${GREEN}Kubernetes集群安装完成!${NC}" echo -e "控制平面节点: $(hostname)" echo -e "使用以下命令检查集群状态:" echo -e " kubectl get nodes" echo -e " kubectl get pods -A" } # ===== 执行安装 ===== main_install EOF # 设置可执行权限 chmod +x "$OFFLINE_DIR/scripts/install-k8s.sh" log "安装脚本生成完成" SUCCESS } # ===== 主执行函数 ===== main() { echo "开始准备 Kubernetes $K8S_VERSION 离线部署包..." | tee $LOG_FILE echo "离线包位置: $OFFLINE_DIR" | tee -a $LOG_FILE echo "日志文件: $LOG_FILE" | tee -a $LOG_FILE # 配置国内镜像源 configure_yum_mirrors # 安装podman(避免docker的GLIBC依赖问题) if ! command -v podman &>/dev/null; then log "安装podman(避免GLIBC依赖问题)..." dnf install -y podman >>$LOG_FILE 2>&1 podman --version | tee -a $LOG_FILE fi # 执行下载步骤 create_dirs download_system_deps download_container_runtime download_kubernetes download_k8s_images download_network_addon generate_repo_metadata generate_install_script # 创建完成标记 date > "$OFFLINE_DIR/.completed" echo -e "\n${GREEN}Kubernetes离线部署包准备完成!${NC}" echo -e "离线包位置: ${YELLOW}$OFFLINE_DIR${NC}" echo -e "包含以下内容:" echo -e " - RPM包: $(find "$OFFLINE_DIR/repo" -name "*.rpm" | wc -l) 个" echo -e " - 容器镜像: $(find "$OFFLINE_DIR/images" -name "*.tar" | wc -l) 个" echo -e " - 配置文件: $(find "$OFFLINE_DIR/configs" -type f | wc -l) 个" echo -e " - 安装脚本: $OFFLINE_DIR/scripts/install-k8s.sh" echo -e "\n使用说明:" echo -e "1. 将整个目录复制到离线环境" echo -e "2. 在控制节点执行: ${GREEN}$OFFLINE_DIR/scripts/install-k8s.sh${NC}" echo -e "3. 在工作节点执行生成的加入命令" } # ===== 执行主函数 ===== main ``` ### 关键修复点解释 #### 1. GLIBC 版本不兼容问题修复 ```bash # 使用 podman 替代 docker(避免 GLIBC 依赖) if ! command -v podman &>/dev/null; then log "安装podman(避免GLIBC依赖问题)..." dnf install -y podman >>$LOG_FILE 2>&1 fi # 在镜像下载函数中使用 podman download_k8s_images() { # ... if command -v podman &>/dev/null; then podman pull $image podman save -o "$OFFLINE_DIR/images/$img_name.tar" $image else # 回退到 docker docker pull $image docker save -o "$OFFLINE_DIR/images/$img_name.tar" $image fi # ... } ``` #### 2. 包冲突解决机制 ```bash # 在下载容器运行时前移除冲突包 download_container_runtime() { # 解决冲突:移除冲突的docker-runc包 if rpm -q docker-runc &>/dev/null; then log "检测到冲突的docker-runc包,正在移除..." rpm -e --nodeps docker-runc fi # 下载 containerd(兼容低版本GLIBC) dnf download --resolve --destdir="$OFFLINE_DIR/rpms" \ containerd-${CONTAINERD_VERSION} \ runc \ container-selinux } ``` #### 3. 安装脚本中的冲突解决 ```bash # 在安装脚本中添加冲突解决函数 resolve_conflicts() { # 检查并移除冲突的docker-runc包 if rpm -q docker-runc &>/dev/null; then rpm -e --nodeps docker-runc fi # 检查并移除冲突的containerd.io包 if rpm -q containerd.io &>/dev/null; then rpm -e --nodeps containerd.io fi } # 在安装容器运行时前调用 install_container_runtime() { resolve_conflicts dnf install -y containerd runc container-selinux --nobest } ``` #### 4. 使用 `--nobest` 选项绕过依赖问题 ```bash # 在安装命令中添加 --nobest 选项 dnf install -y containerd runc container-selinux --nobest dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes --nobest ``` ### 使用说明 #### 1. 运行修复后的下载脚本 ```bash chmod +x download-k8s-offline-fixed.sh ./download-k8s-offline-fixed.sh ``` #### 2. 在离线环境中安装 ```bash # 在控制节点执行 /opt/k8s-offline/scripts/install-k8s.sh # 在工作节点执行生成的加入命令 /root/join-cluster.sh ``` ### 验证安装是否成功 ```bash # 检查Kubernetes组件状态 kubectl get nodes kubectl get pods -A # 检查容器运行时状态 systemctl status containerd ctr -n k8s.io images list # 检查GLIBC版本 ldd --version ``` ### 常见问题解决方案 #### 1. 如果仍然遇到 GLIBC 问题 ```bash # 检查系统GLIBC版本 strings /lib64/libc.so.6 | grep GLIBC # 升级GLIBC(谨慎操作) # 注意:升级GLIBC可能影响系统稳定性 dnf update glibc ``` #### 2. 如果包冲突仍然存在 ```bash # 手动移除冲突包 rpm -e --nodeps docker-runc containerd.io # 强制安装所需包 rpm -ivh --force /opt/k8s-offline/repo/*.rpm ``` #### 3. 如果镜像加载失败 ```bash # 手动加载镜像 for img in /opt/k8s-offline/images/*.tar; do ctr -n k8s.io images import $img done ``` ### 离线环境中的替代方案 如果上述方案仍无法解决问题,可以使用静态二进制文件替代 RPM 包: ```bash # 下载静态二进制文件 K8S_BINARIES=( "kubelet" "kubeadm" "kubectl" "crictl" ) for binary in "${K8S_BINARIES[@]}"; do curl -L "https://dl.k8s.io/release/v${K8S_VERSION}/bin/linux/amd64/${binary}" \ -o "/opt/k8s-offline/binaries/${binary}" chmod +x "/opt/k8s-offline/binaries/${binary}" done # 在安装脚本中使用二进制文件 cp /opt/k8s-offline/binaries/* /usr/local/bin/ ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值