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

详见“网络插件需求”

检查需要开放的端口

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

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

# 服务器端
nc -l -p 6443
# 客户端
nc 192.168.0.9 6443

使用的 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

安装一个容器运行时

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

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

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

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

详见容器运行时

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

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

Linux

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

Windows

容器运行时 到 Windows 命名管道的路径
containerd npipe:./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

腾讯镜像

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
  • 通过运行命令 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 驱动

故障排查

详见故障排查文档


目录、参考文献

你可能感兴趣的:(Kubernetes,笔记,kubernetes,容器)