云原生之深入解析Kubernetes CNI插件的选型和应用场景

news2024/11/26 15:38:11

一、常见网络插件

  • 在学习容器网络的时候,肯定都听说过 Docker 的 bridge 网络、Vethpair、VxLAN 等术语,从 Docker 到 Kubernetes 后,学习 Flannel、Calico 等主流网络插件,分别代表了 Overlay 和 Underlay 的两种网络传输模式,也是很经典的两款 CNI 网络插件。那么,还有哪些好用的 CNI 插件呢 ? 先来看看 CNCF Landscape:

在这里插入图片描述

  • 抛去商业版 CNI,此次分享来聊聊几款热门开源 CNI 插件,分别为 Kube-OVN、Antrea、Cilium。Kube-OVN 和 Antrea 都是基于 OpenvSwitch 的项目,Cilium 使用 eBPF 这款革命性的技术作为数据路径,也是这两年很火热的一个开源容器项目。那么,如何快速部署 K8s 体验不同地 CNI 插件呢?这就该 Kubekey 闪亮登场了。
  • Kubekey 作为一个开源的 Kubernetes 和 KubeSphere 集群部署工具,可以轻松的部署 Kubernetes 集群,提供节点管理、操作系统安全加固、容器运行时管理、网络存储安装、Etcd 管理等。Kubekey 支持一键部署 Calico / Flannel / Cilium / Kube-OVN 等网络插件,只需在 kk 的配置文件中注明 network 的 plugin 值即可:
network:
    plugin: calico/kubeovn/cilium
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
  • 对于 antrea,由于版本较新,目前可通过 addon 的形式添加 helm 文件的形式进行一键安装:
  addons:
  - name: antrea
    namespace: kube-system
    sources: 
      chart: 
        name: antrea
        repo: https://charts.antrea.io
        # values:
  • 在此基础上,可以通过以下一条命令:
→ kk create cluster --with-kubernetes --with-kubesphere
  • 创建一个 Kubernetes 集群并安装 KubeSphere,在此之上体验不同的 CNI 在 Kubernetes 的功能应用。毕竟,哪个小伙伴不喜欢页面友好的容器管理平台呢?

在这里插入图片描述

二、网络应用场景

  • 现在已经有了一个 Kubernetes 集群,先来思考一下,容器网络除了让集群正常运行,能让安装 Kubernetes 后 Pending 的 CoreDNS running 起来以外还有哪些使用场景?

在这里插入图片描述

  • 说明一下如上的七个主要使用的场景,应该也涵盖大部分网络需求:
    • 固定 IP:对于现存虚拟化 / 裸机业务 / 单体应用迁移到容器环境后,都是通过 IP 而非域名进行服务间调用,此时就需要 CNI 插件有固定 IP 的功能,包括 Pod/Deployment/Statefulset;
    • 网络隔离:不同租户或不同应用之间,容器组应该是不能互相调用或通信的;
    • 多集群网络互联。:对于不同的 Kubernetes 集群之间的微服务进行互相调用的场景,需要多集群网络互联,这种场景一般分为 IP 可达和 Service 互通,满足不同的微服务实例互相调用需求;
    • 出向限制:对于容器集群外的数据库 / 中间件,需能控制特定属性的容器应用才可访问,拒绝其他连接请求;
    • 入向限制:限制集群外应用对特定容器应用的访问;
    • 带宽限制:容器应用之间的网络访问加以带宽限制;
    • 出口网关访问:对于访问集群外特定应用的容器,设置出口网关对其进行 SNAT 以达到统一出口访问的审计和安全需求。

三、网络插件功能实现

① 固定 IP

  • 基本上主流 CNI 插件都有自己的 IPAM 机制,都支持固定 IP 及 IP Pool 的分配,并且各个 CNI 插件殊途同归的都使用了 Annotation 的方式指定固定 IP。对于 Pod,分配固定 IP,对于 Deployment,使用 IP Pool 的方式分配。对于有状态的 Statefulset,使用 IP Pool 分配后,会根据 Pool 的分配顺序记好 Pod 的 IP,以保证在 Pod 重启后仍能拿到同样的 IP。
  • Calico:
"cni.projectcalico.org/ipAddrs": "[\"192.168.0.1\"]"
  • Kube-OVN:
ovn.kubernetes.io/ip_address: 192.168.100.100
ovn.kubernetes.io/ip_pool: 192.168.100.201,192.168.100.202
  • Antrea:Antrea IPAM 只能在 Bridge 模式下使用,因此可以在 Multus 的辅佐下,主网卡使用 NodeIPAM 分配,副网卡使用 Antrea IPAM 分配 VLAN 类型网络地址:
 ipam.antrea.io/ippools: 'pod-ip-pool1'
ipam.antrea.io/pod-ips: '<ip-in-pod-ip-pool1>'
  • Cilium:
Not Yet!

② 多集群网络互联

  • 对于多集群网络互联,假设有现有多个集群,不同的微服务运行在不同的集群中,集群 1 的 App01 需要和集群 2 的 App02 进行通信,由于他们都是通过 IP 注册在集群外的 VM 注册中心的,所以 App01 和 App02 只能通过 IP 通信。在这种场景下,就需要多集群 Pod 互联互通。
  • Calico:
    • 对于 Calico 这种原生对 BGP 支持很好的 CNI 插件来说,很容易实现这一点,只要两个集群通过 BGP 建立邻居,将各自的路由宣告给对方即可实现动态路由的建立。若存在多个集群,使用 BGP RR 的形式也很好解决,但这种解决方式可能不是最理想的,因为需要和物理网络环境进行配合和联调,这就需要网络人员和容器运维人员一同进行多集群网络的建设,在后期运维和管理上都有不大方便和敏捷的感觉。
    • 那 Calico VxLAN 模式呢?既然说到 VxLAN,可以和 Kube-OVN、Antrea、Cilium 放到一起来看,四种 CNI 都支持 Overlay 的网络模型,都支持通过 VxLAN/GENEVE 的形式建立隧道网络打通容器网络通信。这就赋予运维人员较高的灵活性,对于容器网络的调教、IPAM 分配、网络监控和可观察性、网络策略调整都由容器集群运维人员负责,而网络人员则只需要提前划好物理网络大段,保证容器集群 Node 之间网络互通即可。
    • 那如何去实现 overlay 网络的多集群互联呢?
  • Submariner:
    • CNCF 有个沙箱项目叫 Submariner,它通过在不同集群建立不同的网关节点并打通隧道的形式实现多集群通信,从官方这张架构图来说明:

在这里插入图片描述

  • 简单来说,Submariner 由一个集群元数据中介服务(broker)掌握不同集群的信息(Pod/Service CIDR),通过 Route Agent 将 Pod 流量从 Node 导向网关节点(Gateway Engine),然后由网关节点打通隧道丢到另一个集群中去,这个过程就和不同主机的容器之间使用 VxLAN 网络通信的概念是一致的。 要达成集群连接也很简单,在其中一个集群部署 Broker,然后通过 kubeconfig 或 context 分别进行注册即可。
→ subctl deploy-broker --kubeconfig ~/.kube/config1
→ subctl join --kubeconfig ~/.kube/config1 broker-info.subm --clusterid ks1 --natt=false --cable-driver vxlan --health-check=false
→ subctl join --kubeconfig ~/.kube/config2 broker-info.subm --clusterid ks2 --natt=false --cable-driver vxlan --health-check=false
→ subctl show all
✓ Showing Endpoints
CLUSTER ID                    ENDPOINT IP     PUBLIC IP       CABLE DRIVER        TYPE
ks1                           192.168.100.10  139.198.21.149  vxlan               local
ks2                           192.168.100.20  139.198.21.149  vxlan               remote
  • Cilium:
    • Cilium Cluster Mesh 和 Submariner 有异曲同工之妙,可以通过隧道形式或 NativeRoute 形式实现集群互联:

在这里插入图片描述

    • Cilium 开启多集群网络连接也很简单:
→ cilium clustermesh enable --context $CLUSTER1
→ cilium clustermesh enable --context $CLUSTER2
  • KubeOVN:Kube-OVN 还提供一个 OVNIC 的组件,它运行一个路由中继的 OVN-IC 的 Docker 容器,作为两个集群的网关节点,将不同集群的 Pod 网络进行连通。

③ 多集群服务互访

  • 除了 Pod IP 的互联互通,多集群网络还可考虑集群间的 Service 互访,Submariner、Cilium、Antrea 都能实现。Submariner 和 Antrea 都使用了 Kubernetes 社区的 MultiCluster Service 并在此之上结合自身组件实现多集群的服务访问。MultiCluster Service 通过 ServiceExport 和 ServiceImport 的 CRD,ServiceExport 将需要公开的服务导出,然后通过 ServiceImport 将此服务导入到另一个集群。

在这里插入图片描述

  • Submariner:
    • 用 Submariner 实现举例,有两个集群 ks1 和 ks2,ks1 在 test 命名空间有一个服务 nginx,此时通过 ServiceExport 将 nginx 服务进行导出,Submariner 会把这个 nginx.test.svc.cluster.local 服务发现为 nginx.test.svc.clusterset.local,两个集群的 coredns 都会建立一个新的 clusterset.local 的存根域,将所有匹配 cluster.set 的请求发送给 submariner 的服务发现的组件。
    • 同时 ServiceImport 导入到 ks2 集群,ks2 集群的 Pod 就可以通过 nginx.test.svc.clusterset.local 解析到 ks1 集群的 nginx Service。如果两个集群都有 nginx 的同名服务,此时 submariner 就可以优先本地进行访问,本地服务端点有故障后再访问其他集群的 nginx 服务,是不是可以开始构建双活服务了?
  • Antrea:Antrea 实现方式类似,也是结合 ServiceExport 和 ServiceImport 并进行封装成 ResourceExport 和 ResourceImport 构建多集群服务,在每个集群选择一个节点作为网关,通过网关打通不同集群隧道来实现多集群服务的访问。

在这里插入图片描述

  • Cilium:Cilium 没有用 MultiService 的概念,Cilium 通过 Global Service 的概念构建多集群访问服务访问:

在这里插入图片描述

  • 从这张图可以看出,Cilium 更适合做多活集群的多集群服务访问需求,通过对相应的服务添加 Annotation 的做法,把不同集群的服务设定为 global-service,并通过 shared-service 和 service-affinity 来控制服务是否能被其他集群访问及服务亲和性。
apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    io.cilium/global-service: 'true'
    io.cilium/shared-service: 'true'
    io.cilium/service-affinity: 'local'
    # Possible values:
    # - local
    #    preferred endpoints from local cluster if available
    # - remote
    #    preferred endpoints from remote cluster if available
    # none (default)
    #    no preference. Default behavior if this annotation does not exist   
spec:
  type: ClusterIP
  ports:
    - port: 80
  selector:
    name: nginx
  • 以上,当有多集群互访需求又不想 CNI 强相关时,可以尝试玩一下 Submariner,作为 CNCF Landscape Network 中一个专注于多集群互访的 SandBox 项目,Submariner 提供多集群网络通信,服务发现,以及安全加密,是一个很好的选择。

④ 网络策略

  • 对于 Pod 网络隔离、入向限制、出向限制的网络场景,可以整合成网络策略一同来说。主流开源 CNI 都支持 Kubernetes NetworkPolicy,通过 Network Policy,可以在 3 层或 4 层做相应的网络安全限制。Network Policy 通过 Ingress 和 Egress 两种进行网络限制,默认都是放行的。也就是说,设置 Kubernetes 网络策略,主要以白名单的形式对集群内的流量进行安全限制。
  • 比如只允许指定 label 的 Pod 访问集群外数据库(通过 CIDR 指定):
apiVersion: networking.K8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-allow
  namespace: default
spec:
  podSelector: 
    matchLabels:
      role: db
  policyTypes:
  - Egress
egress:
    - to:
        - ipBlock:
            cidr: 192.168.100.40/24
      ports:
        - protocol: TCP
          port: 3306
apiVersion: networking.K8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-allow
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: app
  policyTypes:
    - Ingress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        - namespaceSelector:
            matchLabels:
              project: web-project
        - podSelector:
            matchLabels:
              role: web
  • 虽然 Network Policy 能满足大多场景,但是不是感觉还是少了点东西?比如 7 层策略、基于 NodeSelector、Drop/Reject 类型的策略指定、指定 Egress 节点进行控制等高级能力,这个时候 Cilium 和 Antrea 就大放异彩了。
  • Cilium:
    • Cilium 有两个 CRD,CiliumNetworkPolicy 和 CiliumClusterwideNetworkPolicy,来实现单集群和多集群的网络策略能力,Cilium 支持 3、4、7 层网络策略,并增加 EndPoint Selector 和 Node Selector。除了普通的基于 PodSelector 和 CIDR 的限制,Cilium 可以支持更多种策略。
    • DNS 限制策略,只允许 app: test-app 的端点通过 53 端口去 kube-system 命名空间的 “K8s:K8s-app”: kube-dns 标签的 DNS 服务器访问 my-remote-service.com:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "to-fqdn"
spec:
  endpointSelector:
    matchLabels:
      app: test-app
  egress:
    - toEndpoints:
      - matchLabels:
          "K8s:io.kubernetes.pod.namespace": kube-system
          "K8s:K8s-app": kube-dns
      toPorts:
        - ports:
           - port: "53"
             protocol: ANY
          rules:
            dns:
              - matchPattern: "*"
    - toFQDNs:
        - matchName: "my-remote-service.com"
    • Http 限制策略 , 只允许 org: empire 标签的端点对 deathstar 的 /v1/request-landing 进行 POST 操作:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "rule"
spec:
  description: "L7 policy to restrict access to specific HTTP call"
  endpointSelector:
    matchLabels:
      org: empire
      class: deathstar
  ingress:
  - fromEndpoints:
    - matchLabels:
        org: empire
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - method: "POST"
          path: "/v1/request-landing"
    • kafka 策略控制:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "rule1"
spec:
  description: "enable empire-hq to produce to empire-announce and deathstar-plans"
  endpointSelector:
    matchLabels:
      app: kafka
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: empire-hq
    toPorts:
    - ports:
      - port: "9092"
        protocol: TCP
      rules:
        kafka:
        - role: "produce"
          topic: "deathstar-plans"
        - role: "produce"
          topic: "empire-announce"
  • Antrea:
    • Antrea 除了增加现有 NetworkPolicy 功能外,抽象了 Antrea NetworkPolicy 和 Antrea ClusterNetworkPolicy 两个 CRD 实现命名空间级别和集群级别的安全管理,还提供了 Group、Tier 的概念,用于资源分组和优先级设计,因此 Antrea 有零信任的网络策略安全防护手段,可以实现严格的 pod 和命名空间隔离。

在这里插入图片描述

    • 网络层 Antrea 增加了对 ICMP 和 IGMP,Mutlicast 的限制,禁 ping 人员狂喜:
apiVersion: crd.antrea.io/v1alpha1
kind: ClusterNetworkPolicy
metadata:
  name: acnp-reject-ping-request
spec:
    priority: 5
    tier: securityops
    appliedTo:
      - podSelector:
          matchLabels:
            role: server
        namespaceSelector:
          matchLabels:
            env: prod
    egress:
      - action: Reject
        protocols:
          - icmp:
              icmpType: 8
              icmpCode: 0
        name: DropPingRequest
        enableLogging: true
    • 基于 FQDN 的过滤:
apiVersion: crd.antrea.io/v1alpha1
kind: ClusterNetworkPolicy
metadata:
  name: acnp-fqdn-all-foobar
spec:
  priority: 1
  appliedTo:
  - podSelector:
      matchLabels:
        app: client
  egress:
  - action: Allow
    to:
      - fqdn: "*foobar.com"
    ports:
      - protocol: TCP
        port: 8080
  - action: Drop 
    • 设置不同类型的 Group,基于 Group 设置网络策略,就不用对同类业务写一堆 Label:
apiVersion: crd.antrea.io/v1alpha3
kind: Group
metadata:
  name: test-grp-with-namespace
spec:
  podSelector:
    matchLabels:
      role: db
  namespaceSelector:
    matchLabels:
      env: prod
---
# Group that selects IP block 10.0.10.0/24.
apiVersion: crd.antrea.io/v1alpha3
kind: Group
metadata:
  name: test-grp-ip-block
spec:
  ipBlocks:
    - cidr: 10.0.10.0/24
---
apiVersion: crd.antrea.io/v1alpha3
kind: Group
metadata:
  name: test-grp-svc-ref
spec:
  serviceReference:
    name: test-service
    namespace: default
---
# Group that includes the previous Groups as childGroups.
apiVersion: crd.antrea.io/v1alpha3
kind: Group
metadata:
  name: test-grp-nested
spec:
  childGroups: [test-grp-sel, test-grp-ip-blocks, test-grp-svc-ref]

⑤ Egress

  • 对于特定业务出集群需不暴露 IP 或符合安全审计需求的场景,需要 Pod IP -> External IP 对外部业务进行访问。Cilium,Kube-OVN,Antrea 都有类似 Egress Gateway/Egress IP 的功能,特定标签的 Pod 通过 SNAT 为 Egress IP 访问集群外服务。
  • Cilium:
apiVersion: cilium.io/v2
kind: CiliumEgressGatewayPolicy
metadata:
  name: egress-sample
spec:
  selectors:
  - podSelector:
      matchLabels:
        app: snat-pod
        io.kubernetes.pod.namespace: default
  destinationCIDRs:
  - "0.0.0.0/0"
  egressGateway:
    nodeSelector:
      matchLabels:
        node.kubernetes.io/name: node1
    egressIP: 10.168.60.100
  • KubeOVN:
apiVersion: v1
kind: Pod
metadata:
  name: pod-gw
  annotations:
    ovn.kubernetes.io/eip: 172.10.0.1
    #或ovn.kubernetes.io/snat: 172.10.0.1
spec:
  containers:
  - name: eip-pod
    image: nginx:alpine
  • Antrea:
apiVersion: crd.antrea.io/v1alpha2
kind: Egress
metadata:
  name: egress-staging-web
spec:
  appliedTo:
    namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: staging
    podSelector:
      matchLabels:
        app: web
  externalIPPool: external-ip-pool
  #或IP形式 egressIP: 10.10.10.1

⑥ 带宽管理

  • kube-ovn 和 Clium 都支持带宽管理,kube-ovn 还支持 QoS 调整,只需要 Annotation 一下即可搞定:
    • Kube-OVN:
apiVersion: v1
kind: Pod
metadata:
  name: qos
  namespace: ls1
  annotations:
    ovn.kubernetes.io/ingress_rate: "3"
    ovn.kubernetes.io/egress_rate: "1"
    ovn.kubernetes.io/latency: 3
    ovn.kubernetes.io/loss: 20
    • Cilium:
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/egress-bandwidth: 10M
...
  • 读到这里,你可能也会感慨,从最早学 Docker,Vethpair 熟悉容器网络原理,到搭建 K8s 后节点 NotReady 就 apply 个 Flannel 逐步了解 CNI 插件机制,到今天的 CNCF Network&Service Proxy 生态的花团锦簇,云原生网络在日新月异的发展着,容器网络从最初的连通性到现在演变出更多的玩法和适用性,不论是网络功能、安全控制、网络洞察和可观测性,都在更好地为运维人员服务。

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

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

相关文章

【VirtualBox】安装 VirtualBox 提示 needsthe Microsoft Visual C++ 2019

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、开发环境 开发环境&#xff1a;windows10虚拟机&#xff1a;VirtualBox 7.0.8 二、报错 ubun…

多条件见多值查询的 Excel 公式和 python 函数

问题 Python草堂 群的一位群友问&#xff1a;excel 数据表&#xff0c;用 vlookup 函数怎样实现多条件查询多值&#xff0c;多值排到一行上。如下图所示&#xff1a; 左边是数据清单&#xff0c;希望根据两个条件&#xff1a;产品、日期&#xff0c;查询数量&#xff0c;列到…

Element-UI el-table属性row-class-name用法

文章目录 前言官方示例自定义条件样式设置背景颜色样式stripe属性 设置背景颜色样式设置字体颜色总结 前言 可以通过指定 Table 组件的 row-class-name 属性来为 Table 中的某一行添加 class&#xff0c;表明该行处于某种状态。 官方示例 代码如下&#xff1a; <el-table…

体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?

文章目录 前言解决方案一解决方案二第一步第二步 前言 体验版小程序访问不到后端&#xff0c;接口请求失败&#xff0c;这个及其头疼的今天这个坑被我踩到了&#xff0c;呜呜呜~ 今天再发体验版小程序时&#xff0c;在微信开发者工具上面是可以正常访问后端的&#xff0c;但是线…

【sql注入-堆叠注入】多语句执行、结合其他注入

目录 堆叠注入 一、语法介绍 二、漏洞示例 三、常见形式 网络安全O 堆叠注入 一、语法介绍&#xff1a; 版本&#xff1a; 可以影响几乎所有的关系型数据库 原理&#xff1a; 将多条语句堆叠在一起进行查询&#xff0c;且可以执行多条SQL语句 语句之间以分号(;)隔开&#…

人气爆棚!广西、湖南、山西等地领导莅临数据宝考察交流

摘要&#xff1a;近期&#xff0c;数据宝发展如火如荼&#xff0c;企业展厅“忙不停”&#xff0c;见证众多思想碰撞、交流提升&#xff0c;迎来了各省领导莅临参观指导。 01 数字广西集团、青秀区政府领导一行莅临数据宝上海分公司实地走访 近日&#xff0c;数字广西集团党…

深入理解Linux网络——内核与用户进程协作之同步阻塞方案(BIO)

文章目录 一、相关实际问题二、socket的直接创建三、内核和用户进程协作之阻塞方式1&#xff09;等待接收消息2&#xff09;软中断模块3&#xff09;同步队列阻塞总结 在上一部分中讲述了网络包是如何从网卡送到协议栈的&#xff08;详见深入理解Linux网络——内核是如何接收到…

postman测试接口出现404

postman测试接口出现404 1.用postman调试接口的过程中&#xff0c;出现404的情况&#xff0c;但是接口明明已调到了&#xff0c;而且数据也已经存入数据库了&#xff0c;这让我感到很疑惑。看网上的解决办法检查了我的路径&#xff0c;提交方式、参数类型等都是正确的&#xf…

Java反射(Reflection)总结

目录 Java反射概述 Class类 Class对象获取的三种方式&#xff1a; Class类的常用方法 动态加载机制&#xff1a; 通过反射调用构造方法 Constructor类 通过反射获取继承关系 通过反射访问字段&#xff08;成员变量&#xff09; 获取字段值&#xff1a; 设置字段值 通过反…

MySQL数据库(四)

前言 本文讲述索引和事务&#xff0c;以及JDBC。 是关于MySQL的最后一弹啦~~ 重点小知识&#xff1a;MySQL数据库的存储结构是B树&#xff01;&#xff01; 目录 前言 一、索引 &#xff08;一&#xff09;查看索引 &#xff08;二&#xff09;创建索引 &#xff08;三&am…

【JVM】14. 堆外内存

文章目录 堆外内存的意义堆外内存(Off-heap memory)是指在计算机内存管理之外进行分配和使用的内存空间。与堆内内存(Heap memory)不同,堆外内存不受Java虚拟机(JVM)的垃圾回收机制控制,需要手动进行内存的分配和释放。 堆外内存通常由操作系统提供支持,可以通过直接…

3.利用matlab求平均值和中位数(matlab程序)

代码及运行结果 %% 算术平均值 clear all; A[1 2 3 4;4 4 4 4] m1mean(A) %对列元素求算术平均值 m2mean(A,2) %对行元素求算术平均值 %% 忽略非数计算算术平均值 clear all; A[1 4 nan 5;6 nan 7 nan] m1mean(A) %有nan就是nan…

深度学习-图像分类篇一:基础理论

开头言 学东西前总是爱问&#xff0c;这个学了有什么用&#xff0c;会用就行了么。能够回答你这个问题的人&#xff0c;都是学过的&#xff08;只有学过才有资格告诉你有没有用&#xff09;&#xff0c;然而知识往往就是这样&#xff0c;学的人越多越没有用&#xff0c;我可以…

使用 Google 的 zx 库编写切换微信小程序环境的脚本

背景 微信小程序目前为止还没有提供API或者具体的配置方式&#xff0c;给我们设置环境变量&#xff0c;所以还得自己想办法。 创建一个 shell 脚本——一个由诸如 Bash 或 zsh 之类的 shell 执行的脚本——可以是自动化重复任务的好方法。Node.js 似乎是编写 shell 脚本的理想…

Apache Calcite 简介

这张图上列的,是直接使用 Apache Calcite 或者至少相关联的项目。大家肯定能在里面找到很多自己熟悉的项目。 那 Apache Calcite 究竟是干嘛的,又为什么能这么流行呢? 首先,摆一个应该没多少人会反对的共识:SQL 是编程领域最流行的语言。 有 MySQL、Oracle 之类使用 SQL…

Linux---函数库和Makefile

Linux---函数库和Makefile 函数库动态库静态库例 Linux项目自动化构建工具-make/Makefile背景实例代码原理项目清理 函数库 方法实现就是在库当中&#xff0c;库其实就是把源文件经过一定的翻译&#xff0c;然后打包&#xff0c;只给你提供一个文件计科&#xff0c;不用给你提…

Spring -- Bean的生命周期

BeanDefinition Spring容器在进行实例化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefinition对象&#xff0c;Spring根据BeanDefinition来创建Bean对象&#xff0c;里面有很多的属性用来描述Bean BeanDefinition 中几个重要方法如下 beanClassName&#…

阿里云——云服务器基础运维与管理

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 学习目标&#xff1a; 一.3个理由拥抱云服务器 1.什么是云服务器 2.使用…

人物百科词条创建教程分享,人物创建百科有什么要求

人物百科词条的创建是一个相对复杂的过程&#xff0c;需要遵循一定的规范和要求。以下是一个人物百科词条创建教程的分享&#xff0c;包括创建要求、步骤和注意事项&#xff0c;接下来伯乐网络传媒就来给大家好好讲一讲。 一、人物百科词条创建要求 1. 真实性&#xff1a;创建…

ELK-日志服务【filebeat-安装使用】

目录 【1】安装Filebeat 【2】配置-测试 【3】配置使用Filebeat 【4】filebeat-收集系统文件日志 【5】配置filebeat&#xff0c;将/var/log/all.log日志采集到es集群中 【6】定制索引名称 【7】收集多个web节点的日志&#xff0c;输出到相同的索引中 【8】filebeat-收…