k8s的二进制部署
k8s的二进制部署
k8s的二进制部署的实验:
源码包部署
k8s的master01:192.168.233.91
组件:kube-apiserver kube-controller-manager kube-scheduler etcd
k8s的master02:192.168.233.92
组件:kube-apiserver kube-controller-manager kube-scheduler
node节点01:192.168.233.93 kubelet kube-proxy etcd
node节点02:192.168.233.94 kubelet kube-proxy etcd
负载均衡:nginx+keepalived:master:192.168.233.95
backup:192.168.233.96
etcd:192.168.233.91
192.168.233.93
192.168.233.94
91、93、94主机:

清空iptables的所有策略

关闭交换分区
swapoff -a
![]()
k8s在设计时,为了提升性能,默认是不使用swap交换分区的,kubenetes在初始化时,会检测swap是否关闭
91:
![]()
93:
![]()
94:
![]()
91、93、94:
![]()


#开启网桥模式
net.bridge.brideg-nf-call-ip6tables=1
net.bridge.brideg-nf-call-iptables=1
#网桥的流量传给iptables链,实现地址映射
#关闭ipv6的流量(可关也可以不关)
net.ipv6.conf.all.disable_ipv6=1
#根据工作中的实际情况,自定
net.ipv4.ip_forward=1

![]()
时间同步
yum install ntpdate -y
ntpdate ntp.aliyun.com
![]()
![]()
date

部署 docker引擎
91、93、94:
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
systemctl start docker.service
systemctl enable docker.service

部署 etcd 集群
(部署第一个组件,存储k8s的集群信息和用户配置组件)
(etcd是一个高可用----分布式的键值存储数据库,采用raft算法保证节点的信息一致性。etcd是go语言写的)
(etcd的端口:2379:api接口,对外为客户端提供通信
2380:内部服务的通信端口
etcd一般都是集群部署,etcd也有选举leader的机制,至少要三台,或者奇数台)
k8s的内部通信依靠证书认证,密钥认证:证书的签发环境
91:
把三个证书拖进来

sfssl:证书签发的命令工具
cfssl-certinfo:查看证书信息的工具
cfssljson:把证书的格式转化成json格式,变成文件的承载式证书
移到bin目录下面
mv cfssl-certinfo cfssljson cfssl /usr/local/bin/
![]()
chmod 777 /usr/local/bin/cfssl*

cd到opt,然后创建一个mkdir k8s的目录
mkdir /opt/k8s
![]()
![]()
拖两个证书包到k8s

vim etcd-cert.sh
![]()
记得改文件里的IP地址

赋权
chmod 777 etcd-cert.sh etcd.sh

mkdir /opt/k8s/etcd-cert

mv etcd-cert.sh etcd-cert
![]()
cd etcd-cert/
./etcd-cert.sh

ca-config.json:配置了证书生成策略,定义了默认过期时间和一个名为 "www" 的配置模板
ca-csr.json:用于生成根证书和私钥的签名请求文件。包括了Common Name(CN),密钥算法和一些组织信息
ca.pem:根证书文件
server-csr:服务器证书签名请求文件
server-key.pem:生成etcd服务器证书和私钥
server.pem:etcd服务器的证书文件,用于加密和认证etcd节点之间的通信


tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
![]()



![]()

cd /opt/k8s/etcd-cert/
cp *.pem /opt/etcd/ssl/
![]()

![]()
./etcd.sh etcd01 192.168.233.31 etcd02=https://192.168.233.33:2380,etcd03=https://192.168.233.34:2380
![]()
再开一台91的终端:
传参到93和94的主机
scp -r /opt/etcd/ root@192.168.233.93:/opt/

scp -r /opt/etcd/ root@192.168.233.94:/opt/

scp /usr/lib/systemd/system/etcd.service root@192.168.233.93:/usr/lib/systemd/system/

scp /usr/lib/systemd/system/etcd.service root@192.168.233.94:/usr/lib/systemd/system/

93:

![]()

94:

![]()

91、93、94:
(谁先启动谁是主)


91:
检查etcd群集状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.233.91:2379,https://192.168.233.93:2379,https://192.168.233.94:2379" endpoint health --write-out=table

master节点的部署:
91:
上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包

![]()
91是主节点
92是从节点
95和96是nginx的IP地址

unzip master.zip

vim controller-manager.sh
![]()
指向apiserver的ip地址

![]()

![]()

chmod 777 *.sh

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
![]()
mkdir /opt/k8s/k8s-cert
![]()
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert

cd /opt/k8s/k8s-cert/
./k8s-cert.sh
cp ca*pem apiserver*pem /opt/kubernetes/ssl/

cd /opt/k8s/
![]()
拖软件包

tar zxvf kubernetes-server-linux-amd64.tar.gz

cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
![]()
ln -s /opt/kubernetes/bin/* /usr/local/bin/
![]()

#!/bin/bash
#获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

chmod 777 token.sh
![]()
./token.sh
![]()
cat /opt/kubernetes/cfg/token.csv

二进制文件、token、证书都准备好后,开启 apiserver 服务
cd /opt/k8s/
./apiserver.sh 192.168.233.91 https://192.168.233.91:2379,https://192.168.233.93:2379,https://192.168.233.94:2379
![]()
netstat -antp | grep 6443

./scheduler.sh

./controller-manager.sh

./admin.sh

通过kubectl工具查看当前集群组件状态
kubectl get cs


node节点的部署:
93、94:
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

![]()
拖软件包

unzip node.zip

91:
![]()
scp kubelet kube-proxy root@192.168.233.93:/opt/kubernetes/bin/

scp kubelet kube-proxy root@192.168.233.94:/opt/kubernetes/bin/

91:
![]()
拖软件包

![]()

![]()
chmod 777 kubeconfig.sh
![]()


scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.233.93:/opt/kubernetes/cfg/

scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.233.94:/opt/kubernetes/cfg/

93:

94:

91:
RBAC授权,生成和赋权用户,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

若执行失败,可先给kubectl绑定默认cluster-admin管理员集群角色,授权对整个集群的管理员权限
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

93:
chmod 777 kubelet.sh

./kubelet.sh 192.168.233.93

91:




94:
![]()
![]()

![]()
91:




kube-proxy节点上的网络代理部署:
93:
cd /opt
![]()
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

chmod 777 proxy.sh
![]()
./proxy.sh 192.168.233.93
![]()
ps aux | grep kube-proxy

94:
cd /opt
![]()
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


安装flannel:
93、94:
把软件包拖到opt目录
![]()
![]()
![]()
![]()
![]()
91:
cd /opt/k8s
传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络



93、94:
ifconfig查看一下有没有flannel.1
部署 CoreDNS
CoreDNS:可以为集群中的 service 资源创建一个域名与 IP 的对应关系解析。
service是对外提供访问的地址,现在我们加入DNS机制之后,可以直接访问服务名
在所有 node 节点上操作
93、94:
#上传 coredns.tar 到 /opt 目录中
cd /opt
docker load -i coredns.tar
![]()
//在 master01 节点上操作
91:
#上传 coredns.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS
cd /opt/k8s
kubectl apply -f coredns.yaml

kubectl get pods -n kube-system

#DNS 解析测试
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
![]()
/ # nslookup kubernetes
![]()
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
Name: kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

exit
master02 节点部署
92:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

#在master添加hosts
cat >> /etc/hosts << EOF
192.168.233.91 master01
192.168.233.93 node01
192.168.233.94 node02
EOF

91:
![]()

92:
![]()

93:
如上同步
94:
如上同步
91、92、93、94同步操作:
![]()
![]()

91:
从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点
scp -r /opt/etcd/ root@192.168.233.92:/opt/
scp -r /opt/kubernetes/ root@192.168.233.92:/opt
scp -r /root/.kube root@192.168.233.92:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.233.92:/usr/lib/systemd/system/
92:
修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.233.91:2379,https://192.168.233.93:2379,https://192.168.233.94:2379 \
--bind-address=192.168.233.92 \ #修改
--secure-port=6443 \
--advertise-address=192.168.233.92 \ #修改
在 master02 节点上启动各服务并设置开机自启
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service

查看node节点状态
ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes

弄完之后查看一下node状态 以及pod

负载均衡部署:
35、36同步操作:

配置nginx的官方在线yum源,配置本地nginx的yum源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF

yum install nginx -y

修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
vim /etc/nginx/nginx.conf
![]()
(以下内容可以直接把配置文件里的东西全部删掉,然后使用)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
#添加
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
#日志记录格式
#$remote_addr: 客户端的 IP 地址。
#$upstream_addr: 上游服务器的地址。
#[$time_local]: 访问时间,使用本地时间。
#$status: HTTP 响应状态码。
#$upstream_bytes_sent: 从上游服务器发送到客户端的字节数。
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 192.168.233.31:6443;
server 192.168.233.32:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}

重启和开启自启nginx

部署keepalived服务
yum install keepalived -y
![]()
! Configuration File for keepalived
global_defs {
# 接收邮件地址
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 邮件发送地址
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
#lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP
#vrrp_strict #注释掉
}
#添加一个周期性执行的脚本
vrrp_script check_nginx {
script "/etc/nginx/check_nginx.sh"
#指定检查nginx存活的脚本路径
}
vrrp_instance VI_1 {
state MASTER
#lb01节点的为 MASTER,lb02节点的为 BACKUP
interface ens33
#指定网卡名称 ens33
virtual_router_id 51
#指定vrid,两个节点要一致
priority 100
#lb01节点的为 100,lb02节点的为 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.233.100/24 #指定 VIP
}
track_script {
check_nginx #指定vrrp_script配置的脚本
}
}




创建nginx状态检查脚本
vim /etc/nginx/check_nginx.sh
![]()
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
# /etc/init.d/keepalived stop
systemctl stop keepalived
fi

chmod +x /etc/nginx/check_nginx.sh
![]()
先启动nginx,再启动keepalived

ip a查看虚拟ip地址
![]()
可以停主的nginx 看看ip有没有飘到备上

93、94同步操作:
修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig
![]()
vim kubelet.kubeconfig
server: https://192.168.233.100:6443
vim kube-proxy.kubeconfig
server: https://192.168.233.100:6443

重启kubelet和kube-proxy服务
systemctl restart kubelet.service
systemctl restart kube-proxy.service

然后用主的有虚拟ip的主机查看端口号6443

##### 在 master01 节点上操作 #####
//测试创建pod
kubectl run nginx --image=nginx
//查看Pod的状态信息
kubectl get pods
部署 Dashboard:
Dashboard:仪表盘,kubernetes的可视化界面,在这个可视化界面上,可以对k8s集群进行管理
91:
在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中

kubectl apply -f recommended.yaml
![]()
创建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

获取token值
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

然后用浏览器登录 (有的浏览器用不了)
![]()
点击高级


这一步的密码就是上面几步中获取token值的密码


进入到这里算完成创建

补齐的命令部署:
![]()
在最后一行

![]()
相关文章:
k8s的二进制部署
k8s的二进制部署 k8s的二进制部署的实验: 源码包部署 k8s的master01:192.168.233.91 组件:kube-apiserver kube-controller-manager kube-scheduler etcd k8s的master02:192.168.233.92 组件:kube-api…...
Python基础语法总结
1.每条语句结束不需要分号(也可以加上), 直接换行, 注意: 如果两行代码写一行, 则必须加分号. 2.定义变量不需要指定类型(如果需要写类型, 需要在变量名后面加": 类型, 这个写法只是方便读代码). 3.变量名大小写敏感. 4.查看变量类型: type(变量名). 5.Python中的int表…...
矩阵理论基本知识
1、矩阵范数、算子范数 矩阵无穷范数是非自相容范数,矩阵1-范数、矩阵2-范数是自相容范数矩阵2-范数:Frobenius范数,是向量2-范数的自然推广。 ∥ A ∥ m 2 ∥ A ∥ F ∑ a i j ∗ a i j \|A\|_{m2}\|A\|_{F}\sqrt{\sum a_{ij}^*a_{ij}} ∥…...
《深入理解Java虚拟机(第三版)》读书笔记:Java内存区域与内存溢出异常、垃圾收集器与内存分配策略
下文是阅读《深入理解Java虚拟机(第3版)》这本书的读书笔记,如有侵权,请联系删除。 文章目录 第2章 Java内存区域与内存溢出异常2.2 运行时数据区域2.3 HotSpot虚拟机对象探秘 第3章 垃圾收集器与内存分配策略3.2 对象已死&…...
android 手机主界面侧滑退出app问题
最近重新搭了个app,发现手机显示APP主界面时,沿着手机右边向左滑,会直接关闭应用,所以想搞个第一次提示,第二次退出app的效果。 结果搞出个复杂的东西,下面是两段代码。1: 1:GestureDetector扩展函数。其…...
spring boot 配置全局日期和时间格式
spring boot 为项目配置 全局日期和时间格式化yyyy-MM-dd HH:mm:ss 方式一:代码配置全局日期和时间格式化 /*** author hua*/ Configuration public class WebConfiguration implements WebMvcConfigurer {/*** 项目全局时间格式化*/ Bean public ObjectMapper get…...
GoLang学习之路,对Elasticsearch的使用,一文足以(包括泛型使用思想)(二)
书写上回,上回讲到,Elasticsearch的使用前提即:语法,表结构,使用类型结构等。要学这个必须要看前面这个:GoLang学习之路,对Elasticsearch的使用,一文足以(包括泛型使用思…...
鸿蒙APP的代码规范
鸿蒙APP的代码规范是为了确保代码质量、可读性和可维护性而定义的一系列规则和标准。以下是一些建议的鸿蒙APP代码规范,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 代码风格: 采用…...
蓝桥杯-每日刷题-027
出租汽车计费器 一、题目要求 题目描述 有一个城市出租汽车的计费规则是3公里内(含3公里)基本费6元,超过3公里,每一公里1.4元。 现在对于输入具体的公里数x(0<x<1000),编程计算x公里所需…...
安装Node修改Node镜像地址搭建Vue脚手架创建Vue项目
1、安装VSCode和Node 下载VSCode Visual Studio Code - Code Editing. Redefined 下载Node Node.js (nodejs.org) 检验是否安装成功,WinR,输入cmd命令,使用node -v可以查看到其版本号 2、修改镜像地址 安装好node之后,开始修改镜像地址 …...
git 学习 之一个规范的 commit 如何写
最好的话做一件完整的事情就提交一次...
2023 年人工智能研究与技术排名前 10 的国家
人工智能研究是一项全球性的工作。虽然美国和中国因其对人工智能的贡献而备受关注,但事实是,世界各国都在涉足这项技术,尝试新的突破,并吸引投资者的关注。 斯坦福大学的《2023年人工智能报告》估计,到 2022 年&#…...
留言板(Mybatis连接数据库版)
目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段,补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…...
第十二章 Sleuth分布式请求链路跟踪
Sleuth分布式请求链路跟踪 gitee:springcloud_study: springcloud:服务集群、注册中心、配置中心(热更新)、服务网关(校验、路由、负载均衡)、分布式缓存、分布式搜索、消息队列(异步通信)、数…...
EasyExcel多线程批量导出数据,动态表头,静态资源访问
1.导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>2.建立实体 Data public class ActResultLogVO implements Serializable {private static…...
树莓派界面改成中文
安装完树莓派系统(Raspberry Pi OS with Desktop),第一次启动时,时会有如下面二个图所示,让你选择区域时区和语言。 树莓派默认的语言为英文,如果你在安装时没有选择的话,默认的区域为英国,语言为英国英文&…...
软件工程期末复习
● 用例:借书 ●参与者:管理员,借阅者 ●操作流: ① 管理员进入图书借阅界面,用例开始。 ② 系统要求输入借阅者的借书证编码。 ③系统检验借书证编码,如果正确,则显示借阅者的信息。 A1:借书证编码有错。 A2: 如果该借…...
【linux】select实现定时器
/*秒级定时器*/ void seconds_sleep(unsigned long seconds) {if(seconds 0) return;struct timeval tv;tv.tv_secseconds;tv.tv_usec0;int err;do{errselect(0,NULL,NULL,NULL,&tv);}while(err<0 && errnoEINTR); }/*毫秒定时器*/void milliseconds_slee…...
Android 13 - Media框架(28)- MediaCodec(三)
上一节我们了解到 ACodec 执行完 start 流程后,会把所有的 input buffer 都提交给 MediaCodec 层,MediaCodec 是如何处理传上来的 buffer 呢?这一节我们就来了解一下这部分内容。 1、ACodecBufferChannel::fillThisBuffer ACodec 通过调用 A…...
Azure 学习总结
文章目录 1. Azure Function1.1 Azure Function 概念1.2 Azure Function 实现原理1.3 Azure Function 本地调试1.4 Azure Function 云部署 2. Azure API Managment 概念 以及使用2.1 Azure API 概念2.2 Azure API 基本使用 3. Service Bus 应用场景及相关特性3.1 Service Bus 基…...
Gemini自动生成PPT实战手册:从零输入到专业演示文稿,3步完成95%的幻灯片工作流
更多请点击: https://intelliparadigm.com 第一章:Gemini自动生成PPT的核心原理与能力边界 Gemini 生成 PPT 的本质并非传统模板填充,而是基于多模态理解与结构化内容重构的端到端推理过程。其核心依赖于对用户输入(文本、大纲、…...
别再乱接电源了!STM32的VDDA、VSSA、VBAT引脚,一个没接对,ADC采样全是噪声
STM32电源设计实战:VDDA、VSSA与VBAT的噪声抑制艺术 当你的STM32项目遇到ADC采样值跳变、RTC计时不准或程序下载失败时,电源引脚的设计往往是罪魁祸首。许多工程师在PCB布局时,对这些看似简单的电源引脚处理过于随意,结果在调试阶…...
别再手动拷贝DLL了!用批处理一键搞定NX二次开发EXE的环境变量配置(VS2015+NX12)
NX二次开发环境配置革命:批处理脚本全自动解决方案 引言 对于NX二次开发工程师来说,最令人头疼的莫过于每次编译后的EXE文件无法直接运行的问题。传统解决方案要么需要手动拷贝DLL文件,要么必须将EXE放置到特定目录下,这些方法不仅…...
NoFences:彻底解决Windows桌面杂乱问题,免费开源桌面整理革命
NoFences:彻底解决Windows桌面杂乱问题,免费开源桌面整理革命 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否厌倦了Windows桌面上满屏的图标&a…...
模拟计算机应急救场:从400Hz电源故障看经典工程思维
1. 项目概述:一次由模拟计算机主导的“救场”1984年,在宾夕法尼亚州费城的一个大型测试实验室里,一个为海军战斗机设计的红外跟踪系统正面临一场突如其来的危机。这个系统被安装在一个三轴液压驱动的万向节上,需要在特定的400赫兹…...
计算机人别卷开发了!这个方向让我毕业年入_20_万,兼职还能赚8K
一、我那 “躺赢” 的同学:从找不到工作到 offer 拿到手软 去年毕业季,我们班一半人在死磕 LeetCode 求开发岗,月薪 8K 都要抢破头;而隔壁宿舍的阿凯,没卷一道算法题,却拿到了 3 家企业的安全岗 offer&…...
CSS 混合模式完全指南
CSS 混合模式完全指南 引言 CSS 混合模式(Blend Modes)是一种强大的视觉效果工具,它允许你控制多个元素或图层如何混合在一起。本文将深入探讨各种混合模式的用法和高级技巧。 混合模式类型 基础混合模式 模式效果描述normal默认模式…...
从Java后端到AI风口:转型踩坑一年,我悟了!涨薪30%的真相是…
做了八年Java后端,去年咬牙转型AI应用开发。这一年踩过坑、加过班、也被面试官问倒过。但回头看,这条路选对了——薪资涨了30%,职业空间也打开了。我必须告诉那些还在犹豫要不要从后端跳出来的同行——现在的AI应用开发社招,确实是…...
【研报 A111】中国生命科学AI行业发展蓝皮书:三阶段演进,2026年进入创造应用期
摘要:生命科学领域的AI赋能正迎来产业跃迁,AI4LS作为AIforScience最核心的应用场景,凭借处理多维复杂数据的天然优势,破解生命科学研发周期长、数据庞杂的痛点。当前行业正处于2.0预测阶段向3.0创造阶段的过渡期,Alpha…...
何为可编程控制器?可编程控制器4大内容介绍
可编程控制器在控制中常为使用,因此本文将从4大方面对可编程控制器予以介绍,以增进大家对可编程控制器的了解。这4大方面包括:1.何为可编程控制器?2. 可编程控制器的基本组成,3. 可编程控制器发展史,以及4. 可编程控制…...
