K8s部署安装

一.K8s简介

Kubernetes(通常缩写为K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它最初由Google开发,现在由云原生计算基金会(CNCF)维护。Kubernetes 的核心目标是提供一个一致且可扩展的框架来管理容器化应用的生命周期。

单个容器没有价值,需要实现容器的编排功能

常见的容器编排:

  • docker-compose (单机 小型的容器编排工具)

    • 网络编排

    • 存储卷编排

  • X(推特) Mesos, Marathon ( Mesos云操作系统,只可以编排虚拟机,二次开发后Marathon 可以编排容器)

    • DC/OS

  • kubernetes: k8s

    • Borg --> Kubernetes

Kubernetes最初源于谷歌内部的Borg,Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理,Borg的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。

Borg主要由BorgMaster、Borglet、borgcfg和Scheduler组成:

https://research.google/pubs/pub43438/ #Borg论文

谷歌在容器出现很多年前就已经在使用容器技术,只不过谷歌公司中的 工程师都是极客,不需要使用高级运行时的容器工具,所以没有在前期关注容器工具的研发,让docker这家初创公司异军突起,但是在使用容器的这么多年的中,谷歌公司从borg 系统中挑选人员,组建了 k8s 研发团队, 为了打消所有人的闭源顾虑,将k8s 捐给cncf 基金会, cncf 也属于 Linux基金会

k8s官网

https://kubernetes.io/zh/ #官网

github官网

 https://github.com/kubernetes/kubernetes #github

1.Kubernetes 的关键概念

  1. Pod: Kubernetes 的最小部署单元,一个 Pod 可以包含一个或多个容器,这些容器共享相同的网络和存储资源。Pod 允许容器在同一个环境中运行并相互通信。

  2. Service: 用于定义和管理一组 Pod 的网络访问策略。Service 提供稳定的网络接口和负载均衡,将请求分发到其背后的 Pod。

  3. Deployment: 用于声明式地管理 Pod 和 ReplicaSet 的副本。Deployment 可以自动更新、回滚和扩展应用。

  4. ReplicaSet: 确保指定数量的 Pod 副本在任何时候都在运行。通常,ReplicaSet 是由 Deployment 管理的。

  5. Namespace: 用于将集群资源分隔成逻辑分组,提供资源隔离、权限管理和配额控制。

  6. ConfigMap 和 Secret: 用于管理配置数据和敏感信息(如密码),这些信息可以注入到容器中而无需硬编码在镜像中。

  7. Volume: 提供持久存储能力,可以将数据持久化到 Pod 的生命周期之外。Kubernetes 支持多种类型的存储卷,如本地磁盘、网络存储和云存储。

  8. Ingress: 管理外部 HTTP 和 HTTPS 访问到 Kubernetes 集群内部的服务。Ingress 提供了基于 URL 路径或主机名的路由功能。

  9. Node: Kubernetes 集群中的一个计算节点,可以是物理服务器或虚拟机。每个 Node 上运行一个 Kubelet 进程,它负责管理该 Node 上的 Pod。

  10. Cluster: 由多个 Node 组成的 Kubernetes 集群,包含一个 Master 节点(控制平面)和多个 Worker 节点(承载实际的应用和服务)。

2.Kubernetes 的功能优势

  1. 自动化部署和管理: Kubernetes 可以自动化应用的部署、升级、修复和回滚过程,减少手动操作。

  2. 负载均衡和服务发现: Kubernetes 提供内置的负载均衡和服务发现机制,确保应用的高可用性和稳定性。

  3. 弹性伸缩: 支持根据负载自动扩展和收缩容器实例,优化资源利用率。

  4. 自愈能力: 能够自动替换失败的容器,并重新调度到健康的节点上,确保应用持续运行。

  5. 集成和生态系统: Kubernetes 拥有一个活跃的生态系统,与许多第三方工具和服务兼容,支持各种云提供商和本地部署环境。

3.节点(Node)

Kubernetes 集群中的每个机器都被称为节点。节点可以是物理服务器或虚拟机,它们运行 Kubernetes 的组件来支持集群的功能。节点分为两种类型:

  1. Master 节点(控制平面节点):

    • 负责管理集群的整体状态,包括调度 Pod、管理 API 请求、协调应用部署等。
    • 控制平面节点的主要组件包括:
      • kube-apiserver:Kubernetes 的 API 服务器,负责处理客户端请求、验证、授权等。
      • etcd:一个高可用的键值存储系统,用于存储集群的所有数据和状态信息。
      • kube-scheduler:负责根据调度策略选择适当的节点来运行 Pod。
      • kube-controller-manager:负责运行集群控制器,这些控制器监控集群状态并确保实际状态与期望状态一致。
      • cloud-controller-manager(可选):用于与云提供商交互,管理云环境中的资源。
  2. Worker 节点:

    • 负责运行实际的容器化应用和服务。
    • Worker 节点的主要组件包括:
      • kubelet:负责确保容器运行在 Pod 中,并与 API 服务器通信,报告 Pod 状态。
      • kube-proxy:负责处理网络通信和负载均衡,为服务提供网络代理功能。
      • container runtime:负责实际的容器运行和管理,例如 Docker、containerd 或 CRI-O。

4.组件(Component)

Kubernetes 集群中的各个组件可以分为以下几类:

  1. 控制平面组件:

    • kube-apiserver:提供 API 接口,处理来自用户、控制器和调度器的请求。
    • etcd:存储集群状态和配置信息,保证数据的一致性和持久性。
    • kube-scheduler:负责将 Pod 分配到适当的节点,基于资源需求和调度策略做决策。
    • kube-controller-manager:运行不同的控制器,如 ReplicaSet 控制器、Job 控制器等,确保集群的期望状态与实际状态一致。
    • cloud-controller-manager:(在使用云提供商时)管理云资源,如负载均衡器、卷等。
  2. Node 组件:

    • kubelet:在每个节点上运行,负责管理 Pod 和容器的生命周期,与 API 服务器沟通。
    • kube-proxy:处理网络流量,支持 Service 的负载均衡和网络代理功能。
    • container runtime:负责容器的启动、停止、管理和运行。
  3. 网络和存储组件:

    • Ingress Controller:处理 HTTP 和 HTTPS 请求的路由,根据规则将流量分发到后端服务。
    • Volume Plugins:支持各种存储插件,为 Pod 提供持久存储。
  4. 附加组件:

    • Dashboard:Kubernetes 提供的 Web UI,用于可视化集群和应用的状态。
    • Helm:Kubernetes 的包管理工具,用于简化应用的部署和管理。

二.Kubernetes集群架构

Kubernetes属于典型的Server-Client形式的二层架构

  • Master主要由API Server、Controller-Manager和Scheduler三个组件,以及一个用于集群状态存储的Etcd存储服务组成,它们构成整个集群的控制平面

  • 而每个Node节点则主要包含Kubelet、Kube Proxy及容器运行时(docker是最为常用的实现)三个组件,它们承载运行各类应用容器

API Server

kube-apiserver | Kubernetes

Kubernetes API server 提供了k8s各类资源对象的增删改查及watch等HTTP Rest接口 ,这些对象包括pods 、services、 replicationcontrollers等 ,API Server为REST操作提供服务 ,并为集群的共享状态提供前端 ,所有其他组件都通过该前端进行交互。

  • 该端口默认值为6443 , 可通过启动参数“ -- secure-port ”的值来修改默认值。

  • 默认监听IP为0.0.0.0及本机所有IP , 可以通过 启动参数“ --bind-address ”设置监听指定的 内网IP。

  • 该端口用于接收客户端 、dashboard等外部 HTTPS请求。

  • 实现基于Tocken文件或客户端证书及HTTP Base的认证。

  • 实现基于策略的账户鉴权及准入。

  • 客户端通过API Server实现对kubernetes的API 远程以实现对kubernetes内部资源的增删改查 等管理任务的分发。

  • 整个集群的API网关,相关应用程序为kube-apiserver

  • 基于http/https协议以REST风格提供,几乎所有功能全部抽象为“资源”及相关的“对象”

  • 声明式API,用于只需要声明对象的“终态”,具体的业务逻辑由各资源相关的Controller负责完成

  • 无状态,数据存储于etcd中

 Cluster Store

◼ 集群状态数据存储系统,通常指的就是etcd

◼ 仅会同API Server交互

 Controller Manager

◼ 负责实现客户端通过API提交的终态声明,相应应用程序为kube-controller-manager

◼ 由相关代码通过一系列步骤驱动API对象的“实际状态”接近或等同“期望状态”

◆ 工作于loop模式

 Scheduler

◼ 调度器,负责为Pod挑选出(评估这一刻)最合适的运行节点

◼ 相关程序为kube-scheduler

三.安装部署环境

master: 172.16.227.11

node1:  172.16.227.12

node2:  172.16.227.13

1.初始化系统环境

ubuntu:系统环境初始化

hostnamectl  hostname  master
#主
hostnamectl  hostname  node1
#node1
hostnamectl  hostname  node2
#node2

2.安装容器引擎

k8s 1.23版本之前包括1.23版本使用docker作为容引擎

k8s 1.24版本之后 containerd取代了docker
    containerd:
        是一个开源的容器运行时工具,它为容器提供了核心功能。
        OCI是一个开放标准组织,其主要目标是推动容器技术的开放标准化,以促进容器生态系统的发展和互操作性。
    docker和containerd的区别和联系:
        containerd取代了docker引擎,目的是提高效率。

切换主机的源为阿里源

官网

## Sources Of Ubuntu
阿里云仓库地址:https://opsx.alibaba.com/mirror    https://developer.aliyun.com/mirror/
中科:http://mirrors.ustc.edu.cn/help/ubuntu.html
清华:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/
华为:https://mirrors.huaweicloud.com/

sed -i 's/https:\/\/archive.ubuntu.com/http:\/\/mirrors.cloud.aliyuncs.com/g' /etc/apt/sources.list

3. 安装containerd

apt updateapt install containerd[=版本号] -y/lib/systemd/system/containerd.service (二进制安装参考此配置)mkdir /etc/containerd/  ## 存放containerd的配置文件#配置containerdcontainerd config default > /etc/containerd/config.toml修改pause镜像地址:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"  #阿里镜像地址sandbox_image = "harbor.hiuiu.com/kubernetes/google_containers/pause:3.9" #本地harbor镜像地址修改镜像加速配置168       [plugins."io.containerd.grpc.v1.cri".registry.mirrors]169      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]170      endpoint = ["https://hzsbbqty.mirror.aliyuncs.com"]修改为true137             SystemdCgroup =  true
systemctl  restart  containerd

 

 

4.安装crictl工具

下载crictl安装包:wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.26.1/crictl-v1.26.1-linux-amd64.tar.gz安装mkdir /usr/local/bin/crictltar xvf crictl-v1.29.0-linux-amd64.tar.gz -C /usr/local/bin/crictlvim /etc/profileexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/bin/crictlsource /etc/profilecrictl -v#配置crictl
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
EOF

5.安装nerdctl工具

下载路径wget https://github.com/containerd/nerdctl/releases/download/v1.3.0/nerdctl-1.3.0-linux-amd64.tar.gz安装tar xvf nerdctl-1.7.6-linux-amd64.tar.gz -C /usr/local/bin/nerdctl versionmkdir /etc/nerdctl
cat > /etc/nerdctl/nerdctl.toml <<EOF
namespace = "k8s.io"
debug = false
debug_full = false
insecure_registry = true
EOF

6.CNI工具

CNI是什么?为容器提供网桥,如果不安装CNI,容器只有host网络模式。安装CNI:wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgzmkdir /opt/cni/bin -p
tar xvf cni-plugins-linux-amd64-v1.5.1.tgz -C /opt/cni/bin/

7.初始化K8S环境

1.安装基本的软件
apt install chrony ipvsadm tree ipset -y2.关闭防火墙和关闭selinux
systemctl stop ufw3.关闭swap ,交换分区swapoff -a 
sed -i '/swap.img/s/^/#/' /etc/fstab4.配置时间服务器
为什么要配置时间服务器?
sed -i 's/pool ntp.ubuntu.com/pool 时间服务器地址/' /etc/chrony/chrony.conf
systemctl restart chronyd5.加载模块
modprobe br_netfilter && lsmod |grep br_netfilter
modprobe ip_conntrack && lsmod | grep conntrack
cat >/etc/modules-load.d/modules.conf<<EOF
ip_vs
ip_vs_lc
ip_vs_lblc
ip_vs_lblcr
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_dh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
ip_tables
ip_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
xt_set
br_netfilter
nf_conntrack
overlay
EOF
systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack6.修改内核参数
vim  /etc/sysctl.conf
net.ipv4.ip_forward=1
vm.max_map_count=262144
kernel.pid_max=4194303
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets=6000
net.netfilter.nf_conntrack_max=2097152
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0sysctl -p7.如果是克隆的需要修改machin-id
cat /etc/machine-id
rm -f /etc/machine-id
systemd-machine-id-setup

四.正式安装K8S-kubeadm

1.修改/etc/hosts

11.zxy.com     192.168.240.11   4c2G  master
12.zxy.com     192.168.240.12   4c4G  node1
13.zxy.com     192.168.240.13   4c4G  node2

2.安装kubeadm,kubelet,kubectl

## ----- 线上同学安装方式apt updateapt install apt-transport-https ca-certificates curl gpgmkdir -p -m 755 /etc/apt/keyringscurl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg   ## 阿里源echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |  tee /etc/apt/sources.list.d/kubernetes.list## 安装命令
apt-get update && apt-cache madison kubeadm
apt-get install -y kubelet=1.30.3-1.1 kubeadm=1.30.3-1.1 kubectl=1.30.3-1.1## ----- 线上同学安装方式##线下同学本地安装:apt-get updateapt-get upgradeapt-get install socat ebtables conntrack -ydpkg -i kubernetes-cni_1.4.0-1.1_amd64.debdpkg -i cri-tools_1.30.1-1.1_amd64.debdpkg -i kubeadm_1.30.3-1.1_amd64.deb dpkg -i kubectl_1.30.3-1.1_amd64.deb dpkg -i kubelet_1.30.3-1.1_amd64.deb #线下需拉取镜像bash imagesFromlocal.sh

3.创建MASTER(主上操作)

kubeadm init --v=5 --apiserver-advertise-address=192.168.240.11 \--apiserver-bind-port=6443 \--kubernetes-version=v1.30.3 \--pod-network-cidr=10.200.0.0/16 \--service-cidr=10.96.0.0/16 \--service-dns-domain=cluster.local \--image-repository=registry.aliyuncs.com/google_containers \--ignore-preflight-errors=swapmkdir -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

4.node节点加入集群

kubeadm join 192.168.240.11:6443 --token 1vowbe.7s6vqmc2r2dc1su1 \--discovery-token-ca-cert-hash sha256:7d1aaa5d467cbb98a1d4265c9c9f7acc9ba82a6ec027e4cbd05c70117fde8205

5.查看集群节点

kubectl get nodes

6.拉取镜像

nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.12-0
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1

 五.安装calico

1.主和node解压安装包

tar -zxvf calico-release-v3.28.0.tgz 

2.主和node查找到calico配置文件并修改

root@master:~# cd release-v3.28.0/
root@master:~/release-v3.28.0# ls
bin  images  manifests
root@master:~/release-v3.28.0# cd images/
root@master:~/release-v3.28.0/images# ls
calico-cni.tar  calico-dikastes.tar  calico-flannel-migration-controller.tar  calico-kube-controllers.tar  calico-node.tar  calico-pod2daemon.tar  calico-typha.tar
root@master:~/release-v3.28.0/images# cd ..
root@master:~/release-v3.28.0# cd manifests/
root@master:~/release-v3.28.0/manifests# ls
alp                  calicoctl.yaml           calico-vxlan.yaml  crds.yaml              generate.sh                                   operator-crds.yaml
apiserver.yaml       calico-etcd.yaml         calico.yaml        csi-driver.yaml        grafana-dashboards.yaml                       README.md
calico-bpf.yaml      calico-policy-only.yaml  canal-etcd.yaml    custom-resources.yaml  ocp                                           tigera-operator.yaml
calicoctl-etcd.yaml  calico-typha.yaml        canal.yaml         flannel-migration      ocp-tigera-operator-no-resource-loading.yaml
root@master:~/release-v3.28.0/manifests# vim  calico.yaml 
vim查找  /CALICO_IPV4POOL_CIDR
取消开头注释
- name: CALICO_IPV4POOL_CIDRvalue: "10.200.0.0/16"
root@master:~/release-v3.28.0/manifests# cat calico.yaml | grep image:image: docker.io/calico/cni:v3.28.0image: docker.io/calico/cni:v3.28.0image: docker.io/calico/node:v3.28.0image: docker.io/calico/node:v3.28.0image: docker.io/calico/kube-controllers:v3.28.0
root@master:~/release-v3.28.0/manifests# 

3.主和node导入镜像

root@master:~/release-v3.28.0/images# nerdctl load -i  calico-cni.tarroot@master:~/release-v3.28.0/images# nerdctl load -i  calico-kube-controllers.tarroot@master:~/release-v3.28.0/images# nerdctl load -i  calico-node.tar

4.主上执行安装

kubectl  apply  -f  calico.yaml

5.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403955.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

奇迹世界2单机版安装教程+GM工具+无虚拟机

今天给大家带来一款单机游戏的架设&#xff1a;奇迹世界2单机版。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对是完整…

中职物联网实训室

一、中职物联网实训室建设背景 在当今科技日新月异的浪潮中&#xff0c;物联网技术以其迅猛的发展势头&#xff0c;成为了撬动数字化转型的关键杠杆&#xff0c;深刻地重塑着经济社会的面貌。面对这一变革&#xff0c;社会对精通物联网技术的应用型人才需求激增。鉴于此&#x…

Linux-DNS域名解析服务

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux网络设置 2.LinuxDHCP服务 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言提示&#xff1a;以下是本篇文章…

职业教育嵌入式实验室|嵌入式系统实验室|嵌入式实训室建设方案

一、建设背景 在数字化浪潮的推动下&#xff0c;我们已迈入一个以信息技术为主导的崭新时代。在这个时代&#xff0c;嵌入式系统不仅是智能设备和应用的核心&#xff0c;更是推动各行各业创新和变革的关键力量。无论是智能家居的便捷生活体验&#xff0c;工业控制的精确操作&a…

Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501 1. Kafka集群启动 Kafka在启动集群中的各个broker时&#xff0c;broker会向controller注册自己&#xff0c;并且从controller节点同步集群元数据。 broker是Kaf…

《深入浅出多模态》(九)多模态经典模型:MiniGPT-v2、MiniGPT5

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

数字化转型对金融服务业的影响

数字化转型正在塑造每个行业&#xff0c;从快速消费品到金融&#xff0c;每个行业都受到新兴技术的影响。 那么&#xff0c;数字化转型在金融服务中扮演什么角色&#xff1f;这对招聘前景有何影响&#xff1f; 我们探讨了数字化转型对该行业的影响、其对招聘策略的影响、数据…

Nios II的BSP Editor

1.菜单打开BSP Editor &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 项目文件夹 -> software文件夹 -> ... _bsp文件夹 -> settings.bsp文件 2.文件打开BSP Editor 选中项目文件&#xff0c;右键&#xff0c;Nios II -> …

Nginx--地址重写Rewrite

一、什么是Rewrite Rewrite对称URL Rewrite&#xff0c;即URL重写&#xff0c;就是把传入Web的请求重定向到其他URL的过程 URL Rewrite最常见的应用是URL伪静态化&#xff0c;是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.php?id123 使用U…

初识Linux · 基本指令(1)

目录 前言&#xff1a; 基本指令 1.1 pwd 1.2 ls 1.3 mkdir cd clear 1.4 touch 1.5 ls部分补充 1.6 whoami 1.7 有关目录以及路径 前言&#xff1a; 今天是Linux系列的第一章节&#xff0c;对于Linux的主线学习大概会更新两个半月左右&#xff0c;中间穿插着算法…

SuperMap GIS基础产品FAQ集锦(20240812)

一、SuperMap iDesktopX 问题1&#xff1a;idesktopx11.2.0执行最佳路径分析为空&#xff0c;是什么原因&#xff1f; 11.2.0 【问题原因】两个站点之间的线没有连通 【解决办法】构建网络数据集时勾选“线线自动打断”&#xff0c;让线与线之间相互连通 问题2&#xff1a;…

SwiftUI 6.0(iOS 18)监听滚动视图视口中子视图可见性的极简方法

概览 在 SwiftUI 的应用开发中,我们有时需要监听滚动视图中子视图当前的显示状态:它们现在是被滚动到可见视口(Viewport)?或仍然是隐藏在“未知的黑暗”中呢? 在 SwiftUI 早期版本中为了得偿所愿,我们需要借助一些“取巧”的手段。不过,从 SwiftUI 6.0(iOS 18)开始情…

Unity动画模块 之 3D模型导入基础设置 Materials

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 还是那句话&#xff0c;用到的时候再看看&#xff0c;死记硬背不是正经的学习方法&#xff0c;但是又不得不知道一下&…

环网交换机 环网数采仪 环网采集器确保数据传输无懈可击!

计讯物联Pro级双向防护&#xff0c;升级环网采集器确保数据传输无懈可击&#xff01; 在物联网(IoT)的世界里&#xff0c;数据流动如同城市交通&#xff0c;需要高效且可靠的网络来支撑。但就像城市交通可能遇到意外拥堵或道路封闭&#xff0c;传统网络在数据传输上也会遇到障…

Nginx--日志

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式&#xff0c;每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…

无人机视角下的EasyCVR视频汇聚管理:构建全方位、智能化的AI视频监控网络

随着5G、AI、物联网&#xff08;IoT&#xff09;等技术的快速发展&#xff0c;万物互联的时代已经到来&#xff0c;视频技术作为信息传输和交互的重要手段&#xff0c;在多个领域展现出了巨大的应用潜力和价值。其中&#xff0c;EasyCVR视频汇聚平台与无人机结合的AI应用更是为…

javaweb_10:XML映射文件

一、规范 1、XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放在相同的包下&#xff08;同包同名&#xff09;。 2、XML映射文件的namesapce属性为Mapper接口全限定名一致。 3、 XML映射文件中sql语句的id与Mapper接口中的方法名一致&a…

低代码平台工具 —— 公式编辑器

导读 公式编辑器&#xff1a;公式编辑用于字段值来源于其他字段或是来源于函数计算结果都可由公式编辑来完成 公式编辑器主要需要解决三件事&#xff1a; 合适的编辑器强大的函数库合适的事件监听 技术选型 excel函数库 formulajs&#xff0c;这个函数库可以让JavaScript支…

C++:string类篇

string类的介绍 概念&#xff1a; std::string是C 标准库中用于处理字符串的类&#xff0c;它封装了对字符序列的操作&#xff0c;使得字符串处理更加便捷和安全。 特点&#xff1a; 1.动态内存管理&#xff1a;std::string会自动分配和释放内存&#xff0c;避免了手动管理内存…