jjzjj

【云原生 • Kubernetes】搭建 k8s 集群(Kubeadm 方式)

敬 之 2023-04-19 原文


目录


一、k8s 集群平台规划

k8s 集群可以有两种规划方式,单master集群多master集群

1. 单 master 集群

顾名思义该集群中只有一个 master 节点,在这样的集群规划中,如果 master 节点出了任何问题,它所管理的各个 node 节点都会受到影响,缺点是很明显的。

2. 多 master 集群(推荐)

包含多个 master 节点,在该集群中,master 通过负载均衡对 node 节点进行管理。


多 master 集群也称为高可用的 master 集群,即使其中一个 master 节点出现了问题,也不会影响到其他节点。

二、集群环境硬件配置要求

提示:由于此处是基于虚拟机进行演示操作的,所以以下配置适用于基于虚拟机的测试环境使用,如果是基于服务器的生产环境则该配置需要更高。

master 节点:

  • CPU 两核及以上
  • 内存 4G 及以上
  • 硬盘 20G 及以上

node 节点,作为“具体做事”的节点,它的配置要求会更高:

  • CPU 四核及以上
  • 内存 8G 及以上
  • 硬盘 40G 及以上

三、k8s 集群搭建(Kubeadm 方式)

Kubeadm 是 k8s 的部署工具,它提供了 kubeadm initkubeadm join,专用于快速部署 k8s 集群,它能通过两条指令完成一个 Kubenetes 集群的搭建。Kubeadm 部署方式的优点是降低了部署门槛,部署方式快捷且简单;但缺点是屏蔽了诸多细节,遇到问题难以排查是哪里出现了问题。

注意:下文中的操作步骤,除特别说明在哪个节点操作之外,未说明的均表示该操作在所有节点都得执行。

1. 主机准备

准备三台虚拟机,分别安装 CentOS 系统。一台作为 master 节点,另两台作为 node 节点,且每台虚拟机有自己的专属 IP 地址。

虚拟机的创建和配置注意以下几点:

  • 硬件按照上文要求进行配置;
  • 虚拟机之间可以进行网络互通;
  • 虚拟机可以访问外网,便于下载镜像;
  • 安装好 wget 工具 yum install wget
  • 禁止 swap 分区。

2. 系统初始化

第一步:关闭防火墙

#临时关闭
systemctl stop firewalld
#永久关闭
systemctl disable firewalld

第二步:关闭 selinux

#永久关闭
sed -i '/selinux/s/enforcing/disabled/' /etc/selinux/config
#临时关闭
setenforce 0

第三步:关闭 swap

#临时关闭
swapoff -a
#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

第四步:设置主机名称,使用命令 hostnamectl set-hostname 主机名,如下三台主机分别设置为:

hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

#查看当前主机名称
hostname

第五步:在master节点中添加 hosts,即节点 IP地址+节点名称;

cat >> /etc/hosts << EOF
192.168.200.132 master
192.168.200.133 node1
192.168.200.134 node2
EOF

第六步:将桥接的 IPv4 流量传递到 iptables 的链(所有节点都设置);

#设置
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

#使其生效
sysctl --system

第七步:时间同步,让各个节点(虚拟机)中的时间与本机时间保持一致。

yum install ntpdate -y
ntpdate time.windows.com

3. Docker 的安装

Kubernetes 默认容器运行时(CRI)为 Docker,所以需要先在各个节点中安装 Docker。
docker 的详细安装步骤往期文章已有讲述,此处不再赘述。详情参见:

【云原生 • Docker】docker 环境搭建、docker与容器常用指令大全

安装 Docker 后,之后的操作均需在 docker 服务开启的前提下进行 systemctl start docker

4. 添加阿里云 yum 源

此步骤是为了便于今后的下载,在每个节点中执行以下配置;

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[Kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

5. kubeadm、kubelet、kubectl 的安装

此处指定版本为 1.18.0,如果不指定默认下载最新版本。

#下载软件
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
#开机自启动
systemctl enable kubelet

安装成功如下:

6. 在 Master 节点中部署集群

master 节点中执行以下命令,注意将 master 节点 IP 和 kube 版本号修改为自己主机中所对应的。

kubeadm init \
--apiserver-advertise-address=192.168.200.132 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

此步骤执行完成之后,使用命令docker images查看系统中的镜像,可以我们需要的镜像均已安装完成。

查看提示信息,看到 initialized successfully 说明我们 master 节点上的 k8s 集群已经搭建成功;

7. 将 node 节点加入集群

查看上一步执行成功后的提示信息,可以看到系统给了我们两条命令;

这两条命令分别表示:

开启 kubectl 工具的使用(该命令在master节点中执行)。

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

将 node 节点加入 master 中的集群(该命令在工作节点node中执行)。

kubeadm join 192.168.200.132:6443 --token pahgrt.7gn13u88wz4f89an \
    --discovery-token-ca-cert-hash sha256:7f73daa421d7564a6f813985a03f860350a923967d05cd955f8223d56200eb5b

分别在 master 节点中执行第 ① 条命令,在各个 node 节点中执行第 ② 条命令;

执行完成之后在 master 节点中使用命令 kubectl get nodes 查看此时集群中的工作节点。可以看到,node1 和 node2 工作节点已加入至 master 中的集群。

8. 部署 CNI 网络插件

在上述操作完成后,各个工作节点已经加入了集群,但是它们的状态都是 NoReady,这是由于无它们无法跨主机通信的原因。而 CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信。在master节点中执行以下命令进行配置:

kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml

然后使用命令 kubectl get pods -n kube-system 查看运行状态,1 代表运行中;

最后再次使用kubectl get nodes查看集群中的工作节点;可以看到处于开机状态的 master 节点和 node2 节点已经是 ready 状态,处于关闭状态的 node1 节点为 NoReady 状态,测试无误。


Kubernetes 集群搭建完成。

四、方法总结

kubeadm 搭建 k8s 集群简单总结为以下几步:

  1. 准备虚拟机 3 台,分别安装 CentOS 操作系统,一台作为主控节点 master,两台作为工作节点 node;
  2. 对安装后的虚拟机进行初始化操作;
  3. 在所有的节点中安装 docker、kubeadm、kubelet、kubectl;
  4. 在 master 节点中使用 kubeadm init 命令部署集群;
  5. 在 node 节点中使用 kubeadm join 命令将 node 节点添加至集群;
  6. 部署网络插件 CNI。

有关【云原生 • Kubernetes】搭建 k8s 集群(Kubeadm 方式)的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  6. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

  7. ruby - Paperclip:以编程方式分配图像并设置其名称 - 2

    使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案

  8. ruby - 如何以编程方式检查证书是否已被吊销? - 2

    我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一

  9. ruby-on-rails - 以 DRY 方式覆盖 ActiveRecord 中的 "find" - 2

    我有一些模型需要在它们上面放置自定义查找条件。例如,如果我有一个联系人模型,每次调用Contact.find时,我都想限制返回的联系人只属于正在使用的帐户。我通过Google找到了这个(我对其进行了一些自定义):defself.find(*args)with_scope(:find=>{:conditions=>"account_id=#{$account.id}"})dosuper(*args)endend这很好用,除了少数情况下account_id不明确,所以我将其调整为:defself.find(*args)with_scope(:find=>{:conditions=>"#{s

  10. ruby - 如何以编程方式将 mp3 转换为 itunes 可播放的 aac/m4a 文件? - 2

    我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。

随机推荐