《Kurnetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》
Posted 东城绝神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Kurnetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》相关的知识,希望对你有一定的参考价值。
一、架构图
如下图所示:
二、环境信息
主机名 | 系统版本 | 内核版本 | IP地址 | 备注 |
---|---|---|---|---|
k8s-master-62 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.62 | master节点 |
k8s-worker-63 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.63 | worker节点 |
k8s-worker-64 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.64 | worker节点 |
三、安装和配置先决条件
3.1、主机名设置
说明:分别在对应的节点IP上设置主机名。
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-master-62
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-worker-63
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-worker-64
3.2、配置主机hosts
说明:以下操作无论是master节点和worker节点均需要执行。
vim /etc/hosts
192.168.1.62 k8s-master-62
192.168.1.63 k8s-worker-63
192.168.1.64 k8s-worker-64
3.3、关闭防火墙
说明:以下操作无论是master节点和worker节点均需要执行。
root@k8s-master-62:~# ufw status
root@k8s-master-62:~# ufw disable
3.4、关闭selinux
说明:以下操作无论是master节点和worker节点均需要执行。
root@k8s-master-62:~# apt install selinux-utils
root@k8s-master-62:~# apt install policycoreutils
root@k8s-master-62:~# sed -i 's#SELINUX=permissive#SELINUX=disabled#g' /etc/selinux/config
root@k8s-master-62:~# sestatus -v
说明:如果selinux默认关闭则无需修改。
3.5、关闭swap分区
说明:以下操作无论是master节点和worker节点均需要执行。
root@k8s-master-62:~# swapoff -a
root@k8s-master-62:~# sed -i 's/^\\/swapfile\\(.*\\)$/#\\/swapfile \\1/g' /etc/fstab
3.6、时间时区同步
说明:以下操作无论是master节点和worker节点均需要执行。
3.7、转发IPv4并让iptables看到桥接流量
说明:以下操作无论是master节点和worker节点均需要执行。
说明:有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失。配置k8s.conf文件,如下所示:
root@k8s-master-62:~# cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
root@k8s-master-62:~# modprobe overlay
root@k8s-master-62:~# modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
root@k8s-master-62:~# cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
root@k8s-master-62:~# sysctl --system
如下图所示:
3.8、启用IPVS模式
说明:以下操作无论是master节点和worker节点均需要执行。
说明:ube-proxy开启ipvs的前提需要加载以下的内核模块
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
操作步骤如下:
# 1、安装ipvs
root@k8s-master-62:~# apt -y install ipvsadm ipset sysstat conntrack
# 2、加载内核模块脚本
root@k8s-master-62:~# cat > /etc/profile.d/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/profile.d/ipvs.modules
#3、执行加载模块脚本
bash /etc/profile.d/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
如下图所示:
注意:如果出现modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory /lib/modules/5.15.0-69-generic错误,这是因为使用了高内核,当前内核版本为5.15.0-69-generic,在高版本内核已经把nf_conntrack_ipv4替换为nf_conntrack了。
四、containerd部署
说明:以下操作无论是master节点和worker节点均需要执行。
kubernetes 1.24.x以后版本默认CRI为containerd,cri称之为容器运行时插件。
方式一、二进制安装
方式二、apt工具安装
#1、安装软件包
root@k8s-master-62:~# apt install containerd -y
#2、生成默认配置文件
root@k8s-master-62:~# mkdir -p /etc/containerd
root@k8s-master-62:~# containerd config default > /etc/containerd/config.toml
#3、配置systemd cgroup驱动
root@k8s-master-62:~# sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
#4、重载沙箱(pause)镜像
root@k8s-master-62:~# sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml
五、Kubernetes部署
5.1、设置kubernetes源
说明:以下操作无论是master节点和worker节点均需要执行。
5.2、安装kubelet、kubeadm和kubectl
说明:以下操作无论是master节点和worker节点均需要执行。
5.3、k8s相关镜像下载
说明:以下操作无论是master节点和worker节点均需要执行。
5.4、kubeadm初始化master节点
说明:以下操作仅在master节点执行。
#1、kubernetes配置文件
vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
serviceSubnet: "10.96.0.0/16"
podSubnet: "10.244.0.0/16"
kubernetesVersion: "v1.20.6"
controlPlaneEndpoint: "192.168.1.11:6443"
apiServer:
extraArgs:
authorization-mode: "Node,RBAC"
service-node-port-range: 30000-36000
imageRepository: ""
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: KubeProxyConfiguration
mode: "ipvs"
#2、kubeadm初始化kubernetes集群
kubeadm init --config=kubeadm-config.yaml --upload-certs --ignore-preflight-errors=SystemVerification
#3、设置kubelet开机自启
systemctl enable kubelet
如下图所示:
5.5、配置kubectl
说明:以下操作仅在master节点执行。
5.6、配置calico网络
说明:以下操作仅在master节点执行。
#1、下载calico.yaml文件
wget https://docs.projectcalico.org/manifests/calico.yaml
#2、在master节点上部署CNI网络
kubectl apply -f calico.yaml
#3、查看master节点状态
[root@k8s-master-11 kubernete-tools]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-11 Ready control-plane,master 105m v1.20.6
5.8、worker节点部署
说明:以下操作仅在worker节点执行。
kubeadm join 192.168.1.11:6443 --token kqt66m.61ndpio02926edb0 \\
--discovery-token-ca-cert-hash sha256:0b21981da7a9ec6fc528da7cbe852387daeffa51f905c68d72519697b14a5d21
如下图所示:
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战
一线互联网架构师筑基必备技能之Java篇,不愧是大佬
ES 集群架构演进之路
1、初始阶段
订单中心ES初始阶段如一张白纸,架设方案基本没有,很多配置都是保持集群默认配置。整个集群部署在集团的弹性云上,ES集群的节点以及机器部署都比较混乱。同时按照集群维度来看,一个ES集群会有单点问题,显然对于订单中心业务来说也是不被允许的。
2、集群隔离阶段
和很多业务一样,ES集群采用的混布的方式。但由于订单中心ES存储的是线上订单数据,偶尔会发生混布集群抢占系统大量资源,导致整个订单中心ES服务异常。
显然任何影响到订单查询稳定性的情况都是无法容忍的,所以针对于这个情况,先是对订单中心ES所在的弹性云,迁出那些系统资源抢占很高的集群节点,ES集群状况稍有好转。但随着集群数据不断增加,弹性云配置已经不太能满足ES集群,且为了完全的物理隔离,最终干脆将订单中心ES集群部署到高配置的物理机上,ES集群性能又得到提升。
3、节点副本调优阶段
ES的性能跟硬件资源有很大关系,当ES集群单独部署到物理机器上时,集群内部的节点并不是独占整台物理机资源,在集群运行的时候同一物理机上的节点仍会出现资源抢占的问题。所以在这种情况下,为了让ES单个节点能够使用最大程度的机器资源,采用每个ES节点部署在单独一台物理机上方式。
但紧接着,问题又来了,如果单个节点出现瓶颈了呢?我们应该怎么再优化呢?
ES查询的原理,当请求打到某号分片的时候,如果没有指定分片类型(Preference参数)查询,请求会负载到对应分片号的各个节点上。而集群默认副本配置是一主一副,针对此情况,我们想到了扩容副本的方式,由默认的一主一副变为一主二副,同时增加相应物理机。
订单中心ES集群架设示意图
如图,整个架设方式通过VIP来负载均衡外部请求:
整个集群有一套主分片,二套副分片(一主二副),从网关节点转发过来的请求,会在打到数据节点之前通过轮询的方式进行均衡。集群增加一套副本并扩容机器的方式,增加了集群吞吐量,从而提升了整个集群查询性能。
下图为订单中心ES集群各阶段性能示意图,直观地展示了各阶段优化后ES集群性能的显著提升:
当然分片数量和分片副本数量并不是越多越好,在此阶段,我们对选择适当的分片数量做了进一步探索。分片数可以理解为MySQL中的分库分表,而当前订单中心ES查询主要分为两类:单ID查询以及分页查询。
分片数越大,集群横向扩容规模也更大,根据分片路由的单ID查询吞吐量也能大大提升,但聚合的分页查询性能则将降低;分片数越小,集群横向扩容规模也更小,单ID的查询性能也会下降,但分页查询的性能将会提升。
所以如何均衡分片数量和现有查询业务,我们做了很多次调整压测,最终选择了集群性能较好的分片数。
4、主从集群调整阶段
到此,订单中心的ES集群已经初具规模,但由于订单中心业务时效性要求高,对ES查询稳定性要求也高,如果集群中有节点发生异常,查询服务会受到影响,从而影响到整个订单生产流程。很明显这种异常情况是致命的,所以为了应对这种情况,我们初步设想是增加一个备用集群,当主集群发生异常时,可以实时的将查询流量降级到备用集群。
那备用集群应该怎么来搭?主备之间数据如何同步?备用集群应该存储什么样的数据?
考虑到ES集群暂时没有很好的主备方案,同时为了更好地控制ES数据写入,我们采用业务双写的方式来搭设主备集群。每次业务操作需要写入ES数据时,同步写入主集群数据,然后异步写入备集群数据。同时由于大部分ES查询的流量都来源于近几天的订单,且订单中心数据库数据已有一套归档机制,将指定天数之前已经关闭的订单转移到历史订单库。
所以归档机制中增加删除备集群文档的逻辑,让新搭建的备集群存储的订单数据与订单中心线上数据库中的数据量保持一致。同时使用ZK在查询服务中做了流量控制开关,保证查询流量能够实时降级到备集群。在此,订单中心主从集群完成,ES查询服务稳定性大大提升。
5、现今:实时互备双集群阶段
期间由于主集群ES版本是较低的1.7,而现今ES稳定版本都已经迭代到6.x,新版本的ES不仅性能方面优化很大,更提供了一些新的好用的功能,所以我们对主集群进行了一次版本升级,直接从原来的1.7升级到6.x版本。
集群升级的过程繁琐而漫长,不但需要保证线上业务无任何影响,平滑无感知升级,同时由于ES集群暂不支持从1.7到6.x跨越多个版本的数据迁移,所以需要通过重建索引的方式来升级主集群,具体升级过程就不在此赘述了。
主集群升级的时候必不可免地会发生不可用的情况,但对于订单中心ES查询服务,这种情况是不允许的。所以在升级的阶段中,备集群暂时顶上充当主集群,来支撑所有的线上ES查询,保证升级过程不影响正常线上服务。同时针对于线上业务,我们对两个集群做了重新的规划定义,承担的线上查询流量也做了重新的划分。
备集群存储的是线上近几天的热点数据,数据规模远小于主集群,大约是主集群文档数的十分之一。集群数据量小,在相同的集群部署规模下,备集群的性能要优于主集群。
然而在线上真实场景中,线上大部分查询流量也来源于热点数据,所以用备集群来承载这些热点数据的查询,而备集群也慢慢演变成一个热数据集群。之前的主集群存储的是全量数据,用该集群来支撑剩余较小部分的查询流量,这部分查询主要是需要搜索全量订单的特殊场景查询以及订单中心系统内部查询等,而主集群也慢慢演变成一个冷数据集群。
同时备集群增加一键降级到主集群的功能,两个集群地位同等重要,但都可以各自降级到另一个集群。双写策略也优化为:假设有AB集群,正常同步方式写主(A集群)异步方式写备(B集群)。A集群发生异常时,同步写B集群(主),异步写A集群(备)。
ES 订单数据的同步方案
MySQL数据同步到ES中,大致总结可以分为两种方案:
- 方案1:监听MySQL的Binlog,分析Binlog将数据同步到ES集群中。
- 方案2:直接通过ES API将数据写入到ES集群中。
考虑到订单系统ES服务的业务特殊性,对于订单数据的实时性较高,显然监听Binlog的方式相当于异步同步,有可能会产生较大的延时性。且方案1实质上跟方案2类似,但又引入了新的系统,维护成本也增高。所以订单中心ES采用了直接通过ES API写入订单数据的方式,该方式简洁灵活,能够很好的满足订单中心数据同步到ES的需求。
由于ES订单数据的同步采用的是在业务中写入的方式,当新建或更新文档发生异常时,如果重试势必会影响业务正常操作的响应时间。
所以每次业务操作只更新一次ES,如果发生错误或者异常,在数据库中插入一条补救任务,有Worker任务会实时地扫这些数据,以数据库订单数据为基准来再次更新ES数据。通过此种补偿机制,来保证ES数据与数据库订单数据的最终一致性。
遇到的一些坑
1、实时性要求高的查询走DB
推荐阅读:ES 几十亿数据检索 3 秒返回。
对于ES写入机制的有了解的同学可能会知道,新增的文档会被收集到Indexing Buffer,然后写入到文件系统缓存中,到了文件系统缓存中就可以像其他的文件一样被索引到。
然而默认情况文档从Indexing Buffer到文件系统缓存(即Refresh操作)是每秒分片自动刷新,所以这就是我们说ES是近实时搜索而非实时的原因:文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。
当前订单系统ES采用的是默认Refresh配置,故对于那些订单数据实时性比较高的业务,直接走数据库查询,保证数据的准确性。
2、避免深分页查询
ES集群的分页查询支持from和size参数,查询的时候,每个分片必须构造一个长度为from+size的优先队列,然后回传到网关节点,网关节点再对这些优先队列进行排序找到正确的size个文档。
假设在一个有6个主分片的索引中,from为10000,size为10,每个分片必须产生10010个结果,在网关节点中汇聚合并60060个结果,最终找到符合要求的10个文档。
由此可见,当from足够大的时候,就算不发生OOM,也会影响到CPU和带宽等,从而影响到整个集群的性能。所以应该避免深分页查询,尽量不去使用。
3、FieldData与Doc Values
FieldData:
线上查询出现偶尔超时的情况,通过调试查询语句,定位到是跟排序有关系。排序在es1.x版本使用的是FieldData结构,FieldData占用的是JVM Heap内存,JVM内存是有限,对于FieldData Cache会设定一个阈值。
如果空间不足时,使用最久未使用(LRU)算法移除FieldData,同时加载新的FieldData Cache,加载的过程需要消耗系统资源,且耗时很大。所以导致这个查询的响应时间暴涨,甚至影响整个集群的性能。针对这种问题,解决方式是采用Doc Values。
Doc Values:
Doc Values是一种列式的数据存储结构,跟FieldData很类似,但其存储位置是在Lucene文件中,即不会占用JVM Heap。随着ES版本的迭代,Doc Values比FieldData更加稳定,Doc Values在2.x起为默认设置。
最后
小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以关注+点赞,点击这里免费获取
程序员代码面试指南 IT名企算法与数据结构题目最优解
这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!
《TCP-IP协议组(第4版)》
本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。
本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。
Java开发手册(嵩山版)
这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**
MySQL 8从入门到精通
本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。
Spring5高级编程(第5版)
本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。
本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。
JAVA核心知识点+1000道 互联网Java工程师面试题
企业IT架构转型之道 阿里巴巴中台战略思想与架构实战
本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。
**
[外链图片转存中…(img-3Og8FewY-1624881977452)]
[外链图片转存中…(img-kIAg7uC0-1624881977453)]
企业IT架构转型之道 阿里巴巴中台战略思想与架构实战
本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。
以上是关于《Kurnetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》的主要内容,如果未能解决你的问题,请参考以下文章
在 ubuntu 20.04 上部署 docker 容器到 swarm 时出现 br_netfilter 错误
在 ubuntu 20.04 上部署 django 项目时出现 systemctl status gunicorn 错误