当前位置: 首页 > news >正文

Kubernetes 系列 | k8s入门运维

目录

  • 一、K8S集群搭建
    • 1.1 部署方式
    • 1.2 了解kubeadm
    • 1.3 部署流程
      • 1.3.1 初始化配置
      • 1.3.2 安装容器运行时
      • 1.3.3 安装K8S软件包
      • 1.3.4 创建集群
  • 二、集群高可用
    • 1.1 集群高可用-堆叠
    • 1.2 集群高可用-集群外etcd
  • 三、Pod运维
    • 3.1 Pod运维
    • 3.2 Pod的生命周期
    • 3.3 Pod状况
    • 3.4 Pod阶段
    • 3.5 容器状态
    • 3.6 Pod调度
    • 3.7 Pod排错
    • 3.8 Pod状态
  • 四、Node运维
  • 五、Etcd运维
  • 六、Corndns运维
  • 七、Ingress-controller运维
  • 八、Calico运维
  • 九、证书更新

一、K8S集群搭建

1.1 部署方式

  • kubeadm
    Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群
  • 二进制
    从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群

1.2 了解kubeadm

kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它被故意设计为只关心启动集群,而不是准备节点环境的工作:

  • kubeadm init 启动一个 Kubernetes 主节点
  • kubeadm join 启动一个 Kubernetes 工作节点并且将其加入到集群
  • kubeadm upgrade 更新一个 Kubernetes 集群到新版本
  • kubeadm config 管理集群的配置
  • kubeadm token 使用 kubeadm join 来管理令牌
  • kubeadm reset 还原之前使用 kubeadm init 或者 kubeadm join 对节点产生的改变
  • kubeadm version 打印出 kubeadm 版本
  • kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈

1.3 部署流程

v1.25搭建直通车
下文的流程只是参考并不是可实操的文档,若需要部署请使用上文。
在这里插入图片描述

1.3.1 初始化配置

  1. 关闭防火墙、selinux、swap
#关闭防火墙
systemctl stop firewalld &&systemctl disable firewalld
#关闭 SELinux
getenforce
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#关闭 swap 分区
free -h
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
  1. 设置主机名
#设置主机名   
hostnamectl set-hostname <hostname>  
  1. 挂载存储
etcd盘
docker盘
kubelet盘
  1. 内核参数调优
将桥接的 IPv4 流量传递到 iptables 的链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1  
其他参数
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.tcp_tw_recycle = 0  
net.ipv4.ip_local_port_range = 40000 60000  
vm.swappiness = 0  
kernel.pid_max = 655350
  1. 时间同步
手动同步
ntpdate
chrony

1.3.2 安装容器运行时

  1. 安装CRI
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
/etc/yum.repos.d/docker-ce.repo
yum -y  imstall  docker-ce/containerd 
  1. 调整cgroups驱动
$ cat > /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
  1. 启动并开机自启
systemctl enable docker && systemctl start docker

1.3.3 安装K8S软件包

  1. 添加K8S的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
  1. 安装kubeadm、kubelet、kubectl
dnf install -y kubelet-1.25.7 kubeadm-1.25.7 kubectl-1.25.7 \--disableexcludes=kubernetes
  1. 设置开机自启
systemctl enable --now kubelet

1.3.4 创建集群

  1. 初始化控制平面节点
kubeadm init \--apiserver-advertise-address=192.168.100.10 \--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \--kubernetes-version=v1.25.7 \--service-cidr=10.96.0.0/16 \--pod-network-cidr=10.244.0.0/16 \--token-ttl=0 # 如果不设置为 0 ,默认的 token 有效期是 24 小时
  1. 拷贝配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
  1. 加入节点
kubeadm join 10.10.102.224:6443 --token mu567i.b2e80ic54vhr13yl \
--discovery-token-ca-cert-hash sha256:f812c6b9e157ee6c0bd11d85f59252fd8b33f349af30167738aa766442d77e33
#重新生成token
kubeadm token create --print-join-command
  1. 部署网络插件
wget https://projectcalico.docs.tigera.io/v3.25/manifests/calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -n kube-system

二、集群高可用

1.1 集群高可用-堆叠

在这里插入图片描述

1.2 集群高可用-集群外etcd

在这里插入图片描述

三、Pod运维

3.1 Pod运维

在这里插入图片描述
在这里插入图片描述

3.2 Pod的生命周期

在这里插入图片描述

3.3 Pod状况

简介
可以通过查看Pod的Condition列表了解更多信息,pod的Condition指示pod是否已达到某个状态,以及为什么会这样,与状态相反,一个Pod同时具有多个Conditions
pod的条件表

Pod Condition描述
PodScheduled表示pod是否已调度到节点
InitializedPod的 init容器都已成功完成
ContainersReadyPod 中所有容器都已就绪
ReadyPod 可以为请求提供服务,并且应该被添加到对应服务的负载均衡池中

显示Pod的状况


kubectl describe po <pod-name> -n <namespace> | grep Conditions: -A5

3.4 Pod阶段

简介
Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。 该阶段并不是对容器或 Pod 状态
的综合汇总,也不是为了成为完整的状态机。
pod的条件表
在这里插入图片描述
显示Pod的阶段

kubectl get po <pod-name> -n <namespace> -o yaml | grep phase:

3.5 容器状态

在这里插入图片描述

3.6 Pod调度

影响Pod调度
在这里插入图片描述

3.7 Pod排错

排错过程中常用命令

查看 Pod 状态: kubectl get pod <pod-name> -n <namespace> -o wide
查看 Pod 的 yaml 配置: kubectl get pod <pod-name> -n <namespace> -o yaml
查看 Pod 事件: kubectl describe pod <pod-name> -n <namespace>
查看容器日志: kubectl logs -f <pod-name> [-c <container-name>] -n <namespace> --tail=10
查看上一个退出容器日志:kubectl logs <pod-name> [-c <container-name>] -n <namespace> -p

3.8 Pod状态

在这里插入图片描述

Pod状态-Pending
在这里插入图片描述
Pod状态- ContainerCreating 或Waiting
在这里插入图片描述
Pod状态-CrashLoopBackOff
在这里插入图片描述
Pod状态-ImagePullBackOff
在这里插入图片描述

四、Node运维

主机上线
在这里插入图片描述
主机下线
在这里插入图片描述
主机重命名

  1. 备份节点yaml文件
    kubectl get node -o yaml > nodename.yaml
  2. 节点下线
  3. 清理数据
    清理iptables/IPVS表
    iptables:iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    ipvs:ipvsadm -C
    清理calico数据
    rm -rf /var/lib/calico
  4. 设置节点名称
  5. 加入集群
    kubeadm join xxx
  6. 恢复节点标签和污点信息
    kubectl edit node

主机标签污点管理

  • 标签管理

查看主机标签:kubectl get node --show-labels
添加主机标签:kubectl label node key=value
移除主机标签:kubectl label node key-

  • 污点管理

查看主机污点:kubectl describe node
添加主机污点:kubectl taint node key=value:污点策略
移除主机污点:kubectl taint node key-

  • 污点策略

NoSchedule : 一定不被调度
PreferNoSchedule : 尽量不被调度
NoExecute : 不会调度,并且还会驱逐Node已有Pod
主机常规处理

  • 内存清理

在当前节点上使用命令free -g 查看内存使用情况
使用命令清理:echo 1 > /proc/sys/vm/drop_caches

  • 主机重启

优先做POD驱逐,如果驱逐不了直接停止该节点上的kubelet和docker。
kubectl drain nodename
systemctl stop kubelet
systemctl stop docker
然后使用命令reboot

  • 主机镜像清理

docker image prune -a

  • CPU异常

查看主机使用情况:top
查看各个进程CPU使用情况
查看异常进程具体执行命令,判断异常进程属于哪个服务,执行命
令:cat /proc/异常进程的PID/cmdline
反馈进程相关方

  • 主机僵尸进程
  • 查看主机僵尸是否存在

在当前节点上使用命令 top

  • 查看主机僵尸

如果存在僵尸进程,找到相关进程:ps -e | grep defunct

  • 查看主机僵尸

尝试找到僵尸进程的父进程,如果不是父进程Pid不为1,通过kill掉父进程,执行命令:kill -9 父进程Pid,从而处理僵尸
进程;但僵尸进程的父进程若为1,或者没有父进程,需要重启问题机器

  • 主机不可用
    查看异常节点
    kubectl get node -owide | grep NotReady
    查看节点异常信息
    kubectl describe node

在这里插入图片描述
查看主机相关组件状态
systemctl status docker/kubelet
查看主机相关组件日志
journalctl -u docker/kubelet -f
tail -f /var/log/message

五、Etcd运维

etcd命令一

  • 设置v版本的API

export ETCDCTL_API=3

  • 查看ETCD高可用集群健康状态

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 endpoint health
在这里插入图片描述

  • 查看etcd高可用集群列表

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 member list
在这里插入图片描述etcd命令二

  • 查看etcd高可用集群leader

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 endpoint status
在这里插入图片描述

  • 删除成员

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 member remove <MEMBER_ID>

  • 添加成员

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 member add <etcd_name> <etcd_http_port>

etcd命令三

  • Etcd集群性能检查

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 check perf
在这里插入图片描述

  • 检查结果

执行返回failed表示集群状况不佳

Etcd 数据备份

  • 数据备份

backpath=/data/etcdbackup/
respath=/var/lib/etcd/
mkdir -p /data/etcdbackup/
etcdendpoints=“localhost:2379”
backupfile=“$now.snapshot.db”
export ETCDCTL_API=3
etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/peer.crt --key
/etc/kubernetes/pki/etcd/peer.key --endpoints $etcdendpoints snapshot save b a c k p a t h / backpath/ backpath/backupfile

Etcd 数据恢复

  • 停etcd服务

mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/

  • 备份数据

mv /var/lib/etcd /var/lib/etcd.bak

  • 恢复数据

etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/peer.crt --key
/etc/kubernetes/pki/etcd/peer.key snapshot restore
<备份文件> --name= --initial-cluster==https://:2380,
=https://:2380,=https://:2380 --initialadvertise-peer-urls=https://:2380 --data-dir=/var/lib/etcd

–data-dir表示etcd数据目录
–name表示etcd集群节点名,一般为主机名也可以是其他,不冲突即可
–initial-advertise-peer-urls表示当前节点ip地址
–initial-cluster表示集群各个节点信息

  • 恢复etcd服务

mv /etc/kubernetes/etcd.yaml /etc/kubernetes/manifests/etcd.yaml

六、Corndns运维

k8s DNS运维

  • Kubernetes 中 Pod 的 DNS 策略有四种类型。

1.Default:Pod 继承所在主机上的 DNS 配置;
2.ClusterFirst:K8s 的默认设置;先在 K8s 集群配置的 coreDNS 中查询,查不到的再去继承自主机的上游
nameserver 中查询;
3.ClusterFirstWithHostNet:对于网络配置为 hostNetwork 的 Pod 而言,其 DNS 配置规则与 ClusterFirst 一致;
4.None:忽略 K8s 环境的 DNS 配置,只认 Pod 的 dnsConfig 设置。

  • resolv.conf
    在部署 pod 的时候,如果用的是 K8s 集群的 DNS,那么 kubelet 在起 pause 容器的时候,会将其 DNS 解析配置初始化成集群内的配置。
    在这里插入图片描述
    coredns 常见问题
  • 添加自定义host

编辑configmap:kubectl edit cm coredns -n kube-system
在这里插入图片描述

  • 添加集群外dns地址

方式一:修改coredns主机上/etc/resolv.conf
重启coredns
方式二:修改配置将forward改为proxy:
kubectl edit cm coredns -n kube-system

  • 对dns抓包

1.corednsPod所在的主机,查看coredns的网卡:
route -n
2.对网卡进行抓包
tcpdump -i <网卡> udp and port 53 -w dns.pcap
在这里插入图片描述

七、Ingress-controller运维

在这里插入图片描述
ingress控制器借助service的服务发现机制实现配置的动态更新以实现Pod的负载均衡机制实现
排查命令

查看ingress-controller日志
kubectl logs -f -n kube-system <pod-name> --tail=10
查看应用访问日志
kubectl exec -it -n kube-system <pod-name> bash
cd /var/log/nginx/
查看nginx错误日志
kubectl exec -it -n kube-system <pod-name> bash
tail -f /var/log/nginx/error.log
查看nginx配置
kubectl exec -it -n kube-system <pod-name> bash
more /etc/nginx/nginx.conf
查看nginx后端服务
需额外开启对应端口:--status-port(http 10246) --stream-port(tcp/udp 10247)

八、Calico运维

Node之间是否允许IPIP协议通过:
在master上 ping calico pod的ip,calico的ipip数据抓包命令为:tcpdump -i 物理网卡 ip proto 4 -n
其中ip proto 4为 ipip的协议号
在这里插入图片描述
在这里插入图片描述如果抓不到数据包,说明Node之间没有放开IPIP数据包。
检查calico相关的pod的状态是否正常:
calico-node所包含的pod必须为running和ready状态
在这里插入图片描述
calico 网络常见排查思路
检查kubelet识别的NodeIP是否正确:
kubelet自动检测本机网卡的IP,有时会识别错误的IP地址,例如docker网卡的地址当做NodeIP
kubec get node -o wide
检查Calico 识别的Node IP是否与Kubelet识别的NodeIP 一致:
在calicoctl所在的Pod中,执行calicoctl get node -o wide
如果出现不一致,可以通过修改calico-node ds的环境变量来配置,图例ens33是网卡名,根据实际环境修改也支持模糊匹配,顺序匹配,比如:
-name: IP_AUTODETECTION_METHOD
value: interface=ens*,enp1sd*
或者
-name: IP_AUTODETECTION_METHOD
value: interface=ens33,eth0 #表明先找ens33网卡,找不到
就找eth0网卡

在这里插入图片描述

 刷新iptables,在Pod无法ping通的Node上刷新iptables规则:
由于可能存在遗留的iptables导致calico无法访问
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -P FORWARD ACCEPT
查BGP连接状态:
使用netstat -optn|grep 179,查看master与其他node的连接状态是否存在,是否为established
检查建立BGP连接的IP地址是否正确,有时候因为有些Node存在虚IP,或者多网卡会导致建立的BGP连接状态不对。
检查是否关闭源地址校验:
执行sysctl -a | grep rp_filter检查是否关闭地址校验,期望值为0
如果不为0则将下面俩行添加至/etc/sysctl.conf,添加完成后执行sysctl -p
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

检查selinux&firewalld是否关闭:
selinux及firewalld未关闭可以造成节点ping的通但通过curl或Telnet无法访问端口
1、执行sestatus查看是否关闭selinux,期望selinux关闭状态
如果selinux开启状态则执行setenforce 0临时关闭,永久关闭selinux方法如下:
编辑 /etc/sysconfig/selinux 将SELINUX=enforcing修改成SELINUX=disabled,保持并重启服务器生效
2、执行systemctl status firewalld查看防火墙是否关闭,期望防火墙关闭状态

检查如黑果洞防路火由墙:开启状态,则执行systemctl stop firewalld && systemctl disable firewalld
跨主机访问报错:Failed to connect to 10.xxx.xx.232: Invalid argument,这种错一般都是黑洞路由导致的,可以检查
各个主机路由信息
解决方法:修改成正确的blackhole 路由
在这里插入图片描述

检查MTU:
mtu导致的问题更准确的说是访问小文件时通,访问大数据时不通,因为ip包头占20字节,所以宿主机网卡和tunl0网卡
mtu值如果相差小于20,则可能造成跨节点的宿主机到容器curl不通,ping得通;同节点的宿主机到容器curl得通,ping
得通。(此现场仅存在calico ipip模式下)
例如物理网卡mtu为1450,tunl0 mtu为1440,则会导致ping的通curl不通,需要将calico mtu修改为1430
修改方法:kubectl edit cm -n kube-system calico-config
修改veth_mtu: "1430"保存后重启所有calico node,重启后再次查看tunl0是否为期望值
检查是否存在防火墙规则或策略路由:
1、检查是否配置了networkpolicy
kubectl get networkpolicy -A
2、检查是否配置策略路由
默认只有3条规则,如果有多的,则询问客户是否可以删除多余的路由规则
删除命令ip rule del pref
3、询问客户是否设置了防火墙规则
查看iptables默认规则:
iptables -nvL FORWARD
如果显示policy DROP则执行 iptables -t filter -P FORWARD ACCEPT
开启自动加规则方法:
/usr/lib/systemd/system/docker.service中 在ExecReload=/bin/kill -s HUP $MAINPID下加上一行
ExecPost=/usr/sbin/iptables -t filter -P FORWARD ACCEPT

九、证书更新

拉取脚本
git clone https://github.com/yuyicai/update-kube-cert.git
cd update-kubeadm-cert
chmod 755 update-kubeadm-cert.sh
更新证书
每个主控节点都需执行一次
./update-kubeadm-cert.sh all
查看证书
kubeadm certs check-expiration
备份数据(证书和配置)
cp -rp /etc/kubernetes /etc/kubernetes.bak
mv /etc/kubernetes/*.conf /tmp/
更新admin配置
cp /etc/kubernetes/admin.conf
~/.kube/config
重启etcd、apiserver、controller 、manager、scheduler
将/etc/kubernetes/manifests/临时移出,
完成重启

相关文章:

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…...

yolov8+deepsort+botsort+bytetrack车辆检测和测速系统

结合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技术&#xff0c;可以实现一个高效的车辆检测和测速系统。这样的系统适用于交通监控、智能交通管理系统&#xff08;ITS&#xff09;等领域&#xff0c;能够实时识别并跟踪车辆&#xff0c;并估算其速度。 项目介绍 本项目旨在开发…...

基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现

文章目录 概要整体架构流程技术名词解释技术细节1. 数据结构2. 自适应计算队列大小3. 生产者拼接缓存4. 高效地通知消费者 小结1. 性能表现情况2. 主要改进和局限3. 源码和发行版 概要 准静态自适应环形缓存器&#xff08;Quasi-Static Adaptive Ring Cache&#xff09;是task…...

C++笔记---指针常量和常量指针

巧记方法&#xff08;方法来自于网络出处忘记了&#xff09;&#xff1a;const读作常量&#xff0c;*读作指针&#xff0c;按顺序读即可。例如&#xff1a; const int * ptr; //const在前*在后读作常量指针 const * int ptr; //const在前*在后读作常量指针 int * const prt; /…...

Python习题 177:设计银行账户类并实现存取款功能

(编码题)Python 实现一个简单的银行账户类 BankAccount,包含初始化方法、存款、取款、获取余额等功能。 参考答案 分析需求如下。 Python 类 BankAccount,用于模拟银行账户的基本功能。该类应包含以下方法: 初始化方法: 接受两个参数:account_holder(账户持有人的姓…...

IPhone 16:它的 “苹果智能 “包括哪些内容?

IPhone 16 的发布让科技界看到了该公司的人工智能产品 “苹果智能”&#xff08;Apple Intelligence&#xff09;究竟能做些什么。 苹果公司发布了拥有人工智能硬件升级的最新款 iPhone 16&#xff0c;进一步进军人工智能领域。苹果公司首席执行官蒂姆-库克&#xff08;Tim Coo…...

【中国国际航空-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…...

LOOKUP函数和VLOOKUP函数知识讲解与案例演示

〇、需求 在 Excel 文档中&#xff0c;根据查找值从查找域和结果域构成的数组中&#xff0c;找到对应的结果值。 一、知识点讲解 LOOKUP函数&#xff08;比较常用&#xff0c;推荐&#xff09;和VLOOKUP函数 两个公式都可以实现上述需求。 1. LOOKUP 函数 1.1 单个查询条件…...

Java技术深度探索:高并发场景下的线程安全与性能优化

Java技术深度探索:高并发场景下的线程安全与性能优化 在当今的软件开发领域,随着互联网应用的日益复杂和用户量的激增,高并发成为了一个不可忽视的技术挑战。Java,作为一门广泛应用于企业级开发的编程语言,其内置的并发支持机制如线程(Thread)、锁(Lock)、并发集合(…...

Vulnhub-RickdiculouslyEasy靶场(9个flag)

flag1 端口9090有一个flag flag2 13337端口 flag3 使用dirb进行扫描网站的80端口&#xff0c;发现一些敏感文件 访问80端口&#xff0c;没有发现有效信息 访问passwords目录 访问FLAG.txt 再返回访问passwords.html文件 查看页面源代码发现一个密码 flag4 之前扫描到了robo…...

Android Studio Menu制作

文章目录 在Activity上新建onCreateOptionsMenu新建menu目录及资源文件新建Menu一级菜单在Activity上加载Menu 在Activity上新建onCreateOptionsMenu Overridepublic boolean onCreateOptionsMenu(Menu menu) {return super.onCreateOptionsMenu(menu);}新建menu目录及资源文件…...

【mybatis】使用模糊查询时报错:Encountered unexpected token: “?“ “?“

报错信息如下&#xff1a; Mapper.xml报错代码&#xff1a; AND HILIST_NAME like %#{hilistName}% 解决方案&#xff1a; 把模糊查询的 sql 语句改为使用 CONCAT 命令拼接, 就不会报错了。 AND HILIST_NAME like CONCAT(%, #{hilistName},%)...

【Linux】文件权限与类型全解:你的文件安全指南

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;文件权限与类型全解&#xff1a;你的文件安全指南 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题…...

解析DNS查询报文,探索DNS工作原理

目录 1. 用 tcpdump工具监听抓包 2. 用 host 工具获取域名对应的IP地址 3. 分析DNS以太网查询数据帧 3.1 linux下查询DNS服务器IP地址 3.2 DNS以太网查询数据帧 &#xff08;1&#xff09;数据链路层 &#xff08;2&#xff09;网络层 &#xff08;3&#xff09;传输层…...

Unity让摄像机跟随物体的方法(不借助父子关系)

在Unity中&#xff0c;不使用子对象的方式让相机跟随物体移动&#xff0c;我们通过编写脚本来实现。下面放一个从工程中摘出来的的C#脚本示例&#xff0c;用于将相机绑定到一个Target对象上并跟随其移动&#xff1a; using UnityEngine; public class FollowCamera : MonoBeh…...

misc音频隐写

一、MP3隐写 &#xff08;1&#xff09;题解&#xff1a;下载附件之后是一个mp3的音频文件&#xff1b;并且题目提示keysyclovergeek;所以直接使用MP3stego对音频文件进行解密&#xff1b;mp3stego工具是音频数据分析与隐写工具 &#xff08;2)mp3stego工具的使用&#xff1a;…...

如何启动网络安全计划:首先要做的事情

目录 数据分类&#xff1a;网络安全的基石 为什么它很重要&#xff1f; 如何对数据进行分类&#xff1f; 风险分析 什么是风险分析&#xff1f; 如何进行风险分析&#xff1f; 业务影响分析 (BIA) BIA 的用途是什么&#xff1f; BIA 是如何进行的&#xff1f; 安全解…...

Java零基础-三维数组详解!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云/阿里云/华为云/51CTO&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互…...

数据分析-20-时间序列预测之基于PyTorch的LSTM数据准备及模型训练流程

文章目录 1 数据加载2 去除异常值3 数据归一化4 切分窗口5 制作数据集加载器6 定义模型7 训练模型8 模型评估9 参考附录1 数据加载 参考数据集kaggle下载DailyDelhiClimate import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] = SimHei # 设…...

vue2中使用web worker启动定时器

vue2中使用web worker启动定时器&#xff0c;避免浏览器最小化或切换标签页时定时器不能按设定周期执行【一般是周期小于60s时&#xff0c;大于60s一般可正常执行】 1、添加worker-loader2、修改vue.config.js3、创建timer.worker.js4、创建TimerWorker.js5、使用TimerWorker启…...

【Python 学习】Numpy的基础和应用

目录 1 数组基础1.1 Numpy简介1.2 Numpy数组基础1.3 创建数组1.3.1 使用np.array()函数生成数组1.3.2 利用内置函数产生特定形式的数组1.3.2.1 简单内置函数1.3.2.2 特殊内置函数 1.3.3 生成随机数组 1.4 数组的数据类型1.5 数组的迭代1.6数组的索引和切片1.6.1 一维数组的索引…...

基于python+django+vue+MySQL的酒店推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】pythondjangovueMySQL的酒店推…...

什么是 PD 电压诱骗?

在这篇博客中,我们将深入了解 PD 电压诱骗 的概念,解释其工作原理,并通过简单的例子来帮助你理解整个过程。虽然看起来复杂,但我会尽量用通俗易懂的方式讲解每一个知识点。 什么是 PD 协议?要理解电压诱骗,我们首先需要知道什么是 PD 协议。 PD 协议(Power Delivery 协…...

【漏洞复现】用友 NC pagesServlet Sql注入漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…...

边缘检测运用

文章目录 一、简介1.边缘检测的概念2.边缘检测的目的 二、代码实现三、边缘检测的方法1.1Canny边缘检测器1.2.Canny代码实现2.1Sobel边缘检测器2.2Sobel代码实现3.1Laplacian边缘检测器3.2Laplacian代码实现4.1Scharr边缘检测器4.2Scharr代码实现 四、边缘检测的应用 一、简介 …...

应用宝自动下载安装

import uiautomator2 as u2 from threading import Thread import logging import sys import os loggerlogging.getLogger("uiautomator2") logger.setLevel(logging.INFO) d u2.connect()"""下载模块""" class yingyongbao(object…...

Vue 2 中实现双击事件的几种方法

在 Vue 2 中处理用户交互&#xff0c;特别是双击事件&#xff0c;是一个常见的需求。Vue 提供了一种简洁的方式来绑定事件&#xff0c;包括双击事件。本文将介绍几种在 Vue 2 中实现双击事件的方法。 1. 使用 dblclick 指令 Vue 允许你直接在模板中使用 dblclick 指令来监听双…...

windows服务管理插件 nssm

NSSM是一个windows下服务管理插件&#xff0c;可以填加、删除、启动、停止服务 1.下载 官网&#xff1a;http://nssm.cc 下载页面&#xff1a;http://nssm.cc/download 直接下载&#xff1a;http://nssm.cc/release/nssm-2.24.zip 2.食用 以填加php8.2为例 2.1.将nssm.ex…...

【读书笔记-《30天自制操作系统》-19】Day20

本篇的内容围绕系统调用展开。为了让应用程序能够调用操作系统功能&#xff0c;引入了系统调用以及API的概念。首先实现了显示单个字符的API&#xff0c;让应用程序通过传递地址的方式进行调用&#xff1b;接下来又改进为通过中断的方式进行调用。在此基础上继续实现了显示字符…...