• Kubernetes 笔记 / 入门 / 生产环境 / 用部署工具安装 Kubernetes / 用 kubeadm 启动集群 / 安装 kubeadm


    目录、参考文献


    准备工作

    • 一台兼容的 Linux 主机
      Kubernetes 项目为基于 Debian 与 Red Hat 的 Linux 发行版
      以及那些没有包管理器的发行版提供了通用命令
    • 每个机器 2 GB 以上的 RAM
    • 2 核 CPU 或更多
    • 集群中的所有机器之间都能联通网络(公共或私有网络都可以)
    • 每个节点都有唯一的主机名、MAC 地址、product_uuid
      查看主机名:hostnamectl
      查看 MAC 地址:nmcli device show | grep HWADDR
      查看 product_uuid:sudo cat /sys/class/dmi/id/product_uuid
      Kubernetes 使用这些值来识别集群中的节点,如果不同节点存在相同的值则可能会导致安装“失败”
    • 机器上某些端口需要开放,详见下文
    • 禁用 swap

    检查网络适配器

    如果存在多个网络适配器,并且 Kubernetes 组件通过默认路由不可达

    建议预先添加 IP 路由规则,这样 Kubernetes 集群就可以通过对应的适配器完成连接

    允许 iptables 检查桥接流量

    确保 br_netfilter 模块被加载,运行 lsmod | grep br_netfilter 查看模块状态
    若要显式加载该模块,可执行 sudo modprobe br_netfilter

    为了让 Linux 节点上的 iptables 能够正确地查看桥接流量
    需要确保在 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1,例如:

    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    br_netfilter
    EOF
    
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sudo sysctl --system
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    详见“网络插件需求”

    检查需要开放的端口

    “这些必要的端口”需要开放,Kubernetes 组件需要通过它们进行通信

    可以使用类似 netcat 这样的工具来检查端口是否开放:

    # 服务器端
    nc -l -p 6443
    # 客户端
    nc 192.168.0.9 6443
    
    • 1
    • 2
    • 3
    • 4

    使用的 Pod 网络插件(详见后续章节)也可能需要开启某些特定端口

    由于各个 Pod 网络插件的功能都有所不同,请参阅他们各自文档中对端口的要求

    关闭防火墙

    关闭所有防火墙,端口就都开放了,但不安全

    Proxmox 配置防火墙

    用 UI 界面配置防火墙:https://blog.csdn.net/ggeol/article/details/109081134

    CentOS 8 配置防火墙

    # 开启防火墙,重启失效
    systemctl start firewalld
    # 开启防火墙,重启生效
    systemctl enable firewalld
    # 查看防火墙状态
    firewall-cmd --state
    # 永久开启端口
    firewall-cmd --zone=public --add-port=10250/tcp --permanent
    # 载入更新的配置
    firewall-cmd --reload
    # 查看开启的端口
    firewall-cmd --zone=public --list-ports
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    安装一个容器运行时

    为了在 Pods 中运行容器,Kubernetes 会使用一个容器运行时

    Kubernetes 默认使用容器运行时接口(Container Runtime Interface (CRI))”与选择的容器运行时交互

    如果未指定运行时,kubeadm 会自动尝试通过扫描一个已知端点(endpoint)列表来检测已安装的容器运行时

    如果检测到多个容器运行时或没有检测到容器运行时,kubeadm 将抛出错误并要求指定容器运行时

    详见容器运行时

    说明:
    Docker Engine 没有实现 CRI,而这是容器运行时在 Kubernetes 中工作所必须的
    为此,必须安装一个额外的服务 cri-dockerd
    cri-dockerd 是一个基于遗留的支持内置 Docker 引擎的项目,它在 1.24 版本从 kubelet中“移除”

    受支持操作系统的已知端点列表:

    Linux

    容器运行时Unix域套接字路径
    containerdunix:///var/run/containerd/containerd.sock
    CRI-Ounix:///var/run/crio/crio.sock
    Docker Engine (using cri-dockerd)unix:///var/run/cri-dockerd.sock

    Windows

    容器运行时到 Windows 命名管道的路径
    containerdnpipe:./pipe/containerd-containerd
    Docker Engine (using cri-dockerd)npipe:./pipe/cri-dockerd

    安装 kubeadm、kubelet、kubectl

    在所有节点安装:

    • kubeadm
      启动集群的命令
    • kubelet
      在集群的所有节点上运行的组件,负责启动 pod 与容器等工作
    • kubectl
      与集群对话的命令行工具

    kubeadm 不负责安装或管理 kubeletkubectl

    需要人工确认 kubeletkubectl 是否与 kubeadm 安装的 Kubernetes 控制平面的版本匹配

    版本差异可能会导致意料之外的问题

    kubelet控制平面之间允许存在小版本差异,但 kubelet 的版本不应该超过 API 服务器的版本
    例如,1.7.0 的 kubelet 应该与 1.8.0 的 API 服务器完全兼容,但反之则不然

    安装与配置 kubectl“安装与配置 kubectl”

    💡 警告:
    这些说明将所有 Kubernetes 软件包排除在任何系统升级之外
    因为 kubeadm 与 Kubernetes 的升级需要额外小心

    更多关于版本差异的信息见:

    Kubernetes “版本与版本差异策略

    Kubeadm 特有的“版本差异策略

    基于 Red Hat 的发行版

    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
    enabled=1
    gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    exclude=kubelet kubeadm kubectl
    EOF
    
    # Set SELinux in permissive mode (effectively disabling it)
    sudo setenforce 0
    sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    
    # --disableexcludes=kubernetes 表示去除 yum 源中和安装这些包有冲突的包
    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    
    sudo systemctl enable --now kubelet
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    腾讯镜像

    sudo cat kubernetes.repo 
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.cloud.tencent.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    # 因为 yum-key.gpg 的镜像地址为 404,所以关闭 gpgcheck
    gpgcheck=0
    repo_gpgcheck=1
    gpgkey=https://mirrors.cloud.tencent.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.cloud.tencent.com/kubernetes/yum/doc/rpm-package-key.gpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 通过运行命令 setenforce 0sed ... 将 SELinux 设置为 permissive 模式
      这样容器才能访问主机的文件系统
      这么做是为了让像 Pod 网络这样的功能能够正常工作
      除非今后 kubelet 对 SELinux 的支持进行了升级
    • 如果知道怎么配置 SELinux,也可以将其保持启用状态
      kubeadm 可能不支持其中的一些配置(不使用 kubeadm 时可以这样配置)
    • 如果由于特定的 Red Hat 发行版无法解析 basearch 导致获取 baseurl 失败
      可以将 \$basearch 替换为计算机的架构名称,可以通过 uname -m 查看该值
      x86_64baseurlhttps://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

    现在 kubelet 每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的循环

    配置一个 cgroup 驱动

    容器运行时和 kubelet 都有一个叫做cgroup 驱动的属性

    它对管理 Linux 机器的 cgroup 很重要

    💡 警告:
    容器运行时与 kublete 的 cgroup 驱动一定要匹配
    否则 kubelet 进程无法正常工作
    详见配置一个 cgroup 驱动

    故障排查

    详见故障排查文档


    目录、参考文献

  • 相关阅读:
    NVIDIA NCCL 源码学习(十一)- ring allreduce
    C语言300行代码实现扫雷(可展开+可标记+可更改困难级别+内附图形界面版本)
    笔试强训day1
    QT操作SQLite数据库_界面方式_增删改查
    如何用WiFi实现无线定位
    zabbix监控
    【【萌新的FPGA学习之同步FIFO的代码与tb】】
    计算机网络基础 ARP协议 详详解----看完我的总结你就不用看别人的了!
    Spring Boot的新篇章:探索2.0版的创新功能
    bug记录——设置了feign的fallback,但是没有生效
  • 原文地址:https://blog.csdn.net/wdhlzd/article/details/126068705