当前位置:网站首页>Kubernetes 笔记 / 入门 / 生产环境 / 用部署工具安装 Kubernetes / 用 kubeadm 启动集群 / 安装 kubeadm
Kubernetes 笔记 / 入门 / 生产环境 / 用部署工具安装 Kubernetes / 用 kubeadm 启动集群 / 安装 kubeadm
2022-08-03 16:00:00 【M菜鸟M】
准备工作
- 一台兼容的 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
不负责安装或管理 kubelet
或 kubectl
需要人工确认 kubelet
和 kubectl
是否与 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 0
和sed ...
将 SELinux 设置为 permissive 模式
这样容器才能访问主机的文件系统
这么做是为了让像 Pod 网络这样的功能能够正常工作
除非今后 kubelet 对 SELinux 的支持进行了升级 - 如果知道怎么配置 SELinux,也可以将其保持启用状态
但kubeadm
可能不支持其中的一些配置(不使用kubeadm
时可以这样配置) - 如果由于特定的 Red Hat 发行版无法解析
basearch
导致获取baseurl
失败
可以将\$basearch
替换为计算机的架构名称,可以通过uname -m
查看该值
如x86_64
的baseurl
:https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
现在 kubelet
每隔几秒就会重启,因为它陷入了一个等待 kubeadm
指令的循环
配置一个 cgroup 驱动
容器运行时和 kubelet 都有一个叫做cgroup 驱动的属性
它对管理 Linux 机器的 cgroup 很重要
警告:
容器运行时与 kublete 的 cgroup 驱动一定要匹配
否则 kubelet 进程无法正常工作
详见配置一个 cgroup 驱动
故障排查
详见故障排查文档
边栏推荐
猜你喜欢
我在滴滴做开源
DC-DC 2C (40W/30W) JD6606SX2 power back application
[Code Hoof Set Novice Village 600 Questions] Define a function as a macro
spark入门学习-2
如何使用MATLAB绘制极坐标堆叠柱状图
面了个腾讯35k出来的,他让我见识到什么叫精通MySQL调优
为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案
STM32 GPIO LED and buzzer implementation [Day 4]
参与便有奖,《新程序员》杂志福利来袭!
Yuan xiaolin: Volvo focus on travel security, and put it perfectly
随机推荐
CopyOnWriteArrayList详解
leetcode: 899. Ordered Queue [Thinking Question]
vector类
用户侧有什么办法可以自检hologres单表占用内存具体是元数据、计算、缓存的使用情况?
DataGrip:非常好用的数据库工具,安装与使用教程,亮点介绍
Reptile attention
leetcode-268.丢失的数字
Difference and performance comparison between HAL and LL library of STM32
如何分析周活跃率?
STM32 GPIO LED and buzzer implementation [Day 4]
2021年数据泄露成本报告解读
ffplay视频播放原理分析
mysql delete execution error: You can't specify target table 'doctor_info' for update in FROM clause
不可忽略!户外LED显示屏的特点及优势
Leetcode76. 最小覆盖子串
How to get the 2 d space prior to ViT?UMA & Hong Kong institute of technology & ali SP - ViT, study for visual Transformer 2 d space prior knowledge!.
我在滴滴做开源
常见分布式理论(CAP、BASE)和一致性协议(Gosssip、Raft)
托尔斯泰:生活中只有两种不幸
机器人开发--Universal Scene Description(USD)