公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

我是 LEE,老李,一个在 IT 行业摸爬滚打 16 年的技术老兵。

事件背景

最近不少 k8s 底层网络模块都从 kubenet 升级到了 cilium,cilium  还是相对比较易用的,就是运维、监控和报警方案需要花点时间来适应。但是最近我们有一组 k8s 结构比较特殊,导致它在从 kubenet 升级到  cilium 的时候出现了一个小插曲:在 kubenet 网络的节点上的 pod 无法访问 cilium 网络的节点上且部署了 networkpolicy 的 pod,导致了这个 k8s 上部分商户在新发应用 pod 时,pod 被调度到 cilium 网络的节点上,此时无法与运行在 kubenet 网络的节点上 pod 互访问题。

现象获取

当我们接到监控系统的报警,以及客户的反馈,所以部分商户出现了服务异常,而且只是少量商户的出现了问题。针对这些商户的服务我第一时间看了下共性,发现这些商户的服务性质,受众群体,以及触发报警时间都不一样,难道是巧合?我随机找一个商户做了简单的排查:

直接测试商户的接口

接口异常

发现商户接口直接返回:upstream connect error or disconnect/reset before headers. reset reason: connection failure ,单看这个信息,就知道这个应该不是服务返回的内容,应该是后端服务前某一层转发层的问题。

查看但是商户服务的异常日志

日志 503 报错

查看应用 sidecar 的日志, 把有问题的部分过滤出来,发现是错误代码是 503。

通过上面的故障,我顿时觉得整个问题很奇怪。Http 503 的意思是说后端的服务资源不存在了,但是后端的 IP 还是通的,要不然就会是 502。

所以这里踩了一个小坑,觉得是商户应用的问题,还跟商户确认了很多内容,以及最近发布的情况。但是实际是因为网络层请求被截断,导致数据包无法正常转发,才导致这次故障,具体我们看下一个环节。

原理分析

故障测试

通过大量的排查和分析,而且确定商户的服务启动正常,没有运行报错日志。只是服务无法对外正常提供,我就快速将排障范围缩小到了网络层面。

这里我提供一份网络流量结构图:

网络架构简图
  • Ingress pod:是 istio Ingress gateway

  • App pod: 是商户应用服务的 pod,拥有 istio 的 sidecar

为了确认丢包的位置,我们分在如下几个点抓包测试:

抓包点

抓包信息汇总表:

测试点 抓包结果
A 点 有 request,没有 respond
B 点 有 request,没有 respond
C 点 什么都没有

测试完,我大吃一惊,感觉丢包了啊,而且是 cilium 节点把数据包丢了。带着怀疑,有仔细检查了两个 cilium 节点上的 ct 表,以及 networkpolicy 挂载点信息。

ENDPOINT 信息

ENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                          IPv6   IPv4           STATUSENFORCEMENT        ENFORCEMENT
2636       Enabled            Disabled          59271      k8s:app=wetown-java                                                         10.242.2.149   readyk8s:app_id=468205436992_wetown-javak8s:app_name=wetown-javak8s:appnew=468205436992_wetown-javak8s:group=standardk8s:io.cilium.k8s.namespace.labels.istio-injection=enabledk8s:io.cilium.k8s.namespace.labels.project_id=468205436992_defaultk8s:io.cilium.k8s.namespace.labels.project_name=defaultk8s:io.cilium.k8s.namespace.labels.tenant_id=468205436992k8s:io.cilium.k8s.policy.cluster=defaultk8s:io.cilium.k8s.policy.serviceaccount=defaultk8s:io.kubernetes.pod.namespace=468205436992-defaultk8s:metric_source=customizek8s:security.istio.io/tlsMode=istiok8s:service.istio.io/canonical-name=wetown-javak8s:service.istio.io/canonical-revision=latest

NETWORKPOLICY 信息

Defaulted container "cilium-agent" out of: cilium-agent, mount-cgroup (init), apply-sysctl-overwrites (init), clean-cilium-state (init)
POLICY   DIRECTION   LABELS (source:key[=value])                                                    PORT/PROTO   PROXY PORT   BYTES      PACKETS
Allow    Ingress     reserved:unknown                                                               9999/TCP     NONE         0          0
Allow    Ingress     reserved:host                                                                  ANY          NONE         408725     5154
Allow    Ingress     k8s:app=istiod                                                                 ANY          NONE         11824851   910k8s:install.operator.istio.io/owning-resource=unknownk8s:io.cilium.k8s.namespace.labels.istio-injection=disabledk8s:io.cilium.k8s.namespace.labels.system=truek8s:io.cilium.k8s.policy.cluster=defaultk8s:io.cilium.k8s.policy.serviceaccount=istiod-1-11-8k8s:io.kubernetes.pod.namespace=istio-systemk8s:istio.io/rev=1-11-8k8s:istio=istiodk8s:operator.istio.io/component=Pilotk8s:sidecar.istio.io/inject=false
Allow    Ingress     k8s:app=istio-ingressgateway                                                   ANY          NONE         8007       14k8s:chart=gatewaysk8s:heritage=Tillerk8s:install.operator.istio.io/owning-resource=unknownk8s:io.cilium.k8s.namespace.labels.istio-injection=disabledk8s:io.cilium.k8s.namespace.labels.system=truek8s:io.cilium.k8s.policy.cluster=defaultk8s:io.cilium.k8s.policy.serviceaccount=istio-ingressgateway-service-accountk8s:io.kubernetes.pod.namespace=istio-systemk8s:istio.io/rev=1-11-8k8s:istio=ingressgatewayk8s:operator.istio.io/component=IngressGatewaysk8s:release=istiok8s:service.istio.io/canonical-name=istio-ingressgatewayk8s:service.istio.io/canonical-revision=1-11-8k8s:sidecar.istio.io/inject=false
Allow    Ingress     k8s:app=network-debug                                                          ANY          NONE         0          0k8s:io.cilium.k8s.namespace.labels.system=truek8s:io.cilium.k8s.policy.cluster=defaultk8s:io.cilium.k8s.policy.serviceaccount=defaultk8s:io.kubernetes.pod.namespace=default
Allow    Ingress     k8s:app=wetown-java                                                            ANY          NONE         0          0k8s:app_id=468205436992_wetown-javak8s:app_name=wetown-javak8s:appnew=468205436992_wetown-javak8s:group=standardk8s:io.cilium.k8s.namespace.labels.istio-injection=enabledk8s:io.cilium.k8s.namespace.labels.project_id=468205436992_defaultk8s:io.cilium.k8s.namespace.labels.project_name=defaultk8s:io.cilium.k8s.namespace.labels.tenant_id=468205436992k8s:io.cilium.k8s.policy.cluster=defaultk8s:io.cilium.k8s.policy.serviceaccount=defaultk8s:io.kubernetes.pod.namespace=468205436992-defaultk8s:metric_source=customizek8s:security.istio.io/tlsMode=istiok8s:service.istio.io/canonical-name=wetown-javak8s:service.istio.io/canonical-revision=latestk8s:tenant_id=468205436992
Allow    Egress      reserved:unknown                                                               ANY          NONE         990293     6509

CT 信息

TCP IN 10.242.2.153:60064 -> 10.242.2.149:15021 expires=17276052 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17276043 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17276043 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:2464 -> 10.242.2.149:15020 expires=17276618 RxPackets=5 RxBytes=418 RxFlagsSeen=0x1b LastRxReport=17276609 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17276609 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:19582 -> 10.242.2.149:15021 expires=17275992 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17275983 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17275983 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:17164 -> 10.242.2.149:15021 expires=17276443 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17276434 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17276434 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:15068 -> 10.242.2.149:15020 expires=17276115 RxPackets=5 RxBytes=418 RxFlagsSeen=0x1b LastRxReport=17276106 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17276106 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:3468 -> 10.242.2.149:15021 expires=17276081 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17276072 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17276072 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:60072 -> 10.242.2.149:15021 expires=17276413 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17276404 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17276404 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:13152 -> 10.242.2.149:15021 expires=17276083 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17276074 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17276074 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:60054 -> 10.242.2.149:15021 expires=17276509 RxPackets=18 RxBytes=1392 RxFlagsSeen=0x1b LastRxReport=17276500 TxPackets=12 TxBytes=1113 TxFlagsSeen=0x1b LastTxReport=17276500 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:14902 -> 10.242.2.149:15020 expires=17276263 RxPackets=5 RxBytes=417 RxFlagsSeen=0x1b LastRxReport=17276254 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17276254 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:7100 -> 10.242.2.149:15021 expires=17276003 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17275994 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17275994 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:1396 -> 10.242.2.149:15020 expires=17276207 RxPackets=5 RxBytes=418 RxFlagsSeen=0x1b LastRxReport=17276198 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17276198 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:11408 -> 10.242.2.149:15020 expires=17275973 RxPackets=5 RxBytes=418 RxFlagsSeen=0x1b LastRxReport=17275964 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17275964 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:60010 -> 10.242.2.149:15020 expires=17276575 RxPackets=63 RxBytes=5171 RxFlagsSeen=0x1b LastRxReport=17276566 TxPackets=60 TxBytes=4512 TxFlagsSeen=0x1b LastTxReport=17276566 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:18134 -> 10.242.2.149:15020 expires=17276315 RxPackets=5 RxBytes=418 RxFlagsSeen=0x1b LastRxReport=17276306 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17276306 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:3438 -> 10.242.2.149:15021 expires=17276076 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17276067 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17276067 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:17962 -> 10.242.2.149:15020 expires=17276032 RxPackets=5 RxBytes=418 RxFlagsSeen=0x1b LastRxReport=17276023 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17276023 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:10100 -> 10.242.2.149:15020 expires=17276500 RxPackets=5 RxBytes=418 RxFlagsSeen=0x1b LastRxReport=17276491 TxPackets=5 TxBytes=376 TxFlagsSeen=0x1b LastTxReport=17276491 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:8154 -> 10.242.2.149:15021 expires=17276329 RxPackets=12 RxBytes=928 RxFlagsSeen=0x1b LastRxReport=17276320 TxPackets=8 TxBytes=742 TxFlagsSeen=0x1b LastTxReport=17276320 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0
TCP IN 10.242.2.153:19556 -> 10.242.2.149:15021 expires=17275986 RxPackets=6 RxBytes=464 RxFlagsSeen=0x1b LastRxReport=17275977 TxPackets=4 TxBytes=371 TxFlagsSeen=0x1b LastTxReport=17275977 Flags=0x0013 [ RxClosing TxClosing SeenNonSyn ] RevNAT=0 SourceSecurityID=1 IfIndex=0......

通过检查,就是没有发现从 kubenet 网络的节点转发过来的流量。然后回想到应用上有挂载  networkpolicy,我这边果断删除这个业务 pod 上挂载的 networkpolicy,然后在所有测试点抓包。 全部都通了,现在破案了,应该是 networkpolicy 的问题。

这里又来一个隐含的问题,既然在同一个 k8s 内,有 cilium 网络的节点,也有传统的 kubenet 网络的节点。为什么会出现不通呢?为了验证这个问题,我们又做了如下一个实验,还是上图:

抓包点

在做这个实验前,有一点可以确认:丢包点是在两种不同的网络模型,并不是外部进入 k8s 集群,所以只要关注 C 点流量。

测试方法跟之间一样,然后我们在不同的点抓包,这次结果也让我惊掉了下巴。

测试内容 状态介绍 测试点 测试结果
kubenet 节点上 pod 访问 cilium 节点上业务 pod 1. 发起请求的测试 pod 运行在 kubenet 节点上 2. 被测试业务 pod 运行在 cilium 节点上 3. 被测试业务 pod 配置有 networkpolicy C 点 失败
cilium 节点上 pod 访问 kubenet 节点上业务 pod 1. 发起请求的测试 pod 运行在 kubenet 节点上 2. 被测试业务 pod 运行在 cilium 节点上 3. 被测试业务 pod 配置有 networkpolicy B 点 成功
kubenet 节点上 pod 访问 cilium 节点上业务 pod (去除 cilium 节点上 pod 上的 networkpolicy 1. 发起请求的测试 pod 运行在 kubenet 节点上 2. 被测试 pod 运行在 cilium 节点上 3. 删除被测试 pod 的 networkpolicy 4. 被测试 pod 监听 8080 端口 5. 测试 pod 发起 tcp 请求到被测试 pod C 点 成功
cilium 节点上 pod 访问 kubenet 节点上业务 pod (去除 cilium 节点上 pod 上的 networkpolicy 1. 发起请求的测试 pod 运行在 kubenet 节点上 2. 被测试 pod 运行在 cilium 节点上 3. 删除被测试 pod 的 networkpolicy 4. 测试 pod 监听 8080 端口 5. 被测试 pod 发起 tcp 请求到测试 pod B 点 成功

总结下: 从 kubenet 网络的节点上 pod 访问带有 networkpolicy 的 cilium 网络的节点上 pod,是不通,其他的场景都是 OK 的。

技术解析

那么是不是有这样一种猜想,cilium 不识别其他的网络模型的节点呢?让我们看看 cilium cluster 信息:

Cluster health:             15/15 reachable   (2022-12-12T08:19:02Z)Name                      IP                Node        Endpoints10.118.201.53 (localhost)   10.118.201.53       reachable   reachable10.118.201.48               10.118.201.48       reachable   reachable10.118.201.49               10.118.201.49       reachable   reachable10.118.201.50               10.118.201.50       reachable   reachable10.118.201.51               10.118.201.51       reachable   reachable10.118.201.52               10.118.201.52       reachable   reachable10.118.201.54               10.118.201.54       reachable   reachable10.118.201.55               10.118.201.55       reachable   reachable10.118.201.56               10.118.201.56       reachable   reachable10.118.201.57               10.118.201.57       reachable   reachable10.118.201.58               10.118.201.58       reachable   reachable10.118.201.59               10.118.201.59       reachable   reachable10.118.201.60               10.118.201.60       reachable   reachable10.118.201.61               10.118.201.61       reachable   reachable10.118.201.62               10.118.201.62       reachable   reachable

通过节点信息,我们可以清楚看出,cilium 只管理部署了 cilium agent 的节点。其他的 kubenet  网络节点他是不管的,也就是这些节点对他来说的跟外部服务器一样,从这些节点传入的网络流量都当成外部流量,即便在同一个 k8s 内,cilium  也不看你流量信息,以及来源哪里。

说到这里,不得不提到之前写一篇文章《ebpf 开发入门之核心概念篇》,那里面提到了一个 HOOK 的概念,networkpolicy  就是通过 HOOK 挂载到容器的网卡的 Ingress 上。既然 kubenet 网络的节点 和 cilium 网络的节点都在同一个 k8s  内,但是 cilium 的只管理自己的节点,其他的节点都认为是外部的,如果不匹配 Ingress 的规则,都会被拒绝。

通过抓包测试,以及分析 cilium 的相关信息,我们找到问题所在:cilium 如果没有管理全部的 k8s 所有节点,剩余的节点就按照外部服务器的方式来处理

处理方法

知道了原因,有了实验验证,那么办法也当然就有了,当然也很简单。

  1. 移动所有的 pod 到 cilium 网络的节点

  2. 移动 Ingress pod 到 cilium 网络的节点

  3. 删除 cilium 受影响 pod 的 networkpolicy

从解决办法上看,最合理也最有可操作性的是:2 号

最终效果

通过调整后,最终结果当然也复合预期,所有的业务互联互通都没有了问题。同时也在加速 pod 的迁移,尽量减少这样的不合理的共存环境。

本文转载自:「掘金」,原文:https://url.hi-linux.com/UxAnz,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

你可能还喜欢

点击下方图片即可阅读

中国各城市首轮新冠感染高峰期预测


点击上方图片,『美团|饿了么』外卖红包天天免费领

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

Kubernetes 最强云原生网络组件 Cilium 常用故障排查中文指南相关推荐

  1. linux服务器无网络确认,Linux服务器故障排查实用指南

    [2013年3月25日 51CTO外电头条]由于造成网络问题的因素多种多样,因此网络故障排查技能就成了每位服务器或网络服务负责人必不可少的重要素质.Linux为我们提供了大量网络故障排查工具,在本文中 ...

  2. 云原生网络利器 Cilium 总览

    ▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 - 1 - 背景 在云原生相对成熟的今天,对于 Kubernetes 本身的能力需求,逐渐变得 ...

  3. 云原生网络利器--Cilium 总览

    01 背景 在云原生相对成熟的今天,对于 Kubernetes 本身的能力需求,逐渐变得不那么迫切,因为常见的能力都已经成熟稳定了.但是在周边领域还处于不断发展的过程,特别是容器的网络方案,存储方案, ...

  4. 干货 | 携程 Cilium+BGP 云原生网络实践

    作者简介 Arthur,Stephen,Jaff,Weir,几位均来自携程云平台基础设施和网络研发团队,目前专注于网络和云原生安全相关的开发. Cilium 是近两年最火的云原生网络方案之一.Cili ...

  5. Kubernetes 已经成为云原生时代的安卓,这就够了吗?

    作者:司徒放 审核&校对:田玮靖.溪洋 编辑&排版:雯燕 导语: 云原生时代,直接使用 Kubernetes 和云基础设施过于复杂,如用户需要学习很多底层细节.应用管理的上手成本高.容 ...

  6. Kubernetes 入门必备云原生发展简史

    作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 "未来的软件一定是生长于云上的"这是云原生理念的最核心假设.而所谓"云原生",实际上就是在定义一条能 ...

  7. 【云原生利器之Cilium】什么是Cilium

    文章目录 云原生利器之Cilium 一.什么是cilium 二.Cilium使用场景 关于容器网络接口 ( CNI ) 三.网络解决方案Flannel,Calico 和 Cilium 对比 DPDK ...

  8. 2022云原生网络趋势 | K8s托管整个基础设施、多云、边缘计算、安全等场景,将云原生网络带向新战场

    云原生技术在飞速发展的过程中不断地进入更多的行业和领域,作为云原生网络发展的见证者.亲历者,Kube-OVN Team对大量用户的技术选型.应用场景.落地实践经验进行分析,看到了一套不同于以往的网络发 ...

  9. 云原生网络代理(MOSN)的进化之路

    本文系云原生应用最佳实践杭州站活动演讲稿整理.杭州站活动邀请了 Apache APISIX 项目 VP 温铭.又拍云平台开发部高级工程师莫红波.蚂蚁金服技术专家王发康.有赞中间件开发工程师张超,分享云 ...

最新文章

  1. 什么是优秀的图表示?斯坦福提出首个信息论原则——图信息瓶颈
  2. mac 安装 nginx
  3. 大学生计算机实验基础考试,大学生计算机基础考试题库完整(56页)-原创力文档...
  4. pip list和pip freeze的区别(列出所有包,列出包的requirements格式)
  5. hyperledge环境安装
  6. 6-3 求链表的倒数第m个元素
  7. 【哈希和哈希表】Beads
  8. 我终于搞清楚了和String有关的那点事儿
  9. springboot 注解动态赋值_SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值
  10. python 取array并集_Python内置数据结构原理与性能简易分析
  11. 查看地区的ip段_「教程」CloudFlare 自选 IP优化网站速度
  12. echarts中x轴文件消失_百度Echarts图表在Vue项目的完整引入以及按需加载
  13. 使用内存文件映射MappedByteBuffer读超大文件可能会遇到的问题
  14. 计算机电源管理器的用途,联想电源管理软件调整电源模式有什么用?联想电源管理软件电源模式调整和用处...
  15. 土壤质地标准转换程序Java MVC模式
  16. 平衡小车——编码器原理及其使用
  17. centos7zabbix-agen安装
  18. 网站数据采集器-文章采集工具-关键词文章采集工具
  19. InstallShield
  20. K-Stack 2021牛客多校2

热门文章

  1. 计算机硕士全国联考英语考试,在职攻读硕士学位全国联考英语考试大纲是什么?...
  2. 微信公众平台消息储存mysql php_微信公众平台开发如何保证access
  3. Java seven
  4. android中停止服务,在Android中停止服务
  5. Nginx日志重定向到标准输出
  6. 关于使用Typora制作接口文档的那些事儿
  7. 打印插件LODOP使用介绍
  8. 视频编码(压缩)方式/编码(压缩)原理/概念 (转)作者:哈库呐玛塔塔__
  9. 第二十三章《斗地主游戏》第2节:系统功能实现
  10. 阿里云服务器centos7配置Python Django项目