kubernetes

news2024/11/23 19:24:50

目录

一、容器云发展及主要内容

1、云平台计算,交付标准(iaas-----openstack)

2、平台即服务(PAAS)

3.软件及服务(SAAS)

特点

二、内容

三、kubernetes集群架构与组件

基本组件

(1)Pod(最小的资源单位)

(2)初始化容器(initcontainers)

(3)业务容器(Maincontainer)

(4)服务发现(Service同一组Pod的访问策略)

(5)存储

(6)调度器(Scheduler)

(7)label

(8)Namespaces

(9)Annotations

(10)集群安全

(11)HELM(K8S 中包的管理工具)

四、K8S架构

1.master组件

(1)kube-apiserver

(2)kube-controller-manager(控制器管理中心-定义资源类型)

2.node组件

3.用户访问流程

五、kubernetes

1.准备环境

(1)将桥接的 IPv4 流量传递到 iptables 的链 

(2)docker安装

2.所有节点配置K8S源

(1)安装 kubelet、kubeadm、kubectl 组件

(2)master节点制作

(3)创建K8S组件的家目录 提权(必做)

(4)复制、记录申请加入集群命令

3.重新生成token

4.上传 kube-flannel.yaml 或者直接下载(直接下载需要改动参数)

(1)直接上传

(2)使用在线源下载

(3)调整参数

(4)给node节点打上“node”的标签

5.验证 


一、容器云发展及主要内容

1、云平台计算,交付标准(iaas-----openstack)

国内:阿里云—华为云(振兴杯)百度云(私有云)  微软云  其他云

国外:AWS

2、平台即服务(PAAS)

例如:新浪云(号称免运维)

用户下单→下单到sina运维,进行坏境构建,平台级的运维

迭代:产生出来很多运维工具,例如ansible(幂等性)、saltstack、jenkins,这些运维工具可以自动化创建一些环境。

但是,不同环境的要求不一样,需要考虑、解决各种环境匹配、兼容问题

diocker统一了运行环境、发布方式、封装方式

同时,docker→自动构建运行环境封装体→docker成为这一代PAAS的运行环境标准

容器集群化管理

资源管理器/资源管理框架(管理工具):

①早期是mesos (Apache基金会)早期只作为资源管理平台,开源、分布式的管理框架,后来被推特看上,做为基础管理平台,大规模盛行。

②2019年推特宣布不用mesos、而全部使用kubernetca。

③mesos 官方公布,可以在平台上管理k8: (borge)

但是k8:与底层虚拟化相性很简单,未必需要多一步使用mesos

④docker Sw&Lm : docker 父公司的产品,也是一种docker 集群化管理的解决方案

优势:轻量

但是相对于K8s而言,实现的功能还是比较少,例如k8s的

滚动更新、回滚,可以实现,但是很复杂,除此之外大规模集群的使用和管理还是很强大的

⑤kubernetes稳定、适合生产、全面,成为了主要的解决方案→谷歌

kubernetes的名字来自希腊语,意思是“舵手”或“领航员”, K8s是将8个字母"ubernete"替换为“8"的缩写。

mesos + zk + marathon→资源管理的架构(目前使用mesos产品的主流搭配)

3.软件及服务(SAAS)

直接使用成品(直接访问服务端)

Kubernetes Google 10年容器化基础架构→borg架构(内部资源管理器)

随着docker 流行,Borg 派出几个内部工程师,使用go语言以Borg系统设计思路

设计了一款新的资源管理系统→kubernetes ,并且开源贡献给了容器基金会→当前的标准

特点

①轻量级

一些解释性语言:例如Python/JavaScript / Perl /Shell,效率较低,占用内存资源较多。

使用go语言→编译型语言,语言级别支持进程管理,不需要人为控制,所以以go开发的资源消耗占用资源小。

[List-watch] + informer  二级缓存

②开源

③自我修复(控制器控制pod,保证pod可以维持所期望的副本数量3)

scale 副本集

        在节点故障时“重新启动”失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。

对异常状态的容器进行重建(先创建、再删除),目的是保证业务线不中断。

节点上的pod无限重启→故障项

④弹性伸缩(自动)

手动弹性伸缩(针对于pod),当I/0读/写、磁盘、内存的压力(单个pod) > 80%,修改replicasets :

3→4

更新一下nginx. Yml

自动: Yml →阈值cpu使用率> 80%→触发扩容pod (CPU使用上限,docker-cgroup k8s → 1.limit、2.configmap-配置文件)

使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。

弹性→人为只要指定规则,满足条件时,就会自动触发 扩容或缩容的操作
伸缩→扩容和缩容(节点 应用类型nginx)

⑤ 自动部署和回滚
打好容器的镜像
一条指令就可以自动部署

       K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不会影响业务。

⑥ 服务发现(类比于docker中的-p )和负载均衡

⑦ 机密(加密配置)和(普通)配置管理(secret→安全/认证加密性的数据 configmap→例如配置文件)

       管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

⑧ 存储编排(静态、动态)

静态:volume (docker run -itd -v /tmp:/tmp tomcat:latest /bin/bash )→挂载在本地
动态:挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。

⑨ 批处理

提供一次性任务(job),定时任务(crontab);满足批量数据处理和分析的场景

目的:
K8S 目标是为了让部署容器化应用、管理容器集群资源更加简单高效

二、内容

资源清单(yml):资源  掌握资源清单的语法(yml)  编写 Pod(yml)   掌握 Pod 的生命周期

Pod 控制器:掌握各种控制器的特点以及使用定义方式

服务发现:掌握 SVC(service) 原理及其构建方式(service 的yml)

存储:掌握多种存储类型(静态、动态)的特点 并且能够在不同环境中选择合适的存储方案(有自己
的理解-有状态服务/无状态的服务)

调度器(Scheduler):掌握调度器原理(预选和优选)  能够根据要求把Pod 定义到想要的节点运行(selector)

安全:集群的认证  鉴权  访问控制 原理及其流程

三、kubernetes集群架构与组件

基本组件

(1)Pod(最小的资源单位)

       一个pod 会封装多个容器组成一个子节点的运行环境 (最小单元,容器的种类3+)
最小部署单元
      一组容器的集合(基础容器 + 初始化容器+ 业务容器(主应用容器+挂斗/副容器)
PS:基础容器
维护整个Pod网络和存储空间
node节点中操作
启动一个实例时,k8s会自动启动一个init容器,然后启动基础容器最后启动主容器
 

(2)初始化容器(initcontainers)

        Init容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。

Init容器与普通的容器非常像,除了以下两点
① Init容器总是运行到成功完成为止
② 每个Init容器都必须在下一个Init容器启动之前成功完成

        如果 Pod 的Init容器失败,k8s 会不断地重启该Pod(为了让init容器可以启动完成),直到 Init容器成功为止。然而,如果 Pod对应的重启策略(restartPolicy)为Never,不会重新启动。
 

(3)业务容器(Maincontainer)

1)往往是并行启动,但是也有例外情况→看控制器类型(参照物Pod)
2)业务容器并行启动→Pod内部的多个业务容器

一个Pod中的容器共享网络命名空间(基础容器提供的pause)
概念:Pod是短暂的 (叙述的是其生命周期)
① 副本集 
② 自动修复
③ 弹性伸缩
④ 探针
⑤ 回滚 
⑥ service的服务发现和kube-proxy的负载均衡
以上共同保障Pod的可用性和健康性→保障业务正常运行

Pod 控制器

ReplicaSet(RS子控制器)确保期望的Pod副本数量,直接控制pod的控制器类型
Deployment 无状态应用控制器(部署) 并行启动
StatefulSet  有状态应用部署,特性之一是 启动与关闭pod,都是有先后启动/关闭顺序的 依次启动与关闭
DaemonSet确保所有Node运行相同服务/应用的一个Pod
Job一次性任务
Cronjob  定时任务
ingress管理的是L7层的网络模式(HTTP/HTTPS流量)
PV PVC动态存储

ingress包含:nginx、Haproxy、traffic、istio、kong

(4)服务发现(Service同一组Pod的访问策略)

一组:通过相同标签的标签选择器关联在一起

1)通过service这个统一入口/定义的访问策略对外暴露服务的方式
        K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问
PS:以上解释的其实就是K8S→扁平化网络的默认通讯方式(二层局域网)

       可以通过Service服务发现,把我们内部的pod资源暴露给客户端访问/发布出来(以暴露一个ip:端口的方式),让客户端可以通过这个IP:端口的形式访问到K8S内部的多个pod(通常意义上是一个应用的副本集)

        Service 作为一组Pod 的统一访问出入口(定义一组Pod的访问策略),以RR分流算法进行负载均衡,把Pod中的应用服务暴露出来给客户端访问service →暴露方式是L4四层的

访问的方式是通过kube-proxy 匹配iptables功能进行转发的(四层)
       k8s官方默认提供了四层的代理/负载均衡方式,而我们可以借助于官方后续支持的ingress-nginx 提供七层转发/负载均衡。

2)service
创建service需要ServiceController,EndpointController,kube-proxy,三大模块同时协作

serviceController 是控制service 来创建对应的Pod关联的规则的
endpointController 是定义后端pod的具体位置,也就是endpoint(upstream +consul的自动发现和更新)
kube-proxy 是用来定义具体的后端转发和分流规则的
以上组成了一个service所必要的功能

① ServiceController
当一个service对象状态发生变化的时候,Informer都会通知ServiceController,创建对应的服务

② EndpointController
主体:service pod 
主体:endpoint对象
endpointcontroller 是:nginx的upstream(service endpoint) + consul中的发现、更新

EndpointController会同时订阅Service和Pod的增删事件。其功能如下

负责生成和维护所有endpoint对象的控制器

负责监听service和对应pod的变化

监听到service被删除,则删除和该service同名的endpoint对象

监听到新的service被创建,则根据新建service信息(YAML)获取相关pod列表,然后创建对应endpoint对象

监听到service被更新,则根据更新后的service信息获取相关pod列表,然后更新对应endpoint对象

监听到pod事件,则更新对应的service的endpoint对象,将podIp记录到endpoint中

③ kube-proxy
kube-proxy 负责service实现,实现了k8s内部service和外部node port到service的访问。
kube-proxy采用iptables的方式配置负载均衡,基于iptables的kube-proxy的主要职责包括两大块:           一块是侦听service更新事件,并更新service相关的iptables规则,一块是侦听endpoint更新事件,更新endpoint相关的iptables规则(如 KUBE-SVC-链中的规则),然后将包请求转入endpoint对应的Pod。

(5)存储

服务分类:
① 无状态服务:LVS (加入集群后,无特殊性需求--存储)
服务不依赖自身的状态,实例的状态数据可以维护在内存中。
任何一个请求都可以被任意一个实例处理。
不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。
在一个封闭的系统中,只存在一个数据闭环。
通常存在于单体架构的集群中。

② 有状态服务:例如数据库(有特殊状态需求,例如:需要持久化、需要特定的数据支持)
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
一个请求只能被某个节点(或者同等状态下的节点)处理。
存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
通常存在于分布式架构中。

无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息

有状态服务:与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等

有状态:需要持久化,多次请求之间需要共享一些信息
无状态:一次性,不需要持久化的特殊状态,每次请求都是一条新的数据

有状态服务:指的是有独立状态的应用,例如mysql redis (数据库)
无状态服务:指的是没有独立状态的应用,例如nginx的部分功能

(6)调度器(Scheduler)

K8S会自动完成把一个新的pod 调度到对应的节点(预选/优选算法)
需要将pod创建的过程(比如创建到的节点位置)进行管理,
  指定节点位置创建Pod(指定调度)
  将不同的Pod创建在一个节点上(亲和)
  将不同的Pod 创建在不同的节点上(反亲和)
  根据需要,对pod进行节点组装等

(7)label

创建一个POD 
1、编写pod yml文件(nginx资源怎么跑,用什么环境变量,需不需要资源限制,要调度到哪个节点) label:nginx 
2、把pod 暴露出去,Service→通过yml文件定义 label:nginx 
通过同一个label标签,进行关联,组合在一起
 

(8)Namespaces

命名空间,将对象逻辑上隔离
资源名称空间:网络、user、pid 、default 
kube-system
kube-node-release
kube-public

(9)Annotations

注释(描述性信息,开发的配置文件模块,或者yml模板文件中会进行英文注释)

(10)集群安全

认证、鉴权、访问控制、原理及流程RBAC(鉴权方式)/CA(证书、密钥认证形式)
从搭建集群,就需要用到加密,CA认证
管理和控制,必须先通过认证/授权,才能进行管理
跑的一些应用,nginx、squid →需要一些访问控制策略
RBAC 认证 授权模块

(11)HELM(K8S 中包的管理工具)

类似linux里面yum 
helm 安装 magodb
helm 模板、自定义
chart release
 

四、K8S架构

K8S 是一个典型的C/S架构,由master端和node端组成

1.master组件

(1)kube-apiserver

        Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口 服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给 Etcd存储。

(2)kube-controller-manager(控制器管理中心-定义资源类型)

        处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager  就是负责管理这些控制器的。
③ kube-scheduler    根据调度算法(预选/优选的策略)为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
④ etcd
  分布式键值存储系统(特性:服务自动发现)。用于保存集群状态数据,比如Pod、Service等对象信息

⑤ AUTH :认证模块
K8S 内部支持使用RBAC认证的方式进行认证

2.node组件

① kubelet
       kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创 建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
 kubelet →先和docker 引擎进行交互→docker容器 (一组容器跑在Pod中)
② kube-proxy(四层) →对于七层的负载,k8s官方提供了一种解决方案→ingress-nginx
  在Node节点上实现Pod网络代理,维护网络规则、pod之间通信和四层负载均衡工作。
  默认会写入规则至iptables ,目前支持IPVS、同时还支持namespaces
③ docker或rocket
  容器引擎,运行容器。

3.用户访问流程

用户需创建 nginx资源(网站/调度)kubectl →auth →api-server
基于yaml 文件的 kubectl create run / apply -f nginx.yaml(pod 一些属性,pod )
 1)请求发送至master 首先需要经过apiserver(资源控制请求的唯一入口)
 2)apiserver 接收到请求后首先会先记载在Etcd中
 3)Etcd的数据库根据controllers manager(控制器) 查看创建的资源状态(有无状态化)
 4) 通过controllers 触发 scheduler (调度器)
 5) scheduler 通过验证算法() 验证架构中的nodes节点,筛选出最适合创建该资源,接着分配给这个节点进行创建
 6)node节点中的kubelet 负责执行master给与的资源请求,根据不同指令,执行不同操作
 7)对外提供服务则由kube-proxy开设对应的规则(代理)
 8)container 容器开始运行(runtime 生命周期开始计算)
 9)外界用户进行访问时,需要经过kube-proxy →service 访问到container (四层)
 10)如果container 因故障而被销毁了,master节点的controllers 会再次通过scheduler 资源调度通过kubelet再次创建容器,恢复基本条件限制(控制器,维护pod状态、保证期望值-副本数量)
pod →ip 进行更改→service 定义统一入口(固定被访问的ip:端口)

项目对外访问流程

对外访问流程
七层(ingress-nginx/load balance)→ 四层 (kube-proxy→service)→访问策略入口(定义一组pod)

五、kubernetes

1.准备环境

swapoff -a  临时
sed -ri 's/.*swap.*/#&/' /etc/fstab 永久
free -g #验证,swap 必须为 0

 

vim /etc/hosts
192.168.22.228 master
192.168.22.168 node01
192.168.22.206 node02

 

  

(1)将桥接的 IPv4 流量传递到 iptables 的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

 

(2)docker安装

1)安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

2)设置阿里云镜像源

cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3)安装docker-ce 社区版

yum install -y docker-ce

4)关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

systemctl start docker
systemctl enable docker

2.所有节点配置K8S源

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)安装 kubelet、kubeadm、kubectl 组件

yum list|grep kube
yum install -y kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3
systemctl enable kubelet
systemctl start kubelet

 

  

(2)master节点制作

kubeadm init \
--apiserver-advertise-address=192.168.22.228 \ 
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.21.3 \
--service-cidr=10.125.0.0/16 \
--pod-network-cidr=10.150.0.0/16

如有问题:
kubeadm init --apiserver-advertise-address=192.168.22.228 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version v1.21.3 --service-cidr=10.125.0.0/16 --pod-network-cidr=10.150.0.0/16

 

 

(3)创建K8S组件的家目录 提权(必做)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

镜像批量导出,方便以后使用docker save `docker images | grep -v TAG | awk '{print $1":"$2}'` 
-o name.tar.gz

 

(4)复制、记录申请加入集群命令

kubeadm join 192.168.22.228:6443 --token q4z0vx.jy5op60uxko19sou \
    --discovery-token-ca-cert-hash sha256:8a84bd4d56404732591af2f6a200ed01d1256107a42114ed3c138368df9f28f8

 

3.重新生成token

若token 过期或丢失,需要先申请新的token 令牌

kubeadm token create

列出token

kubeadm token list  | awk -F" " '{print $1}' |tail -n 1

然后获取CA公钥的的hash值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed  's/^ .* //'

替换join中token及sha256

kubeadm join 192.168.226.128:6443 --token zwl2z0.arz2wvtrk8yptkyz \
    --discovery-token-ca-cert-hash sha256:e211bc7af55310303fbc7126a1bc7289f16b046f8798008b68ee01051361cf02

4.上传 kube-flannel.yaml 或者直接下载(直接下载需要改动参数)

(1)直接上传

kubectl apply -f kube-flannel.yml

 

(2)使用在线源下载

kubectl delete -f \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
或者使用镜像包导入的方式完成flannel的部署

(3)调整参数

cd /etc/kubernetes/mainfests/

vim kube-controller-manager.yaml

26行 --port=0  ”#“注释掉

vim kube-scheduler.yaml
#19行参数注释 - --port=0

如果不调整,使用kubect1 get cs的时候,会看到2个unhealthy

使用watch -n 1 kubectl get pods -A 等待pod ”running“


kubectl label node node01 node-role.kubernetes.io/node=node
kubectl label node node02 node-role.kubernetes.io/node=node

 

 

 

 

 

 

kubectl get nodes

  

(4)给node节点打上“node”的标签

kubectl label node node01 node-role.kubernetes.io/node=node

kubectl label node node02 node-role.kubernetes.io/node=node

kubectl get nodes

 

5.验证 

部署服务
kubectl create deployment nginx --image=nginx

暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods
kubectl get svc(service)

删除pod与svc
kubectl delete deploy/nginx
kubectl delete svc/nginx

 

 

 

  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息系统综合测试与管理__软件测试

一 概念 软件测试是使用人工或者自动手机来运行或测试某个系统的过程&#xff0c; 目的是检测是否满足需求或者比较预期与实际的差别。 软件测试应该覆盖整个开发、维护过程&#xff0c; 不仅仅是编码阶段完成之后进行的一项活动。 常考的软件测试工具为LoadRunner, 是一种…

RHCE——分区、创建逻辑卷

1.创建一个逻辑卷 请按下列要求创建一个新的逻辑卷&#xff1a; 创建一个名为 datastore 的卷组&#xff0c;卷组的大小为4G 逻辑卷的名字为 database ,所属卷组为 datastore,该逻辑卷大小为3G 将新建的逻辑卷格式化为 xfs 文件系统&#xff0c; 2.通过自动挂载将该逻辑卷到/v…

机器学习笔记 十五:随机森林(Random Forest)评估机器学习模型的特征重要性

随机森林1. 随机森林介绍1.1 租赁数据案例2. 特征相关性分析&#xff08;热图&#xff09;2.1 热图绘制2.2 构建随机森林模型2.3 不同特征合并的重要性2.3.1 经纬度合并&#xff08;分3类&#xff09;2.3.2 经纬度合并&#xff08;分2类&#xff09;2.3.3 经纬度合并&#xff0…

HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码...

✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f947; 关于作者: 历任研发工程师&#xff0c;技术组长&#xff0c;教学总监。 十载寒冰&#xff0c;难凉热血&#xff1b;多年过去&#xff0c;历经变迁&#xff0c;物是人非。 然而&#xff0c;对于技术的探索…

系分 - 系统规划

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 系分 - 系统规划 考点摘要 系统规划的步骤&#xff08;★&#xff09;可行性分析&#xff08;★★★&#xff09;成本效益分析&#xff08;★★★&#xff09; 系统规划的步骤 初步调查根据企业战略目标&#…

一行行的代码解密马尔可夫链

使用Python的马尔科夫链实例的实践 一行行的代码解密马尔可夫链。 当我开始学习物理时&#xff0c;我并不喜欢概率的概念。我对用物理学可以对整个世界进行建模的想法非常振奋&#xff0c;不确定性的想法让我很生气:) 事实是&#xff0c;当我们想研究真实的现象时&#xff0c;我…

硬件电路(3)设计篇----为什么栅极型推挽电路不用上P下N?

在做信号控制以及驱动时&#xff0c;为了加快控制速度&#xff0c;经常要使用推挽电路。推挽电路可以由两种结构组成&#xff1a;分别是上P下N&#xff0c;以及上N下P。其原理图如下所示&#xff0c; 在平时中&#xff0c;我个人经常遇到的推挽电路是第一种。当我每次问身边的…

推荐一个不到2MB的C#开发工具箱,集成了上千个常用操作类

今天给大家推荐一个C#开发工具箱&#xff0c;涵盖了所有常用操作类&#xff0c;体积小、功能强大。 项目简介 C# 开发工具箱。大都是静态类&#xff0c;加密解密&#xff0c;反射操作&#xff0c;权重随机筛选算法&#xff0c;分布式短id&#xff0c;表达式树&#xff0c;lin…

单链表简单实现

单链表实现一、为什么会存在单链表&#xff1f;二、什么是单链表&#xff1f;三、单链表结构定义四、单链表的基本操作1、 创建结点2、 销毁链表3、 打印链表4、 尾插节点5、 头插结点6、 尾结点的删除7、 头结点的删除8、 单链表的查找9、 单链表在pos位置之后插入10、单链表在…

在jenkins上创建一个CANoe Job

目录实战项目CANoe 工程配置全局安全创建 slave 节点创建pipline Job&#xff1a; CANoeAutoRun实战项目CANoe 工程 配置全局安全 将代理和SSH Server都设置成随机选取&#xff0c;后面再本机创建slave 节点要用&#xff0c;因为我们会在用一台机器上创建了master和slave节点…

快充伤电池?我来帮何同学做个假设检验

最近看到何同学的视频&#xff0c;拿40部手机花两年半做了关于各种充电的实验视频&#xff0c;视频确实很好看&#xff0c;花里胡哨&#xff0c;看着科技感满满&#xff5e;。但是关于实验设计和根据实验的数据得出最后的结论上似乎有些草率。 实验设计上就不提了&#xff0c;…

周涛:在大数据沙滩上捡拾“珍珠”|奋斗者正青春

“我始终觉得&#xff0c;创新的本原就是好奇心&#xff0c;要像小孩儿一样&#xff0c;一直不断地追问&#xff0c;向这个世界讨要答案。在追寻答案的过程中&#xff0c;要有独立探索和批评的精神&#xff0c;不能轻信权威。” 1 提起电子科技大学教授周涛&#xff0c;大多…

【定语从句练习题】who、which

1. 填空训练 翻译的时候加上 … 的 1.who 2.which 3.which 4.which 5.who 6.which 7.which 8.who 9.who 10.which 11.which 12.who 2. 选择 1.took 2.live 3.she is 3.lost 5.bought 6.is parked 7.it cuts 8.writes 9.make 10.lent you. 10.lend sb. sth 这里需要&…

Java反射06:反射的应用之动态代理

反射的应用之动态代理 &#xff08;这里没听懂&#xff0c;知道反射体现了代理动态性就行&#xff0c;后面框架再学习&#xff09; 代理设计模式的原理 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原 始对象的调用都要通过代理。代理对象决定是否以及何…

C语言之指针详解

文章目录1 指针1.1 简介1.2 什么是指针1.3 使用指针1.3.1 简单使用1.3.2 NULL 指针1.3.3 指针算术运算1.3.3.1 定义1.3.3.2 遍历数组&#xff1a;递增一个指针1.3.3.3 遍历数组&#xff1a;递减一个指针1.3.3.4 指针的比较1.3.4 指针数组1.3.5 指向数组的指针1.3.6 指向指针的指…

Django中利用Admin后台实现Excel/CSV的导入更新数据库和导出数据到Excel/CSV

本文基于Django自带的admin 后台实现Excel&#xff0c;csv&#xff0c;Json等格式文件的导入并更新后台数据库。 核心是引入 django-import-export模块。 1、测试相数据准备&#xff1a; 我们先创建一个app&#xff1a;app01 python manage.py startapp app01 然后在app01…

软考下午题第1题——数据流,题目分析与案例解析:

答题技巧-【11-12分】分必拿方法&#xff1a; 下午第一题肯定是数据流的题目&#xff0c;那么&#xff0c;数据流肯定要找到对应的实体、关系模式等内容&#xff0c;审题的时候一定要细致&#xff0c;下午时间也是相当够的&#xff0c;所以每句话记住&#xff0c;至少读3遍&am…

【pyhon】利用pygame实现彩图版飞机大战(附源码 可供大作业练习使用)

源码请点赞关注收藏后评论区留言或私信博主 演示视频已上传到我的主页 有需要者可自行观看 演示视频如下&#xff1a; 飞机大战接下来先介绍一下游戏的玩法 在PyCharm中运行《彩图版飞机大战》即可进入如图1所示的游戏界面。 具体的操作步骤如下&#xff1a; &#xff08;1&…

Android Native APP开发笔记:多线程编程

文章目录目的Java中的多线程ThreadRunnableTimerAndroid中的多线程HandlerAsyncTask总结目的 Android中UI线程对于开发者和用户来说都是最主要接触到的线程。一般来说为了UI流畅、不卡顿&#xff0c;耗时操作是不推荐放在UI线程中的。但是耗时操作的需求又是存在的&#xff0c…

Spring Cloud(八):Spring Cloud Alibaba Seata 2PC、AT、XA、TCC

事务简介 分布式事务&#xff1a;https://www.processon.com/view/link/61cd52fb0e3e7441570801ab 本地事务 JDBC 事务模式 Connection conn ... //获取数据库连接 conn.setAutoCommit(false); //开启事务 try{//...执行增删改查sqlconn.commit(); //提交事务 }catch (Exce…