生产环境

安装 kubeadm

1、准备开始

(1)一台兼容的 Linux 主机,Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令

(2)每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)

(3)CPU 2 核心及以上

(4)集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)

(5)节点之中不可以有重复的主机名、MAC 地址或 product_uuid

(6)开启机器上的某些端口

(7)禁用交换分区,为了保证 kubelet 正常工作,你必须禁用交换分区

2、确保每个节点上 MAC 地址和 product_uuid 的唯一性

(1)可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址

(2)可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

(3)一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复,Kubernetes 使用这些值来唯一确定集群中的节点,如果这些值在每个节点上不唯一,可能会导致安装失败

3、检查网络适配器

(1)如果有一个以上的网络适配器,同时 Kubernetes 组件通过默认路由不可达,建议预先添加 IP 路由规则, 这样 Kubernetes 集群就可以通过对应的适配器完成连接

4、检查所需端口

(1)启用这些必要的端口后才能使 Kubernetes 的各组件相互通信,可以使用 netcat 之类的工具来检查端口是否启用,例如:

nc 127.0.0.1 6443

(2)使用的 Pod 网络插件也可能需要开启某些特定端口,由于各个 Pod 网络插件的功能都有所不同,请参阅各自文档中对端口的要求

5、安装容器运行时

(1)为了在 Pod 中运行容器,Kubernetes 使用容器运行时(Container Runtime)

(2)默认情况下,Kubernetes 使用容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互

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

(4)如果检测到有多个或者没有容器运行时,kubeadm 将抛出一个错误并要求你指定一个想要使用的运行时

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

(6)Linux 的已知端点

运行时 Unix 域套接字
containerd unix:///var/run/containerd/containerd.sock
CRI-O unix:///var/run/crio/crio.sock
Docker Engine(使用 cri-dockerd) unix:///var/run/cri-dockerd.sock

6、安装 kubeadm、kubelet 和 kubectl

(1)需要在每台机器上安装以下的软件包

(2)kubeadm:用来初始化集群的指令

(3)kubelet:在集群中的每个节点上用来启动 Pod 和容器等

(4)kubectl:用来与集群通信的命令行工具

(5)kubeadm 不能帮你安装或者管理 kubelet 或 kubectl, 所以需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以

(6)CentOS / RHEL / Fedora

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
setenforce 0
#ps: 由于官网未开放同步方式,可能会有索引gpg检查失败的情况,这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

(7)通过运行命令 setenforce 0 和 sed ... 将 SELinux 设置为 permissive 模式可以有效地将其禁用,这是允许容器访问主机文件系统所必需的,而这些操作是为了例如 Pod 网络工作正常,你必须这么做,直到 kubelet 做出对 SELinux 的支持进行升级为止,如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定 kubeadm 不支持的部分配置

(8)如果由于该 Red Hat 的发行版无法解析 basearch 导致获取 baseurl 失败,请将 $basearch 替换为你计算机的架构,输入 uname -m 以查看该值,例如,x86_64 的 baseurl URL 可以是:https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

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

7、配置 cgroup 驱动程序

(1)容器运行时和 kubelet 都具有名字为 "cgroup driver" 的属性,该属性对于在 Linux 机器上管理 CGroups 而言非常重要

(2)警告:你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败

 

使用 kubeadm 创建集群

1、准备开始

(1)一台或多台运行兼容 deb/rpm 的 Linux 操作系统的计算机;例如:Ubuntu 或 CentOS

(2)每台机器 2 GB 以上的内存,内存不足时应用会受限制

(3)用作控制平面节点的计算机上至少有 2 个 CPU

(4)集群中所有计算机之间具有完全的网络连接。你可以使用公共网络或专用网络

(5)还需要使用可以在新集群中部署特定 Kubernetes 版本对应的 kubeadm

2、主机准备

(1)在所有主机上安装容器运行时(Docker)、kubeadm

(2)说明:如果你已经安装了kubeadm,执行 apt-get update && apt-get upgrade 或 yum update 以获取 kubeadm 的最新版本

(3)升级时,kubelet 每隔几秒钟重新启动一次, 在 crashloop 状态中等待 kubeadm 发布指令。crashloop 状态是正常现象。 初始化控制平面后,kubelet 将正常运行

3、准备所需的容器镜像

(1)这个步骤是可选的,只适用于你希望 kubeadm init 和 kubeadm join 不去下载存放在 registry.k8s.io 上的默认的容器镜像的情况

(2)当你在离线的节点上创建一个集群的时候,Kubeadm 有一些命令可以帮助你预拉取所需的镜像

(3)Kubeadm 允许你给所需要的镜像指定一个自定义的镜像仓库

4、初始化控制平面节点

(1)控制平面节点是运行控制平面组件的机器, 包括 etcd(集群数据库) 和 API 服务器 (命令行工具 kubectl 与之通信)

(2)(推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定 --control-plane-endpoint 为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。

(3)选择一个 Pod 网络插件,并验证是否需要为 kubeadm init 传递参数。 根据你选择的第三方网络插件,你可能需要设置 --pod-network-cidr 的值

(4)(可选)kubeadm 试图通过使用已知的端点列表来检测容器运行时。 使用不同的容器运行时或在预配置的节点上安装了多个容器运行时,请为 kubeadm init 指定 --cri-socket 参数

(5)(可选)除非另有说明,否则 kubeadm 使用与默认网关关联的网络接口来设置此控制平面节点 API server 的广播地址。 要使用其他网络接口,请为 kubeadm init 设置 --apiserver-advertise-address=<ip-address> 参数。 要部署使用 IPv6 地址的 Kubernetes 集群, 必须指定一个 IPv6 地址,例如 --apiserver-advertise-address=2001:db8::101

(6)要初始化控制平面节点,请运行:

kubeadm init <args>

5、安装 Pod 网络附加组件

(1)必须部署一个基于 Pod 网络插件的容器网络接口 (CNI),以便你的 Pod 可以相互通信。 在安装网络之前,集群 DNS(CoreDNS)将不会启动

(2)注意 Pod 网络不得与任何主机网络重叠:如果有重叠,很可能会遇到问题(如果发现网络插件的首选 Pod 网络与某些主机网络之间存在冲突, 则应考虑使用一个合适的 CIDR 块来代替, 然后在执行 kubeadm init 时使用 --pod-network-cidr 参数

并在你的网络插件的 YAML 中替换它)

(3)默认情况下,kubeadm 将集群设置为使用和强制使用 RBAC(基于角色的访问控制)。确保你的 Pod 网络插件支持 RBAC,以及用于部署它的清单也是如此

(4)如果要为集群使用 IPv6(双协议栈或仅单协议栈 IPv6 网络), 请确保你的 Pod 网络插件支持 IPv6。 IPv6 支持已在 CNI v0.6.0 版本中添加

(5)可以使用以下命令在控制平面节点或具有 kubeconfig 凭据的节点上安装 Pod 网络附加组件:

kubectl apply -f <add-on.yaml>

(6)每个集群只能安装一个 Pod 网络

(7)安装 Pod 网络后,你可以通过在 kubectl get pods --all-namespaces 输出中检查 CoreDNS Pod 是否 Running 来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点

6、托管节点标签 

(1)默认情况下,kubeadm 启用 NodeRestriction 准入控制器来限制 kubelet 在节点注册时可以应用哪些标签

(2)准入控制器文档描述 kubelet --node-labels 选项允许使用哪些标签

(3)其中 node-role.kubernetes.io/control-plane 标签就是这样一个受限制的标签, kubeadm 在节点创建后使用特权客户端手动应用此标签

(4)你可以使用一个有特权的 kubeconfig,比如由 kubeadm 管理的 /etc/kubernetes/admin.conf, 通过执行 kubectl label 来手动完成操作

7、控制平面节点隔离

(1)默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod

(2)如果你希望能够在控制平面节点上调度 Pod,例如单机 Kubernetes 集群,请运行:

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

(3)这将从任何拥有 node-role.kubernetes.io/control-plane:NoSchedule 污点的节点(包括控制平面节点)上移除该污点。 这意味着调度程序将能够在任何地方调度 Pod

8、加入节点

(1)节点是工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,请对每台计算机执行以下操作:

(2)SSH 到机器

(3)成为 root (例如 sudo su -)

(4)必要时安装一个运行时

(5)运行 kubeadm init 输出的命令

 

清理 

1、如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理

(1)可以使用 kubectl config delete-cluster 删除对集群的本地引用

(2)但是,如果要更干净地取消配置集群, 则应首先清空节点并确保该节点为空, 然后取消配置该节点

2、删除节点

(1)使用适当的凭证与控制平面节点通信,运行:

kubectl drain <node name> --delete-emptydir-data --force --ignore-daemonsets

(2)在删除节点之前,请重置 kubeadm 安装的状态:

kubeadm reset

(3)重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行:

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

(4)如果要重置 IPVS 表,则必须运行以下命令:

ipvsadm -C

(5)现在删除节点:

kubectl delete node <节点名称>

(6)如果你想重新开始,只需运行 kubeadm init 或 kubeadm join 并加上适当的参数

3、清理控制平面

(1)可以在控制平面主机上使用 kubeadm reset 来触发尽力而为的清理

posted @   半条咸鱼  阅读(103)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示