Kubernetes Service、Ingress、Ingress Controller

news2024/11/19 10:41:53

Kubernetes 网络模型

Kubernetes 对网络设施的基本要求

Pod 能够与所有其它节点上的 Pod 相互通信, 且不需要网络地址转译(NAT)
节点上的代理(比如:系统守护进程、kubelet)可以和节点上的所有 Pod 相互通信

Kubernetes 网络解决四方面的问题

Pod中的容器之间可以通过本地回路(loopback)相互通信
集群网络在不同 Pod 之间提供通信
Service API 允许向外暴露 Pod 中运行的应用, 以支持来自于集群外部的访问
Ingress 提供专门用于暴露 HTTP 应用程序、网站和 API 的额外功能

Service

  • K8S 可以保证任意 Pod 挂掉时自动从任意节点启动一个新的Pod进行代替,以及某个Pod超负载时动态对Pod进行扩容。每当 Pod 发生变化时其 IP地址也会发生变化,且Pod只有在K8S集群内部才可以被访问,为了解决Pod发生变化导致其IP动态变化以及对外无法访问的问题,K8S引进了 Service 的概念

  • K8S 使用 Service 来管理同一组标签下的 Pod ,当外界需要访问 Pod 中的容器时,只需要访问 Service 的这个虚拟 IP 和端口,由 Service 把外界的请求转发给它背后的Pod

Service暴露服务类型

1、ClusterIP(默认)

  • 自动为当前Service分配虚拟IP,在不重启Service前提下该IP是不会改变的,只能在集群内部访问

2、NodePort

  • 需要在K8S集群的所有 Node 节点上开放特定的端口【30000-32767】,通过(公网ip : 端口)访问Service服务。缺点:每个端口只能挂载一个Service,从安全角度讲开放更多的端口是存在一定风险的,从维护角度讲开放的端口越多维护的成本越大
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    - port: 80
      targetPort: 80
      # 可选字段
      # 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767)
      nodePort: 30007

3、LoadBalancer

  • 和Nodeport相似,目的都是向外暴露一个端口,但 LoadBalancer 模式需要开发者在K8S集群外部的公有云服务器上做一个负载均衡设备(当前主流的阿里云、腾讯云、华为云、微软云等等厂商都有提供相关收费的服务),外部服务发送到公有云服务上的请求都会被负载并转发到K8S集群中LoadBalancer服务上

  • 如果要在私网环境下测试LoadBalancer,必须要创建一个MetalLB, MetalLB相当于一个负载均衡器的角色

  • LoadBalancer原理:外部请求首先被转发到外部LB负载设备,再通过匹配规则转发到k8s集群的任意node节点上,最终通过Service资源找到对应的pod

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  clusterIP: 10.0.171.239
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.0.2.127

4、ExternalName

  • 通过返回 CNAME 记录和对应值,可以将服务映射到 externalName 字段的内容(例如:foo.bar.example.com),无需创建任何类型代理
    注意:需要使用 kube-dns 1.7 及以上版本或者 CoreDNS 0.0.8 及以上版本才能使用 ExternalName 类型
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

Service代理模式

Service 创建成功后会通过 api-server 向 etcd 中写入相关配置信息,kube-proxy会监听创建好的配置信息并将最新的service配置信息转化成对应的访问规则,最终实现外网对Pod的访问。常见的service访问规则有:iptables 和 ipvs

1、iptables

kube-proxy 为 service 后端的每个Pod创建对应的iptables规则,当用户访问ClusterIP时,直接将发送到ClusterIP的请求重定向到Pod
缺点:kube-proxy 不承担四层路由转发的角色,只负责创建iptables规则,无法实现LB策略

2、ipvs(性能高于iptables)

kube-proxy 监控Pod的变化并创建相应的ipvs规则,当用户访问ClusterIP时,直接将发送到ClusterIP的请求重定向到Pod
相比于iptables,支持LB策略

3、切换到IPVS模式

  • 查询当前代理模式
kubectl get pod -o wide -n kube-system | grep kube-proxy # 查新kube-proxy有关的pod

在这里插入图片描述

kubectl logs -n kube-system kube-proxy-7bst7

在这里插入图片描述

  • ipvs 安装(K8S集群的所有节点安装)
# yum install -y ipvsadm.x86_64   # Centos
apt install -y ipvsadm ipset # Debian
ipvsadm -Ln # 查看ipvs模式开启状态

在这里插入图片描述

  • 切换Sevice代理模式为ipvs(K8S集群的Master节点修改)
kubectl edit configmap kube-proxy -n kube-system # 编辑configmap将mode改为ipvs 

在这里插入图片描述

  • 删除指定Pod
kubectl get pod -o wide -n kube-system | grep kube-proxy

在这里插入图片描述

kubectl delete pod kube-proxy-7bst7 -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-9l7qr -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-cqht2 -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-h8znm -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-l4p42 -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-xlqtg -n kube-system # 删除pod后自动创建新的Pod

在这里插入图片描述

4、验证IPVS

# kubectl get service -o wide -n kube-system # 查询Service
#
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE   SELECTOR
calico-typha   ClusterIP   10.96.26.184   <none>        5473/TCP                 13d   k8s-app=calico-typha
kube-dns       ClusterIP   10.96.0.2      <none>        53/UDP,53/TCP,9153/TCP   13d   k8s-app=kube-dns
# ipvsadm -Ln
#
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 192.168.111.30:6443          Masq    1      1          0
  -> 192.168.111.31:6443          Masq    1      1          0
  -> 192.168.111.32:6443          Masq    1      1          0
  
TCP  10.96.0.2:53 rr
  -> 10.244.166.141:53            Masq    1      0          0
UDP  10.96.0.2:53 rr
  -> 10.244.166.141:53            Masq    1      0          0
  
TCP  10.96.0.2:9153 rr
  -> 10.244.166.141:9153          Masq    1      0          0
  
TCP  10.96.26.184:5473 rr
  -> 192.168.111.40:5473          Masq    1      0          0

部署Nginx应用并对外访问

方式1:创建deployment并将其显示为Service

# kubectl create deployment <deployment名称> --image=<镜像> --replicas=<pod副本数量> -n <命名空间名称>
# kubectl expose deployment <deployment名称> --name=<Service名称> --type=<Service服务类型> --port=<service端口> --target-port=<容器端口> -n <命名空间名称>
#
# 强制删除Pod
# kubectl delete deployment <deployment名称> -n <命名空间名称> --force --grace-period=0
# kubectl delete pod <pod名称> -n <命名空间名称> --force --grace-period=0
# 
# 强制删除NameSpace
# kubectl delete ns <命名空间名称> --force --grace-period=0 
# kubectl get deployment,pods,service -n kube-system -o wide
# kubectl get deployment,pods,service -n dev -o wide
# kubectl describe -n kube-system pod podName
#
# kubectl delete ns dev --force --grace-period=0 
# kubectl delete deployment nginx -n dev --force --grace-period=0
# kubectl delete pod podName -n dev --force --grace-period=0
  • 创建 Deployment
kubectl create ns dev && kubectl get ns dev
kubectl create deployment nginx --image=nginx --replicas=1 -n dev # 级联创建Pod
# kubectl get deployment,pods -n dev -o wide # 查看创建的Deployment和Pod信息
# kubectl logs -n dev nginx-748c667d99-phdxv # 查看Pod创建的日志
# kubectl describe -n dev pod nginx-748c667d99-phdxv # 查看Pod创建的详细信息
  • 暴露 Deployment 为 Service 服务(将Service的8080端口转发至容器的80端口)
kubectl expose deployment nginx --name=nginx --type=NodePort --port=8080 --target-port=80 -n dev

方式2:创建Service(yaml文件)

注意:基于Kubernetes Pod和工作负载文章已创建好的资源进行演示

  • 创建 Service
vi service-nginx.yaml # 在线编辑文件
apiVersion: v1
kind: Service
metadata:
  namespace: dev
  name: nginx
  labels: 
      app: nginx
spec: 
  selector: # 标签选择器,指定对哪些deployment的Pod进行暴露
    app: nginx # deployment名称
  type: NodePort # Service暴露服务的类型
  ports:
  - protocol: TCP # 通讯协议
    nodePort: 30000 # Node端口,结合 type: NodePort 使用
    port: 8080 # service端口
    targetPort: 80 # pod端口
kubectl create -f service-nginx.yaml
kubectl delete -f service-nginx.yaml
  • 查看已创建的资源
kubectl get deployment,replicaSet,pods,service -n dev -o wide --show-labels

在这里插入图片描述

curl 10.244.104.10:80 # 任意Node节点,通过Pod的IP访问nginx
curl 10.244.166.157:80 # 任意Node节点,通过Pod的IP访问nginx
curl 10.96.73.217:8080 # 任意Node节点,通过Service的IP访问Nginx
http://192.168.111.40:30000 # 浏览器通过任意Node节点访问nginx
http://192.168.111.41:30000 # 浏览器通过任意Node节点访问nginx
http://192.168.111.42:30000 # 浏览器通过任意Node节点访问nginx

Ingress

Ingress(k8s内置的资源对象)

  • Ingress 是 k8s 的资源对象,用于定义外部的(HTTP 和 HTTPS)请求如何转发到 Service 服务的规则
    在这里插入图片描述

ingress-controller(需要单独安装)

  • ingress-controller 不是 k8s 自带的组件,只是一个统称,可以选择不同的 ingress-controller 实现对 service 的反向代理及负载均衡,常用的 ingress-controller 产品有:F5 Networks、Kong、Traefik、NGINXHaProxyIstio

  • ingress-controller 本质是一个 pod,内部运行了 daemon 程序反向代理程序。daemon程序通过 K8S API 不断监控集群的变化,对 ingress 定义的规则进行解析并刷新配置到反向代理程序
    在这里插入图片描述
    安装教程

ingress 暴露服务方式

1、Deployment + NodePort 的 Service 模式

1、基于 Deployment 部署 ingress-controller 并创建对应的 Service 服务(type为NodePort),将ingress暴露在集群节点ip的特定端口上
2、一般适用于宿主机ip地址相对固定不变的场景,由于 Nodeport 暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求,NodePort方式暴露 ingress 虽然简单,但多了一层NAT,在请求量级很大时对性能会有一定影响

2、Deployment + LoadBalancer 的 Service 模式

1、基于 Deployment 部署 ingress-controller 并创建对应的 Service 服务(type为 LoadBalancer)
2、此模式需要将 ingress 部署在公有云,大部分公有云都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址,只要把域名解析指向该公网地址就实现了集群服务的对外暴露

3、DaemonSet + HostNetwork + nodeSelector 的 Service 模式

1、基于 DaemonSet 结合 NodeSelector 来部署 ingress-controller 到特定的 node 上,再通过 HostNetwork 把该 pod 与宿主机 node 的网络打通,通过宿主机的80/433端口访问服务
2、该方式相对NodePort模式的性能更好,缺点:由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller,适合大并发的生产环境使用

部署 httpd 应用并对外访问(HTTP)

  • 创建 Deployment
kubectl apply -f /home/lixing/demo/deployment-httpd.yaml # kubectl delete -f /home/lixing/demo/deployment-httpd.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: ns-httpd
  name: deployment-httpd
  labels: # 给Deployment打标签
    app: httpd
spec: 
  selector: # Pod选择器
    matchLabels:
      app: httpd # 对标签为httpd的Pod进行管理
  replicas: 1 # 默认Pod副本数量
  template: 
      metadata:
        labels: 
          app: httpd # 为Pod打标签
      spec:
        #hostNetwork: true
        #nodeSelector: #使用节点选择器将Pod调度到指定label的节点
          #component: pod-demo
        containers:
        - name: httpd
          image: httpd
          imagePullPolicy: IfNotPresent
          ports: 
          - name: port-name-httpd 
            protocol: TCP
            containerPort: 80
  • 创建 Service
kubectl apply -f /home/lixing/demo/service-httpd.yaml # kubectl delete -f /home/lixing/demo/service-httpd.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: ns-httpd
  name: service-httpd
spec: 
  selector: #Deployment选择器
    app: httpd
  #type: NodePort # Service暴露服务的类型
  ports:
  - protocol: TCP # 通讯协议
    #nodePort: 30000 # 集群上所有Node节点端口
    port: 8080 # Service端口
    targetPort: 80 # Pod端口
  • 访问 Pod(直接访问Pod、通过Service访问Pod)
kubectl get deployment,pods,service,ingress -n ns-httpd -o wide

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

  • 修改Master节点的host文件(这里以Master节点为例)
vi /etc/hosts # 编辑Host文件,添加当前节点的ip和自定义域名
192.168.111.30 www.lixing.com
  • 创建 Ingress 规则
kubectl apply -f /home/lixing/demo/ingress-httpd.yaml # kubectl delete -f /home/lixing/demo/ingress-httpd.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: ns-httpd
  name: ingress-httpd
spec:
  ingressClassName: nginx
  rules:
    - host: www.lixing.com
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: service-httpd # Service名称
                port:
                  number: 8080 # Service端口
  • 路径类型匹配规则
# Ingress 中的每个路径都需要有对应的路径类型(pathType),未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:
ImplementationSpecific:匹配方法取决于IngressClass。具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理
Exact:精确匹配 URL 路径,且区分大小写
Prefix:基于以 / 分隔的URL路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成

在这里插入图片描述

  • 主机名通配符
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-wildcard-host
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/bar"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: "*.foo.com"
    http:
      paths:
      - pathType: Prefix
        path: "/foo"
        backend:
          service:
            name: service2
            port:
              number: 80

在这里插入图片描述

  • 通过 Ingress Nginx Controller 访问Pod
    在这里插入图片描述
    注意:ingress-nginx-controller 服务的端口转化信息:80:32163/TCP,443:31590/TCP

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

部署 httpd 应用并对外访问(HTTPS)

创建证书

openssl reg -x509 -sha256 -nodes -days 365 -newkey rsa:2048-keyout tls.key-out tls.crt-subj '/C=CN/ST=BJ/L=BJ/O=nginx/CN=itheima.com"

创建密钥

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

创建 Ingress 规则

kubectl apply -f /home/lixing/demo/ingress-httpd.yaml # kubectl delete -f /home/lixing/demo/ingress-httpd-https.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: ns-httpd
  name: ingress-httpd-https
spec:
  ingressClassName: nginx
  tls:
    - hosts:
      - www.lixing.com
      secretName: tls-secret # 指定密钥
  rules:
    - host: www.lixing.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              serviceName: service-httpd # Service名称
              servicePort: 8080 # Service端口

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

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

相关文章

基于Html+Css的图片展示25

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

SLAM论文速递【SLAM—— RDS-SLAM:基于语义分割方法的实时动态SLAM—4.24(1)

论文信息 题目&#xff1a; RDS-SLAM:Real-Time Dynamic SLAM Using Semantic Segmentation Methods RDS-SLAM:基于语义分割方法的实时动态SLAM论文地址&#xff1a; https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9318990发表期刊&#xff1a; IEEE Access ( Volum…

如何发起一次完整的HTTP的请求流程

目录 &#x1f4a1; 预备知识 &#x1f50a; 浏览器端发起 HTTP 请求流程 1、构建请求 2、查找缓存 3、准备IP地址和端口 4、等待TCP队列 5、建立TCP连接 6、发送HTTP请求 &#x1f50a; 服务器端处理 HTTP 请求流程 1、返回请求 2、断开连接 3、重定向 HTTP 是一种…

【hello Linux】文件时间

目录 1. 简单介绍文件的三个时间&#xff1a; 2. 查看文件时间的命令&#xff1a; 3. makefile的时间编译原理&#xff1a; Linux&#x1f337; 1. 简单介绍文件的三个时间&#xff1a; 在Linux中&#xff0c;记录着文件的三方面时间&#xff1a; 1. Access&#xff1a;记…

适合小白的docker实战演示——docker基础入门命令

一、docker简单背景介绍 docker是dotCloud公司开源的一个基于LXC&#xff08;LXC为Linux Container的简写。Linux Container 容器是一种内核虚拟化技术&#xff0c;可以提供轻量级的虚拟化&#xff0c;以便隔离进程和资源&#xff09;的高级容器引擎&#xff0c;源码托管在Gith…

JAVA——线程池

目录 一、线程池的概念 二、Java标准库中的线程池 三、ThreadPoolExecutor 类的参数 四、线程池的拒绝策略 五、模拟实现线程池 一、线程池的概念 线程池顾名思义就是集中存储线程的地方——联想一下水池。 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到…

PostMan笔记(五)数据监控与压力测试

1. 数据监控 1.1 说明 Postman提供了一种方便的方式来监控API请求和响应数据&#xff0c;以便在测试和开发过程中查看和分析API的性能和功能。数据监控允许您在实时和历史记录中查看API请求和响应数据&#xff0c;并使用图表和统计信息对其进行可视化分析。 1.2 怎么使用数据…

KuiperInfer深度学习推理框架-源码阅读和二次开发(2):算子开发流程(以sigmoid为例)

前言&#xff1a;KuiperInfer是一个从零实现一个高性能的深度学习推理库&#xff0c;中文教程已经非常完善了。本系列博客主要是自己学习的一点笔记和二次开发的教程&#xff0c;欢迎更多的AI推理爱好者一起来玩。这篇写一下算子开发流程&#xff0c;以sigmoid算子为例&#xf…

音视频技术开发周刊 | 290

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 TCSVT 2022 | 基于环路多帧预测的深度视频压缩 本文基于端到端深度视频压缩框架&#xff0c;提出了一种环路多帧预测模块&#xff08;in-loop frame prediction module&a…

UV坐标应用范例——计算屏幕坐标作为UV

迷幻角色背景 大家好&#xff0c;我是阿赵。 之前介绍过了经典的Shader写法&#xff0c;物体顶点坐标在顶点程序转换到裁剪空间&#xff0c;然后在片段程序里面通过模型的UV进行贴图采样&#xff0c;然后把颜色显示在模型上面。 之前也介绍过经典的顶点程序应用&#xff0c;树木…

26.Spring-AOP(切面编程)

目录 一、Spring-AOP。 &#xff08;1&#xff09;AOP的简介。 &#xff08;2&#xff09;AOP的底层实现-动态代理。 &#xff08;2.1&#xff09;JDK的动态代理。 &#xff08;2.2&#xff09;cglib的动态代理。 &#xff08;3&#xff09;AOP的相关概念。 &#xff0…

【Linux】5、使用 Linux 快捷按键小技巧

目录 一、CTRL C二、CTRL D三、history 命令四、CTRL R五、光标移动快捷方式六、清屏 一、CTRL C &#x1f941; ① 可用于强制停止某些程序的运行 &#x1f941; ② 若命令输入错误&#xff0c;可用它退出当前命令 二、CTRL D &#x1f941; ① 退出登录的账户 &#…

WEB APIs day2

一、Dom事件基础 1.事件监听&#xff08;绑定&#xff09; 1.1 事件监听 一旦绑定后&#xff0c;这个函数不会立即执行的&#xff0c;事件什么时候触发什么时候执行 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

Pyinstaller打包python文件太大?教你三个小技巧有效减小文件体积

简介 有时候需要在未安装Python环境的平台上运行py程序&#xff0c;使用pyinstaller打包很方便&#xff0c;但打包后的可执行文件实在是太大了。原因在于打包时pyinstaller本就已经关联了很多的python内联模块&#xff0c;加上我们项目中存在过多第三方类库&#xff0c;打包的…

优思学院|质量人如何利用ChatGPT提升工作效率?

在许多人知道怎么用ChatGPT之后&#xff0c;不少人开始思考如何利用这个工具来提升自己的工作效率。 质量人也不例外&#xff0c;在质量管理中&#xff0c;有许多重复的任务需要人手去完成。这些任务可能包括检查文档、审查流程、跟踪错误等。这些任务既耗费时间&#xff0c;又…

MAVEN环境变量配置(Windows 11)

1、直接在搜索框中搜&#xff1a;编辑系统环境变量 2、点击环境变量 3、 在系统变量里面新建系统变量 变量名&#xff1a;MAVEN_HOME 变量值&#xff1a;路径一定要写到maven的bin目录下 以下这种写法是错误的 4、新建系统变量完成 5、 往下滑 找到path&#xff0c;可以双击…

【Python】实战:生成无关联单选问卷 csv《跌倒风险评估量表》

目录 一、适用场景 二、业务需求 三、Python 文件 &#xff08;1&#xff09;创建文件 &#xff08;2&#xff09;代码示例 四、csv 文件 一、适用场景 实战场景&#xff1a; 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全部问…

亚马逊云科技CodeWhisperer正式可用,面向个人开发者免费开放

亚马逊云科技致力于推动生成式AI技术的普惠化&#xff1a;亚马逊云科技将这些技术从研究和实验领域释放出来&#xff0c;不只是少数初创公司和资金雄厚的大型科技公司&#xff0c;而是让更多公司都能从中受益。因此&#xff0c;亚马逊云科技宣布数项创新&#xff0c;帮助客户更…

STM32-HAL-usDelay

一、STM32单片机的延时 STM32单片机的延时&#xff0c;是指在程序中暂停一段时间&#xff0c;等待一定的时间后再继续执行下一条指令。常见的延时方式有循环延时和定时器延时。 毫秒延时的使用场景&#xff1a; 等待外设完成某项操作&#xff1a;在使用外设时&#xff0c;有…

【安全与风险】总结篇

总结篇 期望学习效果学习关键点安全基础一些术语安全策略CIA 密码学概论对称vs非对称对称密码:定义非对称密码学(公钥密码学)密钥生成加密解密技术反向使用:数字签名 基础计算资源安全访问控制列表读、写、执行权限位DoS攻击 恶意软件什么是恶意软件恶意软件的类型基于主机的恶…