首页
关于
Search
1
意外通知
25 阅读
2
欢迎来到我的个人博客
10 阅读
3
CI/CD理念与流程
7 阅读
4
Mysql 二进制安装脚本
5 阅读
5
kubernetes核心组件及作用
3 阅读
默认分类
登录
Search
无冕の神
累计撰写
18
篇文章
累计收到
3
条评论
首页
栏目
默认分类
页面
关于
搜索到
18
篇与
的结果
2026-02-08
脚本练习合集
开机显示系统信息脚本#!/bin/bash yum install -y net-tools &> /dev/null wangka=`ip a | grep ens | head -1 | cut -d: -f2` System=$(hostnamectl | grep System | awk '{print $3,$4,$5}') Kernel=$(hostnamectl | grep Kernel | awk -F: '{print $2}') Virtualization=$(hostnamectl | grep Virtualization| awk '{print $2}') Statichostname=$(hostnamectl | grep Static|awk -F: '{print $2}') Ens32=$(ifconfig $wangka | awk 'NR==2 {print $2}') Lo=$(ifconfig lo | awk 'NR==2 {print $2}') NetworkIp=$(curl -s icanhazip.com) echo "当前系统版本是:$System" echo "当前系统内核是:$Kernel" echo "当前虚拟平台是:$Virtualization" echo "当前主机名是:$Statichostname" echo "当前网卡$wangka的地址是:$Ens32" echo "当前lo接口的地址是:$Lo" echo "当前公网地址是:$NetworkIp"监控httpd进程 1.每隔10s监控httpd的进程数,若进程数大于等于50,则自动重启Apache服务,并检测服务是否重启成功2.若未成功则需要再次启动,若重启5次依旧没有成功,则向管理员发送告警邮件(使用echo输出已发送即可),并退出检测3.如果启动成功,则等待1分钟后再次检测httpd进程数,若进程数正常,则恢复正常检测(10s一次),否则放弃重启并向管理员发送告警邮件,并退出检测#!/bin/bash function check_httpd_process_number(){ process_num=$(ps -aux | grep httpd | wc -l) if [[ $process_num -gt 50 ]] then systemctl restart httpd &> /dev/null systemctl status httpd &> /dev/null if [[ $? -ne 0 ]] then num_restart_httpd=0 while true;do let num_restart_httpd++ systemctl restart httpd &> /dev/null systemctl status httpd &> /dev/null [[ $? -eq 0 ]] && break [[ $num_restart_httpd -eq 6 ]] && break done fi systemctl status httpd &> /dev/null [[ $? -ne 0 ]] && echo "apache未正常重启,已发送邮件给管理员" && return 1 sleep 60 process_num=$(ps -ef | grep httpd| wc -l) if [[ $process_num -gt 50 ]] then echo "apache经过重启进程数依然大于50" return 1 else return 0 fi else echo "进程数小于50" sleep 3 return 0 fi } while true;do check_httpd_process_number [[ $? -eq 1 ]] && exit done 统计文件 统计两个目录下的相同文件,以及不同文件#!/bin/bash # server1的文件在/test/目录中,server2的文件在/root/demo中,通过md5值来判断文件一致性,最终输出相同文件以及各自的不同文件 #定义两个数组的索引 point1=0 point2=0 echo "/test/的文件:" # 将server1上的文件的散列值记录到数组当中 for i in `ls /root/demo`;do md5=`md5sum /root/demo/$i | awk '{print $1}'` arrar1[$point1]=$md5:$i echo ${arrar1[$point1]} let point1++ done echo "/root/demo的文件:" # 将server2上的文件的散列值记录到数组当中 for i in `ls /test`;do md5=`md5sum /test/$i | awk '{print $1}'` arrar2[$point2]=$md5:$i echo ${arrar2[$point2]} let point2++ done # 找出相同文件以及server1上的独立文件,server1的每个文件都和server2上进行比较 echo "-------------------------------" for i in ${arrar1[@]};do for j in ${arrar2[@]};do temp_flag=0 #定义一个标志位,表示没找到相同的文件 server1_md5=`echo $i | awk -F: '{print $1}'` server2_md5=`echo $j | awk -F: '{print $1}'` server1_filename=`echo $i | awk -F: '{print $2}'` server2_filename=`echo $j | awk -F: '{print $2}'` if [ $server1_md5 == $server2_md5 ];then echo -e "两边共同文件\t\t\t$server1_filename" temp_flag=1 #找到了相同的文件 break fi done if [ $temp_flag -eq 0 ];then echo -e "server1不同文件\t\t\t$i" fi done # 找出server2上的独立文件 for i in ${arrar2[@]};do for j in ${arrar1[@]};do temp_flag=0 server1_md5=`echo $i | awk -F: '{print $1}'` server2_md5=`echo $j | awk -F: '{print $1}'` server1_filename=`echo $i | awk -F: '{print $2}'` server2_filename=`echo $j | awk -F: '{print $2}'` if [ $server1_md5 == $server2_md5 ];then temp_flag=1 break fi done if [ $temp_flag -eq 0 ];then echo -e "server2不同文件\t\t\t$i" fi done
2026年02月08日
2 阅读
0 评论
1 点赞
2026-02-04
kubernetes网络模型
kubernetes集群应该包含至少三个网络。一个是各主机自身所属的网络,其地址配置于主机的网络接口,用于各主机之间的通信,例如master与各node之间的通信。此地址配置于kubernetes集群构建之前,它并不能由kubernetes管理,管理员需要于集群构建之前自行确定其地址配置及管理方式。第二个是kubernetes集群上专用于pod资源对象的网络,它是一个虚拟网络,用于为各pod对象设定ip地址等网络参数,其地址配置于pod中容器的网络接口之上。pod网络需要借助kubenet插件或CNI插件实现,该插件可独立部署于kubernetes集群之外,亦可托管于kubernetes之上,它需要在构建kubernetes集群时由管理员进行定义,而后在创建Pod对象时由其自动完成各网络参数的动态配置。第三个是专用于service资源对象的网络,它也是一个虚拟网络,用于为kubernetes集群之中的service配置ip地址,但此地址不配置于任何主机或容器的网络接口上,而是通过Node之上的kube-proxy配置为iptables或ipvs规则,从而将发往此地址的所有流量调度至其后端的各pod对象之上。service网络在kubernetes集群创建时予以指定,而service的地址则在用户创建service时予以动态配置在 K8S 底层网络中,IPVS 的效率通常比 iptables 更高(面试考察)。底层机制与性能天花板:IPVS:是内核级四层负载均衡器,基于哈希表实现快速查找和转发,其查找复杂度接近 O (1),性能几乎不受规则 数量影响,能够支持 10 万 + 的并发连接。 iptables:是基于防火墙规则链的实现,规则匹配采用顺序匹配模式,即逐条遍历规则,时间复杂度为 O (n)。 当集群中服务和 Pod 数量增多时,规则数量会线性增长,性能会显著下降,一般在 5000 + 连接时性能就会骤降。规则更新方式:IPVS:采用增量更新方式,仅修改变化的条目,规则更新耗时极短,可达毫秒级生效,能够快速应对集群中服务和 Pod 的变化,不会引起流量抖动。 iptables:在规则更新时需要全量重建,即重新写入数百条甚至更多规则,这一过程可能需要秒级延迟,还可能导致 服务抖动甚至中断。负载均衡算法:IPVS:支持多种负载均衡算法,如轮询(rr)、加权轮询(wrr)、最少连接(lc)、加权最小连接(wlc)、 源地址哈希(sh)、目标地址哈希(dh)等,能够根据不同的业务场景选择合适的算法,实现更灵活的流量分发。 iptables:仅支持随机和轮询两种简单的负载均衡策略,无法根据后端 Pod 的负载情况动态调整流量, 在一些对负载均衡策略要求较高的场景下,无法满足需求。内存占用:IPVS:内存占用相对固定,约为 30MB。 iptables:每增加一个服务,内存占用会相应增加约 0.5MB,在大规模集群中,随着服务数量的增多, 内存占用会逐渐增大。
2026年02月04日
1 阅读
0 评论
0 点赞
2026-02-04
kubernetes核心组件及作用
控制平面 kube-apiserver etcd kube-scheduler kube-controller-manager工作平面 kubelet CNI CSI CRI kube-proxy 容器运行时k8s为什么选用etcd作为数据库组件(为什么不用别的非关系型键值对数据库),它有什么特点?Kubernetes (K8s) 选择 etcd 作为其核心数据库组件,主要源于 etcd 的设计理念和核心特性与 K8s 对数据存储的严格要求高度契合。K8s 需要一个能够保证强一致性、高可用性,并支持实时变更监听的分布式键值存储,而 etcd 正是为这类场景而生的。etcd 的核心特点:强一致性:etcd 使用 Raft 一致性算法来管理集群。高可用性:etcd 被设计为以集群模式运行,通常由奇数个节点组成(如 3 或 5 个)。Watch(监听)机制:这是 etcd 最关键的机制之一。客户端可以订阅(Watch)特定的键或键前缀,当这些键的值发生变化时,etcd 会主动通知所有订阅的客户端。简单易用的 API:etcd 提供了基于 HTTP/JSON 和 gRPC 的简单 API,使得与各种语言和框架的集成变得非常容易。多版本并发控制 (MVCC):etcd 会为每个键保留多个历史版本,并维护一个全局单调递增的版本号(revision)。租约(Lease)机制:租约是一种带过期时间的契约。当租约过期时,所有与之关联的键都会被自动删除。etcd 凭借其强一致性、高可用性、强大的监听机制和简洁的 API,为 Kubernetes 提供了一个可靠、高效且易于集成的数据存储后端,是 K8s 控制平面能够稳定运行的关键基石。
2026年02月04日
3 阅读
0 评论
0 点赞
2026-02-04
Docker网络管理与资源隔离
Docker网络管理none网络类型在使用none模式后,docker容器不会进行任何网络配置,其没有网卡、没有ip也没有路由,因此默认无法与外界进行通,需要手动添加网卡配置ip等,所以极少使用[root@server1 ~]# docker run -d -it --name test-none --network none busybox[root@server1 ~]# docker exec -it test-none ifconfigcontainer网络类型这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡(环回接口)设备通信。[root@server1 ~]# docker run -d -it --name test-container --network container:container1 busybox[root@server1 ~]# docker exec -it test-container ifconfighost网络类型如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。[root@server1 ~]# docker run -d -it --name test-host --network host busybox[root@server1 ~]# docker exec -it test-host ifconfigbridge网络类型(默认)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中 ,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。bridge模式是docker的默认网络模式,不写--network参数,就是bridge模式。**使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。[root@server1 ~]# docker network create -d bridge --subnet 10.10.0.0/16 --gateway 10.10.0.1 eagleslab-net[root@server1 ~]# docker network list[root@server1 ~]# docker run -d -it --name test-bridge --network eagleslab-net busybox[root@server1 ~]# docker exec -it test-bridge ifconfigDocker资源隔离MNT Namespace:隔离磁盘和文件系统[root@server1 ~]# docker run -it --rm --privileged ubuntu bashIPC Namespace:隔离进程间的通信UTS Namespace:隔离主机名和域名PID Namespace:隔离进程PID[root@server1 ~]# docker inspect -f '{{.State.Pid}}' <container_id>Net Namespace:隔离网络User Namespace:隔离用户名和用户组
2026年02月04日
1 阅读
0 评论
0 点赞
2026-02-03
Docker仓库管理
阿里云仓库登录阿里云 Container Registry$ docker login --username=bbj1030 registry.cn-hangzhou.aliyuncs.com用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。您可以在访问凭证页面修改凭证密码。注意:使用 RAM 用户(子账号)登录镜像仓库时,不支持企业别名带有英文半角句号(.)。从Registry中拉取镜像$ docker pull registry.cn-hangzhou.aliyuncs.com/bbj1030/web:[镜像版本号]将镜像推送到Registry$ docker login --username=bbj1030 registry.cn-hangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/bbj1030/web:[镜像版本号]$ docker push registry.cn-hangzhou.aliyuncs.com/bbj1030/web:[镜像版本号]请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。选择合适的镜像仓库地址从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。示例使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEregistry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816使用 "docker push" 命令将该镜像推送至远程。$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816私有仓库Docker Register[root@server1 install]# ./install_registry.sh[root@server1 install]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES962c643215c8 registry "/entrypoint.sh /etc…" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp registry[root@server1 install]# docker login localhost:5000Username: adminPassword: Login Succeeded[root@server1 install]# docker tag nginx:v1 localhost:5000/nginx:v1[root@server1 install]# docker push localhost:5000/nginx:v1The push refers to repository [localhost:5000/nginx]68814fc317a7: Pushed dc6eb6dad5f9: Pushed v1: digest: sha256:c6d331c815ef6717b60a4a7c631bda85506eb77f47b159ef44fdbbe308957753 size: 741[root@server1 install]# docker rmi localhost:5000/nginx:v1Untagged: localhost:5000/nginx:v1Untagged: localhost:5000/nginx@sha256:c6d331c815ef6717b60a4a7c631bda85506eb77f47b159ef44fdbbe308957753[root@server1 install]# docker pull localhost:5000/nginx:v1v1: Pulling from nginxDigest: sha256:c6d331c815ef6717b60a4a7c631bda85506eb77f47b159ef44fdbbe308957753Status: Downloaded newer image for localhost:5000/nginx:v1localhost:5000/nginx:v1[root@server1 install]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZElocalhost:5000/nginx v1 890316d09026 4 days ago 140MB企业级仓库Docker harbor[root@server1 harbor]# cat harbor.ymlhostname: 192.168.80.10http: port: 80harbor_admin_password: Harbor12345
2026年02月03日
1 阅读
0 评论
0 点赞
1
2
...
4