目录、参考文献
如果存在多个网络适配器,并且 Kubernetes 组件通过默认路由不可达
建议预先添加 IP 路由规则,这样 Kubernetes 集群就可以通过对应的适配器完成连接
确保 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 网络插件的功能都有所不同,请参阅他们各自文档中对端口的要求
关闭所有防火墙,端口就都开放了,但不安全
用 UI 界面配置防火墙:https://blog.csdn.net/ggeol/article/details/109081134
# 开启防火墙,重启失效
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
或 kubectl
需要人工确认 kubelet
和 kubectl
是否与 kubeadm
安装的 Kubernetes 控制平面的版本匹配
版本差异可能会导致意料之外的问题
kubelet
与控制平面之间允许存在小版本差异,但 kubelet
的版本不应该超过 API 服务器的版本
例如,1.7.0 的 kubelet
应该与 1.8.0 的 API 服务器完全兼容,但反之则不然
安装与配置 kubectl
见“安装与配置 kubectl”
警告:
这些说明将所有 Kubernetes 软件包排除在任何系统升级之外
因为 kubeadm 与 Kubernetes 的“升级”需要额外小心
更多关于版本差异的信息见:
Kubernetes “版本与版本差异策略”
Kubeadm 特有的“版本差异策略”
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 模式kubeadm
可能不支持其中的一些配置(不使用 kubeadm
时可以这样配置)basearch
导致获取 baseurl
失败\$basearch
替换为计算机的架构名称,可以通过 uname -m
查看该值x86_64
的 baseurl
:https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
现在 kubelet
每隔几秒就会重启,因为它陷入了一个等待 kubeadm
指令的循环
容器运行时和 kubelet 都有一个叫做cgroup 驱动的属性
它对管理 Linux 机器的 cgroup 很重要
警告:
容器运行时与 kublete 的 cgroup 驱动一定要匹配
否则 kubelet 进程无法正常工作
详见配置一个 cgroup 驱动
详见故障排查文档
目录、参考文献