首页 文章 精选 留言 我的

精选列表

搜索[主动式营销],共10000篇文章
优秀的个人博客,低调大师

Kubernetes 与 OpenYurt 无缝转换(命令式)

作者:adamzhoul,OpenYurt 成员 打开 openYurt 的 README.md,在简单介绍之后就是 Getting started: yurtctl convert --provider [minikube|kubeadm|kind] // To convert an existing Kubernetes cluster to an OpenYurt cluster yurtctl revert // To uninstall and revert back to the original cluster settings 简单一行命令就可体验 OpenYurt 了,感觉非常方便。 稍等!为什么是 convert/revert 而不是 install/uninstall ? 这个命令对集群做了什么? 看来,在执行它之前有必要搞清楚它到底做了什么。 yurtctl convert 到底做了些什么? 核心流程 跟随 openYurt 源代码(详情请见文末相关链接),梳理了 convert 的核心流程: 可见 1、2 并没有什么特别,只是常规的服务部署。 3,则是对原有 k8s 系统组件的操作,需要特别注意。 4,节点转换看着也并不复杂,却对边缘至关重要。**** disable nodelifecycle controller 做了什么 工作内容: 1. 查询控制面节点 2. 创建 job,通过 nodeName: {{.nodeName}} 确保 job 的 pod 调度到对应 node 上执行(通过 nsenter 的方式执行,修改宿主机上文件)。 3. sed -i 's/--controllers=/--controllers=-nodelifecycle,/g' /etc/kubernetes/manifests/kube-controller-manager.yaml 查看 kube-controller-manager.yaml ... containers: - command: - kube-controller-manager - --allocate-node-cidrs=true ... - --controllers=-nodelifecycle,*,bootstrapsigner,tokencleaner ... 可见,上面的一系列操作最终就是修改了 kube-controller-manager 的启动命令。 查看 kube-controller-manager 启动参数说明: --controllers 代表需要开启的controller列表\ 可见,sed 命令就是去掉了 nodelifecycle 这个 controller。 那,nodelifecycle controller 是做什么的? 简单来说: 1. 不断监听,kubelet 上报上来的 node 信息 2. 如果某个 node 状态异常,或者说长时间没有上报等 2.1 驱逐这个 node 节点或者其他 ---> 导致上面的 pod 被重新调度 可见,对于处于弱网环境的边缘节点,很容易就命中异常状态,导致 node 被驱逐,pod 被重新调度。 所以这里把它去掉了。使用 yurt-controller-manager 来代替它。 即使节点心跳丢失,处于自治模式的节点中的 pod 也不会从 APIServer 中驱逐。 注:这里自治模式的节点,指的就是边缘节点。我们通常会通过加 annotation 的方式把节点标记为自治节点。 节点转换是怎么实现的,云端节点和边缘节点有什么差异? 同样,是通过跑 job 的方式,在目标宿主机上下文中执行相关操作。 不过,相比于暴力使用 nsenter,这里用了更加优雅的方式。通过将宿主机根路径 volume 挂载到容器里的方式。 kubelet 的修改 在文件/var/lib/kubelet/kubeadm-flags.env 中为 KUBELET_KUBEADM_ARGS 添加配置: --kubeconfig=/var/lib/openyurt/kubelet.conf --bootstrap-kubeconfig= 作用: ​1. 参数:--kubeconfig , 给kubelet指定了访问apiServer的配置文件。 ​ ​2. 当--kubeconfig 文件存在,--bootstrap-kubeconfig为空时, ​​ kubelet 启动就不需要通过 bootstrap-token 置换文件证书等过程,直接读取 kubeconfig 文件访问 apiServer。 ​* * ​3. 由于 KUBELET_KUBEADM_ARGS 是 kubelet 启动参数的最后一部分,所以可以起到覆盖前面参数的作用。 ​ 其中​/var/lib/openyurt/kubelet.conf​内容如下,直接将流量指定到 yurthub: apiVersion: v1 clusters: - cluster: server: http://127.0.0.1:10261 name: default-cluster contexts: - context: cluster: default-cluster namespace: default user: default-auth name: default-context current-context: default-context kind: Config preferences: {} yurthub 的启动细节 yurthub 容器启动参数如下: command: - yurthub - --v=2 - --server-addr=__kubernetes_service_addr__ - --node-name=$(NODE_NAME) - --join-token=__join_token__ - --working-mode=__working_mode__ 通过参数我们可看出: ​1. server-addr 指定了云端 apiServer 地址。注意这里的地址一定是公网可访问地址,否则异构网络下会有问题。 ​ ​2. join-token 就是加入节点的 token,可使用kubeadm token create来创建。k8s 提供机制,通过 token 置换出正常访问的 kubeconf 文件。 ​ ​3. working-mode:cloud/edge。这就是边缘节点和云端节点的差异。 ​ 我们都知道 yurthub 可以用来做缓存,是解决边缘自治的重要环节。那么云端为什么也需要部署?为什么还要区分 edge 或者 cloud 工作模式?简单查看 yurthub 源代码 cmd/yurthub/app/start.go: if cfg.WorkingMode == util.WorkingModeEdge { cacheMgr, err = cachemanager.NewCacheManager(cfg.StorageWrapper, cfg.SerializerManager, cfg.RESTMapperManager, cfg.SharedFactory) ... } else { klog.Infof("%d. disable cache manager for node %s because it is a cloud node", trace, cfg.NodeName) } if cfg.WorkingMode == util.WorkingModeEdge { ... gcMgr, err := gc.NewGCManager(cfg, restConfigMgr, stopCh) } else { klog.Infof("%d. disable gc manager for node %s because it is a cloud node", trace, cfg.NodeName) } 可见,云端 yurthub,少做了 cache、GC 的工作。 查看 issue(详情请见文末相关链接)可了解:云端也可以利用 yurthub 提供的 data-filtering 能力来控制 service 的流量。 当然,云端也不需要做 cache 等工作。 命令行参数 在执行过程中,有几个参数比较重要: --cloud-nodes 用于标识哪些是云端节点,多个节点用逗号分隔:node1,node2 --deploy-yurttunnel 标记是否要部署 yurttunnel --kubeadm-conf-path 标记节点机器上 kubeadm 配置文件路径。默认:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 更多参数,可使用 yurtctl convert --help 来查看。 总结 简单来说,convert 核心做了几个事情: ​1. disable K8s 的 nodelifecontroller,用自己的 yurtcontrollermanager 来替换它的职责。 ​ ​2. 安装自己的各类组件,deployment、damenonset 等模式部署。(这类资源部署无需任何担心,因为搞不坏集群,也不太会出现问题。) ​ ​3. 边缘节点:启动 yurthub 静态 pod;将 kubelet 流量转发到 yurthub。 ​ 可见,convert 的事情还是比较可控的。执行 yurtctl convert 也不用太担心。当然,最后的担心也应该由 yurtctl revert 来彻底消除! yurtctl revert 又干了些什么? 核心流程 整个 revert 的过程就是 convert 的反向操作,还比较好理解。 需要注意的是。如果 convert 失败,比如 job 执行超时或者失败。job 是不会被删除的。 即使 yurtctl revert 也不会删除。目的是为了保留现场方便定位问题。 如果需要重新执行 yurtctl convert, 需要手动删除 job。 kubectl get job -n kube-system -A |grep convert kubectl delete job -n kube-system < job-name> 总结 yurtctl convert/revert 命令是最快捷体验 OpenYurt 功能的方法之一。 在了解了这两个命令的实现原理,也就对 OpenYurt 的技术方案了解大半了。 执行命令也不担心了,so easy! 相关链接 1)源代码: ​​https://github.com/openyurtio/openyurt/blob/5063752a9f6645270e3177e39a46df8c23145af2/pkg/yurtctl/cmd/convert/convert.go#L300​​ 2)issue: ​​https://github.com/openyurtio/openyurt/issues/450​​ 点击​​【此处】​​阅读网站原文。

优秀的个人博客,低调大师

DRBD分布式块设备复制

作者:独笔孤行@TaoCloud DRBD(Distributed Replicated Block Device)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。可以简单的理解为网络RAID。 DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,DRBD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。 一、准备环境 节点 主机名 IP地址 磁盘 操作系统 节点1 node1 172.16.201.53 sda,sdb centos7.6 节点2 node2 172.16.201.54 sda,sdb centos7.6 关闭防火墙和selinux #2节点都需要配置 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 配置epel源 #2节点都需要配置 yum install epel-release 二、安装drbd 如果yum源中有完整的drbd软件,可直接通过yum进行安装,如果yum无法找到部分软件包,可通过编译安装。以下2中方法二选一即可。 1.yum安装drbd yum install drbd drbd-bash-completion drbd-udev drbd-utils kmod-drbd yum方式进行安装可能无法找到kmod-drbd软件包,因此需要编译安装。 2.编译安装drbd 2.1准备编译环境 yum update yum -y install gcc gcc-c++ make automake autoconf help2man libxslt libxslt-devel flex rpm-build kernel-devel pygobject2 pygobject2-devel reboot 2.2在官网下载源码包, 在官网 https://www.linbit.com/en/drbd-community/drbd-download/中获取源码包下载地址,并进行下载。 wget https://www.linbit.com/downloads/drbd/9.0/drbd-9.0.21-1.tar.gz wget https://www.linbit.com/downloads/drbd/utils/drbd-utils-9.13.0.tar.gz wget https://www.linbit.com/downloads/drbdmanage/drbdmanage-0.99.18.tar.gz mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} mkdir DRBD9 2.3.编译生成rpm包 tar xvf drbd-9.0.21-1.tar.gz cd drbd-9.0.21-1 make kmp-rpm cp /root/rpmbuild/RPMS/x86_64/*.rpm /root/DRBD9/ tar xvf drbdmanage-0.99.18.tar.gz cd drbdmanage-0.99.18 make rpm cp dist/drbdmanage-0.99.18*.rpm /root/DRBD9/ 2.4.开始安装drbd #2节点都需要安装 cd /root/DRBD9 yum install drbd-kernel-debuginfo-9.0.21-1.x86_64.rpm drbdmanage-0.99.18-1.noarch.rpm drbdmanage-0.99.18-1.src.rpm kmod-drbd-9.0.21_3.10.0_1160.6.1-1.x86_64.rpm 三、配置DRBD 1.主节点划分vg #节点1操作 pvcreate /dev/sdb1 vgcreate drbdpool /dev/sdb1 2.初始化DRBD集群并添加节点 #节点1操作 [root@node1 ~]# drbdmanage init 172.16.201.53 You are going to initialize a new drbdmanage cluster. CAUTION! Note that: * Any previous drbdmanage cluster information may be removed * Any remaining resources managed by a previous drbdmanage installation that still exist on this system will no longer be managed by drbdmanage Confirm: yes/no: yes Empty drbdmanage control volume initialized on '/dev/drbd0'. Empty drbdmanage control volume initialized on '/dev/drbd1'. Waiting for server: . Operation completed successfully #添加节点2 [root@node1 ~]# drbdmanage add-node node2 172.16.201.54 Operation completed successfully Operation completed successfully Host key verification failed. Give leader time to contact the new node Operation completed successfully Operation completed successfully Join command for node node2: drbdmanage join -p 6999 172.16.201.54 1 node1 172.16.201.53 0 G3F1h/pAcGwV1LnlxhFE 记录返回结果中的最后一行:“drbdmanage join -p 6999 172.16.201.54 1 node1 172.16.201.53 0 G3F1h/pAcGwV1LnlxhFE” 并在节点2中执行,以加入集群。 3.从节点划分vg #节点2操作 pvcreate /dev/sdb vgcreate drbdpool /dev/sdb 4.从节点加入集群 #节点2操作 [root@node2 ~]# drbdmanage join -p 6999 172.16.201.54 1 node1 172.16.201.53 0 G3F1h/pAcGwV1LnlxhFE You are going to join an existing drbdmanage cluster. CAUTION! Note that: * Any previous drbdmanage cluster information may be removed * Any remaining resources managed by a previous drbdmanage installation that still exist on this system will no longer be managed by drbdmanage Confirm: yes/no: yes Waiting for server to start up (can take up to 1 min) Operation completed successfully 5.检查集群状态 #节点1操作,以下返回结果为正常状态 [root@node1 ~]# drbdadm status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate node2 role:Secondary volume:0 peer-disk:UpToDate volume:1 peer-disk:UpToDate 6.创建资源 #节点1操作 #创建资源test01 [root@node1 ~]# drbdmanage add-resource test01 Operation completed successfully [root@node1 ~]# drbdmanage list-resources +----------------+ | Name | State | |----------------| | test01 | ok | +----------------+ 7.创建卷 #节点1操作 #创建5GB的卷test01 [root@node1 ~]# drbdmanage add-volume test01 5GB Operation completed successfully [root@node1 ~]# drbdmanage list-volumes +-----------------------------------------------------------------------------+ | Name | Vol ID | Size | Minor | | State | |-----------------------------------------------------------------------------| | test01 | 0 | 4.66 GiB | 100 | | ok | +-----------------------------------------------------------------------------+ [root@node1 ~]# 8.部署资源 末尾数字 “2” 表示节点数量 #节点1操作 [root@node1 ~]# drbdmanage deploy-resource test01 2 Operation completed successfully #创建完时,状态为Inconsistent,正在进行同步 [root@node1 ~]# drbdadm status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate node2 role:Secondary volume:0 peer-disk:UpToDate volume:1 peer-disk:UpToDate test01 role:Secondary disk:UpToDate node2 role:Secondary replication:SyncSource peer-disk:Inconsistent done:5.70 #同步完成后,状态内容如下 [root@node1 ~]# drbdadm status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate node2 role:Secondary volume:0 peer-disk:UpToDate volume:1 peer-disk:UpToDate test01 role:Secondary disk:UpToDate node2 role:Secondary peer-disk:UpToDate 9.配置DRBD设备完成后,创建文件系统并进行挂载 #节点1操作 # [/dev/drbd***]的数字,是通过命令[drbdmanage list-volumes]获取的[Minor]值 [root@node1 ~]# mkfs.xfs /dev/drbd100 meta-data=/dev/drbd100 isize=512 agcount=4, agsize=305176 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=1220703, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@node1 ~]# mount /dev/drbd100 /mnt/ [root@node1 ~]# echo "Hello World" > /mnt/test.txt [root@node1 ~]# ll /mnt/ total 4 -rw-r--r-- 1 root root 12 Nov 26 15:43 test.txt [root@node1 ~]# cat /mnt/test.txt Hello World 10.在节点2上挂载DRBD设备,可进行如下操作: #在节点1操作 #卸载/mnt目录,配置为从节点 [root@node1 ~]# umount /mnt/ [root@node1 ~]# drbdadm secondary test01 #在节点2操作 #配置为主节点 [root@node2 ~]# drbdadm primary test01 [root@node2 ~]# mount /dev/drbd100 /mnt/ [root@node2 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs tmpfs 3.9G 8.9M 3.9G 1% /run tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 35G 1.5G 34G 5% / /dev/sda1 xfs 1014M 190M 825M 19% /boot tmpfs tmpfs 783M 0 783M 0% /run/user/0 /dev/drbd100 xfs 4.7G 33M 4.7G 1% /mnt [root@node2 ~]# ls -l /mnt/ total 4 -rw-r--r-- 1 root root 12 Nov 26 15:43 test.txt [root@node2 ~]# cat /mnt/test.txt Hello World 关注微信公众号“云实战”,欢迎更多问题咨询

优秀的个人博客,低调大师

告别“救火”式运维

一早刚上班,就听到小李抱怨:昨晚凌晨2点多,收到监控告警,磁盘空间满了;刚清理完成磁盘,又发现文件系统只读了;整整折腾了一晚上,才修复完成。运维太苦X了! 你也跟小李一样? 一会上线出问题;一会磁盘故障;一会硬件告警;一会应用性能不足。客户怨声载道,运维叫苦连天。每天忙忙碌碌,但是没有任何工作成果,还不断遭受老板、上司的批,苦X的运维,背锅侠之类的话也成了我们的口头禅。 给你句实话,这就是传统运维的真实写照! 1.传统运维的困境 在传统运维中,部门在制订IT设备和信息化系统管理目标时,关注的是一台台IT设备的故障率和一套套应用系统的可用性。在基础设施、数据库、中间件、灾备、存储等环节通常大量采用商业闭源的软硬件产品及其解决方案。设备的开放性差、标准也不统一,喜欢采用两地三中心这种典型的重量级、集中式运维管理方式。 随着IT规模越来越大、系统越来越复杂,运维保障工作由最初的硬件运维不断细分,网络工程师、系统运维工程师、DBA、安全工程师等岗位加入到运维体系中。 当业务系统发生故障时,IT主管首先召集自扫门前雪的各个运维岗位进行自检,查看各自负责的设备、应用组件、系统是否运行正常。所以,传统运维部门常常被称为“救火”队员,依靠人工巡检的工作方式,不但工作被动,而且效率低下。 2.自动化运维的到来 基于以上原因,自动化运维应运而生。自动化运维的作用就像工业革命时,织布机代替了大量的织布工人,给企业带来了利益;自动化运维就像织布机;他的核心诉求是提升效率;自动化运维是运维演进历程中的一环;从使用脚本的半自动化运维发展到集成到平台的自动化运维,未来也会发展为大数据运维。自动化运维的基本目标解决的是“能程序完成的事情尽量不要用人去干”,具体来说就是把周期性、重复性、规律性的工作都交给工具去做,最终达到提升运维效率的目的。这件事情,说起来容易,但做起来却一点不容易,完成自动化运维,首先需要实现标准化、流程化。 其中所谓流程化,就是将自动化的工作串起来,实现有序的协作,例如代码发布,通过制定流程,然后使用持续集成工具如jekins实现流程化发布。这种流程化的发布,可以实现文件的上传、分发、版本管理、回滚等各种操作。此外,对于其它运维工作,也可以实现流程化,制定运维流程规范、故障处理规范、故障告警规范等,通过多个流程规范可以实现运维工作的秩序化,合理化,从而提高运维效率。 ▼免费直播扫码报名 3.智能运维AIOps 自动化运维虽然提升了效率,解决了一部分问题,但也遇到了新的难题,比如面对繁多的报警信息,运维人员应该如何处理?故障发生时,又如何能够迅速定位问题? 这就是未来智能运维AIOps,它主要解决的是复杂运维环境下问题的快速发现甚至提前预判,以及出现问题后如何在复杂的告警、报错和日志中快速进行根因分析。甚至实现某些故障的自愈功能。 AI和Ops要解决的还是两个层面的问题,可以类比到人。AI相当于人的大脑,我们手脚和躯干是执行系统,大脑负责决策判断,手脚躯干负责完成大脑下发的动作指令。 对应到运维上面,AI 要解决的是怎么快速发现问题和判断根因,而问题一旦找到,就需要靠我们高度完善的自动化体系去执行对应的运维操作,比如容量不够就扩容、流量过大就应该触发限流和降级等等。然后是Ops,从Ops的角度,涉及的主要是运维自动化相关的技术,也就是说AIOps一定是建立在高度完善的运维自动化基础之上的,只有AI没有Ops,是谈不上AIOps。 报名《深入浅出解析大数据平台》免费直播,实操上手! ❥ 直播作者:运维专家·高俊峰❥ 直播时间:11.02(今天)晚8:00❥ 直播群:成功报名后,还可领取直播PPT+作者互动哦~ ▼免费直播扫码报名

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册