kubeadm快速部署K8S

目录

一、kubeadm安装K8S

1.1 环境准备

1.2 初始化配置

1.3 所有节点安装docker

1.3.1 安装依赖环境和docker

1.3.2 定义docker 配置文件

1.3.3 重启并开机自启docker

1.3.4 查看docker 是否配置成功

1.4 master、node01 、node02安装kubeadm,kubelet和kubectl 

1.5 部署K8S集群

1.5.1 查看初始化(一键安装)需要的镜像

1.5.2 master、node01、node02节点准备需要的镜像和启动脚本

1.5.3  生成Kubernetes集群初始化的默认配置文件

1.5.4 编辑ymal 文件

1.5.5 根据提示设定kubectl(准备家目录下.kube目录)

 1.5.6 master、node01、node02节点部署网络插件flannel

 1.5.7 检查集群状态

1.5.8 暴露端口提供服务

二、安装Harbor私有仓库 

2.1 Harbor节点配置

2.1.1 修改主机名

2.1.2 所有节点加上主机名映射

2.1.3 上传 harbor-offline-installer-v1.2.2.tgz 和 docker-compose 文件到 /opt 目录

2.1.4 移到指定目录添加执行权限

2.1.5 解压harbor

2.1.6 修改cfg文件内容

2.2 生成私钥

2.2.1 生成证书

2.2.2  备份私钥并清除私钥密码

2.2.3 签发一个有效期为1000天的X.509证书,并将生成的证书保存为server.crt

2.2.4 给所有的文件加执行权限

2.2.5 安装harbor

​2.2.6 检测harbor 仓库

 2.2.7 修改调度策略为NodePort

2.2.8 浏览器访问master01或node01或node02的ip+31090

2.2.9 将cluster-admin角色权限授予用户system:anonymous 

三、内核参数优化方案


一、kubeadm安装K8S

1.1 环境准备

节点名称IP地址相关组件
master192.168.133.19docker、kubeadm、kubelet、kubectl、flannel
node01192.168.133.20docker、kubeadm、kubelet、kubectl、flannel
node02192.168.133.21docker、kubeadm、kubelet、kubectl、flannel
harbor192.168.133.13docker、docker-compose、harbor-offline-v1.2.2

1.2 初始化配置

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a						#交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab		#永久关闭swap分区,&符号在sed命令中代表上次匹配的结果

//加载ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done


//修改主机名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02


//所有节点修改hosts文件
vim /etc/hosts
192.168.133.19 master01
192.168.133.20 node01
192.168.133.21 node02


//调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

//生效参数
sysctl --system 

1.3 所有节点安装docker

1.3.1 安装依赖环境和docker

yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce docker-ce-cli containerd.io

1.3.2 定义docker 配置文件

mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}
EOF

#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。

1.3.3 重启并开机自启docker

systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service 

1.3.4 查看docker 是否配置成功

docker info | grep "Cgroup Driver"


1.4 master、node01 、node02安装kubeadm,kubelet和kubectl 

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


yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
systemctl enable kubelet.service    # 开机自启kubelet

 #K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

1.5 部署K8S集群

1.5.1 查看初始化(一键安装)需要的镜像

kubeadm config images list

1.5.2 master、node01、node02节点准备需要的镜像和启动脚本

for i in $(ls *.tar); do docker load -i $i; done

1.5.3  生成Kubernetes集群初始化的默认配置文件

kubeadm config print init-defaults > /opt/kubeadm-config.yaml

生成Kubernetes集群初始化的默认配置文件。这个命令的具体操作分解如下:

1、kubeadm config print init-defaults: 这部分命令调用了kubeadm工具中的config print init-defaults子命令。kubeadm是Kubernetes的一个命令行工具,用于快速、简单地初始化和管理Kubernetes集群。print init-defaults命令会输出一个默认的初始化配置模板,这个模板定义了使用kubeadm init命令启动一个新的Kubernetes控制平面所需的配置选项。配置包括API服务器的设置、网络插件的选择、证书和token的管理等。

2、**> 符号**: 在shell命令中,>`是一个重定向操作符,它指示将前面命令的输出内容写入(或覆盖)到后面指定的文件中,而不是打印到终端屏幕上。

3、/opt/kubeadm-config.yaml: 这是文件路径和名称,表示生成的默认配置将会被保存到/opt/目录下,文件名为kubeadm-config.yaml。/opt/目录通常用于存放可选的附加软件包,这里用来存储Kubernetes的初始化配置文件。

1.5.4 编辑ymal 文件

 vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.133.19
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.20.11
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/16
scheduler: {}
 
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

1.5.5 执行ymal 文件

kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

1、kubeadm init: 这是 kubeadm 命令中用于初始化一个新的 Kubernetes 控制平面的主要子命令。执行此命令会在当前机器上部署集群的控制面组件,如 API 服务器、控制器管理器、调度器等,并且会设置必要的网络和安全配置。

2、--config=kubeadm-config.yaml: 这个参数指定了一个自定义的配置文件路径。在此命令中,使用了之前通过 kubeadm config print init-defaults 生成并可能经过编辑的 kubeadm-config.yaml 文件。该文件包含了初始化过程中的各种配置选项,比如 Pod 网络、API 服务器广告地址、令牌以及证书配置等。

3、--upload-certs: 这是一个可选参数,指示 kubeadm init 在初始化过程中自动将生成的证书上传到 Kubernetes 密钥存储中(通常是通过集群内的 Secret 对象)。这简化了在多节点集群中分发这些证书的过程,使得加入额外的节点变得更容易。

4、| (管道符号): 管道符号用于将前一个命令的输出作为后一个命令的输入。

5、tee kubeadm-init.log: tee 命令用于读取标准输入(本例中是 kubeadm init 的输出)并同时将其写入到指定的文件(这里是 kubeadm-init.log)以及标准输出(即屏幕)。这意味着初始化过程的日志不仅会显示在终端上,还会被保存到 kubeadm-init.log 文件中,便于后续查看或故障排查。

综上,整个命令的作用是使用自定义配置文件 kubeadm-config.yaml 初始化 Kubernetes 集群,并自动上传证书到集群内,同时通过管道和 tee 命令记录整个初始化过程的日志到 kubeadm-init.log 文件中。这样既完成了集群的初始化配置,又方便记录和审查操作日志。

(1) 查看 kubeadm-init 日志

less kubeadm-init.log

(2)查看kubernetes配置文件目录

ls /etc/kubernetes/

(3)查看存放ca等证书和密码的目录

ls /etc/kubernetes/pki/

1.5.5 根据提示设定kubectl(准备家目录下.kube目录)

kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。

在master01上操作

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
 
----------------------------------------------------
#这条命令序列是用来配置Kubernetes命令行工具(kubectl)的访问权限,以便用户能够在本地轻松地管理Kubernetes集群
vim /etc/kubernetes/manifests/kube-scheduler.yaml

 

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

systemctl restart kubelet

 1.5.6 master、node01、node02节点部署网络插件flannel

(1)上传 flannel-cni-v1.2.0.tar   flannel-v0.22.2.tar 这两个镜像

(2)载入镜像

docker load -i flannel-v0.22.2.tar
docker load -i flannel-cni-v1.2.0.tar

(3)在master节点上传 kube-flannel.yml 文件

 

kubectl apply -f kube-flannel.yml 

(4)node节点让node 也加入集群,复制执行 kubeadm-config.yaml 得到的令牌(可以看 kubeadm-init.log )

 1.5.7 检查集群状态

kubectl get node

kubectl get pods -n kube-system

在Kubernetes环境中,使用kubectl get pods -n <namespace>命令可以查看指定命名空间(namespace)下的Pods状态。上述命令显示了kube-system命名空间中的Pods状态。下面是输出信息的解释:

        NAME: Pod的名称。每个条目代表一个运行中的Pod实例。

        READY: 表示Pod内所有容器的期望状态是否达到。例如,1/1意味着Pod中有一个容器,并且这个容器已经就绪(Running且健康检查通过)。如果有多个容器,会显示为N/M,其中N是已就绪的容器数,M是总容器数。

        STATUS: 描述Pod的当前状态。常见状态包括:

                Running: Pod内的容器正在运行并且至少有一个容器已经就绪。
                Pending: Pod正在被调度或者等待其依赖的服务(如镜像拉取)完成。
                Failed: Pod中的所有容器以非0退出码终止,且kubelet不会重启它们。
                Succeeded: 对于只运行到完成的Pod(比如Job),所有容器都成功执行结束。
                其他状态还包括CrashLoopBackOff(容器反复启动并失败)等。
        RESTARTS: 自Pod启动以来,容器被重启的次数。频繁的重启可能指示存在问题。

        AGE: Pod创建至今的时间长度。

kubectl get pod -n kube-flannel -owide

1.5.8 暴露端口提供服务

(1)测试 pod 资源创建

kubectl  create deployment nginx --image=nginx
kubectl get pods -owide

(2)查看所有的网络

1) 查看pod ip

kubectl get pods -owide

 2)查看service ip

kubectl get svc

 3)在内部可以访问 (网络互通的)

(3)暴露端口提供服务

kubectl expose deployment nginx --port=80 --type=NodePort

 1)浏览器访问 node ip:30660

 

(4)副本扩容

kubectl scale deployment nginx --replicas=3

(5)部署 Dashboard

1)上传软件包并载入镜像

docker load -i dashboard.tar

 2)修改yaml文件

vim recommended.yaml

3)启动ymal 文件

kubectl apply -f recommended.yaml

4)创建service account并绑定默认cluster-admin管理员集群角色 

kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

 

(5)使用输出的token登录Dashboard

 

二、安装Harbor私有仓库 

2.1 Harbor节点配置

2.1.1 修改主机名

hostnamectl set-hostname hub.shibin.com

2.1.2 所有节点加上主机名映射

echo '192.168.133.13 hub.shibin.com' >> /etc/hosts

2.1.3 上传 harbor-offline-installer-v1.2.2.tgz 和 docker-compose 文件到 /opt 目录

2.1.4 移到指定目录添加执行权限

cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose

2.1.5 解压harbor

tar zxvf harbor-offline-installer-v1.2.2.tgz

2.1.6 修改cfg文件内容

vim harbor.cfg
5  hostname = hub.wyq.com
9  ui_url_protocol = https
24 ssl_cert = /data/cert/server.crt
25 ssl_cert_key = /data/cert/server.key
59 harbor_admin_password = Harbor12345

2.2 生成私钥

2.2.1 生成证书

mkdir -p /data/cert

cd /data/cert

openssl genrsa -des3 -out server.key 2048

openssl req -new -key server.key -out server.csr

 

2.2.2  备份私钥并清除私钥密码

cp server.key server.key.org

openssl rsa -in server.key.org -out server.key
#清除私钥密码主要是为了自动化部署和服务运行的便捷性

2.2.3 签发一个有效期为1000天的X.509证书,并将生成的证书保存为server.crt

openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt

2.2.4 给所有的文件加执行权限

chmod +x /data/cert/*

2.2.5 安装harbor

cd /opt/harbor/
./install.sh

 

解决方法: 

sudo yum remove -y docker-ce docker-ce-cli containerd.io
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io

解决方法

sudo yum remove -y docker-buildx-plugin
sudo yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
sudo systemctl start docker
sudo systemctl enable docker
docker --version

./install.sh

2.2.6 本机映射

192.168.133.13 hub.shibin.com

在本地使用浏览器访问:https://hub.shibin.com
用户名:admin
密码:Harbor12345

 

 2.2.6 检测harbor 仓库

docker login -u admin -p Harbor12345 https://hub.shibin.com

解决方法

sudo nano /etc/docker/daemon.json

{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "insecure-registries": ["hub.shibin.com"]
}

sudo systemctl daemon-reload
sudo systemctl restart docker

docker login -u admin -p Harbor12345 https://hub.shibin.com

 

(1)上传镜像

 

 (2)在master节点上删除之前创建的nginx资源

kubectl delete deployment nginx

(3)创建3台nginx并暴露端口

kubectl create deployment nginx-deployment --image=hub.shibin.com/library/nginx:v1 --port=80 --replicas=3
 
kubectl expose deployment nginx-deployment --port=30000 --target-port=80

(4)查看LVS

yum install ipvsadm -y
ipvsadm -Ln

 (5)使用deployment的虚拟ip进行内部访问

 2.2.7 修改调度策略为NodePort

kubectl edit svc nginx-deployment
25   type: NodePort						#把调度策略改成NodePort

 

2.2.8 浏览器访问master01或node01或node02的ip+31090

 

2.2.9 将cluster-admin角色权限授予用户system:anonymous 

kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

三、内核参数优化方案

cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0									#禁止使用 swap 空间,只有当系统内存不足(OOM)时才允许使用它
vm.overcommit_memory=1							#不检查物理内存是否够用
vm.panic_on_oom=0								#开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963							#指定最大文件句柄数
fs.nr_open=52706963								#仅4.4以上版本支持
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习300问】110、什么是Lasso回归模型?

LASSO回归的全称是Least Absolute Shrinkage and Selection Operator&#xff0c;中文叫“最小绝对收缩和选择算子”&#xff0c;用一个比喻来初步感受一下它的作用&#xff1a; 想象你在整理一个杂乱无章的房间&#xff0c;里面堆满了各种物品&#xff08;代表众多的预测变量&…

「动态规划」如何求粉刷房子的最少花费?

LCR 091. 粉刷房子https://leetcode.cn/problems/JEj789/description/ 假如有一排房子&#xff0c;共n个&#xff0c;每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然&#xff0c;因为市…

应急加固-网站入侵后应急流程

实验需求&#xff1a; bugku的在线实验平台&#xff0c;找到黑客入侵的方式&#xff0c;并确定黑客入侵的ip地址、首次webshell的密码、找到webshell并删除、找到黑客留下的后门中黑客服务器的ip及端口、删除定时任务和脚本、找到黑客添加的账号并删除、修复mysql的getshell漏…

远程咨询的好处都有哪些呢?

随着科技的飞速发展&#xff0c;远程咨询正逐渐成为人们获取医疗服务的一种新方式。那么什么是远程咨询呢&#xff1f;其又有哪些好处呢&#xff1f;下面就给大家详细地说说。 远程咨询的概念 远程咨询&#xff0c;顾名思义&#xff0c;是指通过互联网技术&#xff0c;实现患…

网络安全技术实验一 信息收集和漏洞扫描

一、实验目的和要求 了解信息搜集和漏洞扫描的一般步骤&#xff0c;利用Nmap等工具进行信息搜集并进行综合分析&#xff1b;掌握TCP全连接扫描、TCP SYN扫描的原理,利用Scapy编写网络应用程序&#xff0c;开发端口扫描功能模块&#xff1b;使用漏洞扫描工具发现漏洞并进行渗透测…

Java使用XWPFTemplate将word填充数据,并转pdf

poi-tl poi-tl&#xff08;poi template language&#xff09;是基于Apache POI的Word模板引擎。纯Java组件&#xff0c;跨平台&#xff0c;代码短小精悍&#xff0c;通过插件机制使其具有高度扩展性。 主要处理区域有这么几个模块: 依赖 <dependency><groupId>…

CentOS Stream 9 磁盘扩容

当Linux系统磁盘被占满且资料无法删除&#xff0c;需要新添加磁盘&#xff0c;并将新磁盘扩容到相应的满载磁盘中 查看现有磁盘分区 [rootwcg-lvm-001 ~]# fdisk -l Disk /dev/sda&#xff1a;180 GiB&#xff0c;193273528320 字节&#xff0c;377487360 个扇区 磁盘型号&am…

MySQL—多表查询—小结

一、引言 前面的博客已经全部学习完了关于多表查询。接下来对多表查询进行一个小结。 &#xff08;1&#xff09;多表查询主要是讲了两个方面 多表关系 &#xff08;不管业务关系如何的复杂&#xff0c;最终多表的关系基本上可以分为三类&#xff09; "一对多"、&qu…

【解读】核密度图

def&#xff1a;what 核密度估计&#xff08;Kernel Density Estimation&#xff0c;简称KDE&#xff09;是一种用来估计随机变量概率密度函数的非参数方法 实现&#xff1a;&#xff08;库函数&#xff09;how import seaborn as sns import matplotlib.pyplot as plt# 使用…

[手游] 三色绘恋S Mobile Link

语音合成TTS: 文字转成语音的工具 WPS免登录一键修改器: 去除烦人的登录且能正常使用 故事简介&#xff1a; 深秋的雨季即将到来&#xff0c;正值那个为人所熟知的故事发生的前一年—— 地点&#xff1a;湖北省的重点高中&#xff0c;武汉师贰高校。 新学年开始&#xff0c;各…

Qt for Android 之 OpenCV编译(Windows下编译)

简介 前两天刚好更新了4.10, 这里以4.10作为示例进行编译&#xff0c; Qt版本是Qt6.6.2。 准备OpenCV的Android库 一. 使用官方编译好的库 1. 下载OpenCV android SDK opencv-4.10.0-android-sdk.zip 2. 解压缩 官方提供的包含了多个架构的opencv android库 二. 自行编译…

【iOS】界面推出的方法

【iOS】界面推出的方法 在学习过程中我们发现在iOS中有两种界面推出的方法&#xff1a;push 和 present这两种方法都可以用来推出一个新的界面 但是这两者是存在区别的 push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中&#xff0c;可以跨级…

java版本ERP管理系统源码 Spring Cloud erp系统,更专业的ERP管理系统

ERP管理系统是一款基于Java技术的企业资源规划系统&#xff0c;集成了Spring Cloud Alibaba、Spring Boot、MybatisPlus、Redis等先进技术&#xff0c;以及前端框架VUE3和ElementUI&#xff0c;致力于为企业提供一个功能全面、性能卓越的微服务架构平台。 系统功能模块及其描述…

实现JWT认证与授权的Spring Boot项目详解

我们将详细介绍如何使用JWT&#xff08;JSON Web Tokens&#xff09;结合Spring Boot框架实现用户认证和授权系统。此方案将包括用户注册、登录以及通过JWT令牌进行后续请求的身份验证过程。我们将从引入必要的依赖开始&#xff0c;然后逐步构建项目的各个部分&#xff0c;包括…

随便写写之——CSDN个人主页布局

最近一直在看题&#xff0c;真的好无聊&#xff0c;晚上睡觉前脑子里想的都是JS&#xff0c;不会是焦虑症犯了吧&#xff0c;赶紧写点东西&#xff0c;现在是上午9点38分&#xff0c;想着写个csdn的布局练练手吧。 现在是11点半&#xff0c;写个将近两个小时就写了那么点&#…

代理设计模式之JDK动态代理CGLIB动态代理原理与源码剖析

代理设计模式 代理模式(Proxy),为其它对象提供一种代理以控制对这个对象的访问。如下图 从上面的类图可以看出,通过代理模式,客户端访问接口时的实例实际上是Proxy对象,Proxy对象持有RealSubject的引用,这样一来Proxy在可以在实际执行RealSubject前后做一些操作,相当于…

微软如何打造数字零售力航母系列科普13 - Prime Focus Technologies在NAB 2024上推出CLEAR®对话人工智能联合试点

Prime Focus Technologies在NAB 2024上推出CLEAR对话人工智能联合试点 彻底改变您与内容的互动方式&#xff0c;从内容的创建到分发 洛杉矶&#xff0c;2024年4月9日/PRNewswire/-媒体和娱乐&#xff08;M&E&#xff09;行业人工智能技术解决方案的先驱Prime Focus Techn…

OpenCV 双目三角法计算点云

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 基于三角法计算点坐标的过程类似于我们人类眼睛观察事物的过程: 如上图所示,通过两个相机观察到同一位置,我们可以通过两个相机得到这一位置的投影坐标 ( u r , v r ) , ( u l , v l )

Flutter - Material3适配

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 Flutter - Material3适配 对比图具体实现一些组件的变化 代码实现Material2的ThemeDataMaterial3的ThemeData Material3适配官方文档 flutter SDK升级到3.16.0之后 …

时间处理基础:Rust 的 chrono 库教程

在开发过程中&#xff0c;我们经常有对时间和日期处理的需求。不论是日历应用、日程安排、还是时间戳记录&#xff0c;准确的时间数据处理都是必不可少的。Rust 社区提供的 chrono 库以其强大的功能和灵活的接口&#xff0c;在 Rust 开发者中广受欢迎。本文将简单介绍 chrono 库…