《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.6环境中验证

文章目录

  • Kubelet、KubeletConfig和KubeletConfigController
    • 查看节点的Kubelet配置
    • 修改节点的Kubelet配置
  • CRI-O、ContainerRuntimeConfig和MachineConfigController
    • 查看节点的cri-o配置
    • 修改节点的cri-o配置
  • 参考

Kubelet、KubeletConfig和KubeletConfigController

在《OpenShift 4 - 如何用Machine Config Operator修改集群节点CoreOS的配置》一文中提到在OpenShift的Machine Config Controller中包括一个名为Kubelet Config Controller的子组件,该组件接收基于CRD的KubeletConfig配置对象并将其实施于适用节点的Kubelet环境中,也就是说OpenShift 4集群中Node节点的Kubelete环境是通过该组件实现配置的。

在安装OpenShift集群过程中会在Ignition中提供缺省的KubeConfig配置,我们可以在安装后修改节点Kubelet使用的配置,从而修改Kubelet的运行参数。

查看节点的Kubelet配置

  1. 执行命令,查看当前集群中的worker类型节点。
$ oc get node -l node-role.kubernetes.io/worker
NAME                                              STATUS   ROLES    AGE     VERSION
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready    worker   3h32m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready    worker   3h32m   v1.19.0+d59ce34
  1. 查看一个Worker类型的Node对象,其中“Allocatable”部分是该Node的Kubelete所用到的一部分配置。其中“pods: 250”是这个Kubelet可运行的最大pod数。
$ oc describe node <WORKER_NODE> | grep Allocatable -A7
Allocatable:attachable-volumes-aws-ebs:  25cpu:                         15500mephemeral-storage:           114381692328hugepages-1Gi:               0hugepages-2Mi:               0memory:                      63991700Kipods:                        250
  1. 查看这个OpenShift集群所包含的MachineConfig对象。从结果可以看出“01-worker-kubelet”是用来设置worker类型Node里面的Kubelet环境的;另外确认只有2个名为“99-master-XXXXX”和2个名为“rendered-worker-XXXXX”的machineconfig对象。
$ oc get machineconfig
NAME                                                        GENERATEDBYCONTROLLER                      IGNITIONVERSION   AGE
00-master                                                   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
00-worker                                                   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
01-master-container-runtime                                 0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
01-master-kubelet                                           0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
01-worker-container-runtime                                 0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
01-worker-kubelet                                           0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
99-master-ea3d87d1-a5df-4137-a3a3-849915e40cdd-registries   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
99-master-ssh                                                                                          3.1.0             6h9m
99-worker-cdf0041e-c96c-401d-9881-5c8243a58991-registries   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             6h
99-worker-ssh                                                                                          3.1.0             6h9m
rendered-master-2613a048ee6bb4b27621cfff3c44a676            99eb744f5094224edb60d88ca85d607ab151ebdf   3.1.0             6h
rendered-master-c5bfe43313bf45eb9abd3e8422421b6d            0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             3h30m
rendered-worker-46a5c3ba1b88f2b312aa349e71f4a0fa            0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             3h30m
rendered-worker-c74c310336d86b894dec0c5b49743ebd            99eb744f5094224edb60d88ca85d607ab151ebdf   3.1.0             6h
  1. 查看名为01-worker-kubelet的machineconfig中内容,确认kubelet.conf文件的路径在“/etc/kubernetes/kubelet.conf”。
$ oc describe machineconfig 01-worker-kubelet | grep '\--config'--config=/etc/kubernetes/kubelet.conf \
  1. 执行命令,进入一个Worker Node。
$ oc debug node/<WORKER-NODE=NAME>
Starting pod/ip-10-0-150-145ap-southeast-1computeinternal-debug ...
To use host binaries, run `chroot /host`
  1. 在Node节点内部执行命令,查看kubelet.conf文件内容,其中可以看到“maxPods: 250”的配置,这和上面(2)看到的一样的结果。
sh-4.4# chroot /host
sh-4.4# more /etc/kubernetes/kubelet.conf
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:x509:clientCAFile: /etc/kubernetes/kubelet-ca.crtanonymous:enabled: false
cgroupDriver: systemd
cgroupRoot: /
clusterDNS:7. 172.30.0.10
clusterDomain: cluster.local
containerLogMaxSize: 50Mi
maxPods: 250
kubeAPIQPS: 50
kubeAPIBurst: 100
rotateCertificates: true
serializeImagePulls: false
staticPodPath: /etc/kubernetes/manifests
systemCgroups: /system.slice
systemReserved:cpu: 500mmemory: 1Giephemeral-storage: 1Gi
featureGates:LegacyNodeRoleBehavior: falseNodeDisruptionExclusion: trueRotateKubeletServerCertificate: trueSCTPSupport: trueServiceNodeExclusion: trueSupportPodPidsLimit: true
serverTLSBootstrap: true
  1. 从OpenShift的worker节点中退出来。
sh-4.4# exit
sh-4.4# exit

修改节点的Kubelet配置

  1. 创建内容如下的change-maxPods-cr.yaml文件。其中通过KubeletConfig对象将kubelet的maxPods设为500,另外它只针对带有“custom-kubelet: large-pods”的Node才有效。
apiVersion: machineconfiguration.openshift.io/v1
kind: KubeletConfig
metadata:name: set-max-pods
spec:machineConfigPoolSelector:matchLabels:custom-kubelet: large-podskubeletConfig:maxPods: 500
  1. 查看名为worker的machineconfigpool的信息,确认没有“custom-kubelet=large-pods”的标签。
$ oc get machineconfigpool worker --show-labels
NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE   LABELS
worker   rendered-worker-1e4ff665b30dd1099a34d6e636654353   True      False      False      2              2                   2                     0                      8h    machineconfiguration.openshift.io/mco-built-in=
  1. 修改worker类的machineconfigpool的配置,增加“custom-kubelet=large-pods”标签。
$ oc label machineconfigpool worker custom-kubelet=large-pods
  1. 创建Kubeletconfig对象。
$ oc create -f change-maxPods-cr.yaml
$ oc get kubeletconfig
NAME           AGE
set-max-pods   7s
  1. 查看Worker节点更新状态,可以看到OpenShift对2个Worker节点逐个更新Kubelet的配置。另外在更一个新节点的时候,该节点暂时处于“SchedulingDisabled”状态,以便临时不被Pod等资源调度到。最后2个Worker节点都恢复到只有“Ready”的状态。
NAME                                              STATUS                        ROLES    AGE     VERSION
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready                         worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready,SchedulingDisabled      worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     NotReady,SchedulingDisabled   worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     NotReady,SchedulingDisabled   worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready,SchedulingDisabled      worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready,SchedulingDisabled      worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready                         worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready                         worker   7h19m   v1.19.0+d59ce34
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready                         worker   7h19m   v1.19.0+d59ce34
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      worker   7h19m   v1.19.0+d59ce34
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      worker   7h19m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready                         worker   7h20m   v1.19.0+d59ce34
ip-10-0-190-1.ap-southeast-1.compute.internal     Ready                         worker   7h20m   v1.19.0+d59ce34
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      worker   7h20m   v1.19.0+d59ce34
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      worker   7h20m   v1.19.0+d59ce34
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      worker   7h20m   v1.19.0+d59ce34
ip-10-0-150-145.ap-southeast-1.compute.internal   Ready                         worker   7h21m   v1.19.0+d59ce34
  1. 查看machineconfig对象,确认已经有3个名为“99-worker-XXXXXX“和3个名为“rendered-worker-XXXXX”的machineconfig对象。可以根据AGE判断“99-worker-cdf0041e-c96c-401d-9881-5c8243a58991-kubelet”和“rendered-worker-1e4ff665b30dd1099a34d6e636654353”是新创建的machineconfig对象,其中“99-worker-cdf0041e-c96c-401d-9881-5c8243a58991-kubelet”中包含了对Worker类型节点的Kubelet做的变更配置信息。
$ oc get machineconfig
NAME                                                        GENERATEDBYCONTROLLER                      IGNITIONVERSION   AGE
00-master                                                   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
00-worker                                                   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
01-master-container-runtime                                 0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
01-master-kubelet                                           0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
01-worker-container-runtime                                 0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
01-worker-kubelet                                           0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
99-master-ea3d87d1-a5df-4137-a3a3-849915e40cdd-registries   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
99-master-ssh                                                                                          3.1.0             8h
99-worker-cdf0041e-c96c-401d-9881-5c8243a58991-kubelet      0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             30m
99-worker-cdf0041e-c96c-401d-9881-5c8243a58991-registries   0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             8h
99-worker-ssh                                                                                          3.1.0             8h
rendered-master-2613a048ee6bb4b27621cfff3c44a676            99eb744f5094224edb60d88ca85d607ab151ebdf   3.1.0             8h
rendered-master-c5bfe43313bf45eb9abd3e8422421b6d            0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             5h35m
rendered-worker-1e4ff665b30dd1099a34d6e636654353            0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             30m
rendered-worker-46a5c3ba1b88f2b312aa349e71f4a0fa            0157b684b81eb5cbbe4e37d7b7e018ce5d5967d2   3.1.0             5h35m
rendered-worker-c74c310336d86b894dec0c5b49743ebd            99eb744f5094224edb60d88ca85d607ab151ebdf   3.1.0             8h
  1. 查看名为set-max-pods的kubeletconfig对象的status,其中“type: Success”代表已经成功执行了。
$ oc get kubeletconfig set-max-pods -o yaml
。。。
status:conditions:- lastTransitionTime: "2020-12-05T15:37:47Z"message: Successstatus: "True"type: Success
  1. 再次查看Worker节点的Kubelet配置,发现已经变成“pods:500”了。
 $ oc describe node <WORKER_NODE> | grep Allocatable -A7
Allocatable:attachable-volumes-aws-ebs:  25cpu:                         15500mephemeral-storage:           114381692328hugepages-1Gi:               0hugepages-2Mi:               0memory:                      63991700Kipods:                        500

CRI-O、ContainerRuntimeConfig和MachineConfigController

OpenShift 4的集群适用了CRI-O作为其容器运行环境,节点CRI-O的配置文件etc/crio/crio.conf。若要修改节点的CRI-O的配置参数,需要用到OpenShift中的CRD类型对象ContainerRuntimeConfig保存定制的配置参数。当OpenShift发现有新的ContainerRuntimeConfig后,会根据其内容生成对应的r名为ender-xxxx的MachineConfig对象,此后OpenShift的MachineConfigController会将MachineConfig对象发送到所有相关对点的MachineConfigDaemon,再由它完成该节点配置的修改。

查看节点的cri-o配置

  1. 根据本文前面的方法进入一个master节点,然后查看crio运行环境的配置文件中的“pids_limit”参数,确认缺省为1024。最后从OpenShift的master节点退出来。
sh-4.4# cat /etc/crio/crio.conf | grep -v "#"  | sed '/^$/d' |grep -i pids_limit
pids_limit = 1024

修改节点的cri-o配置

  1. 为master类型的machineconfigpool添加标签。ContainerRuntimeConfig对象会提交到该标签对应的machine上。
$ oc label machineconfigpool master debug-crio=config-log-and-pid
machineconfigpool.machineconfiguration.openshift.io/master labeled
  1. 创建内容如下的ContainerRuntimeConfig.yaml文件,其中通过定义的ContainerRuntimeConfig对象来修改节点ContainerRuntime的pidsLimit和logLevel参数。
apiVersion: machineconfiguration.openshift.io/v1
kind: ContainerRuntimeConfig
metadata:name: set-log-and-pid
spec:machineConfigPoolSelector:matchLabels:debug-crio: config-log-and-pidcontainerRuntimeConfig:pidsLimit: 2048logLevel: debug
  1. 创建ContainerRuntimeConfig对象。
$ oc create -f ContainerRuntimeConfig.yaml
containerruntimeconfig.machineconfiguration.openshift.io/set-log-and-pid created
$ oc get ContainerRuntimeConfig
NAME              AGE
set-log-and-pid   5s
  1. 查看MachineConfig,确认OpenShift生成了名为rendered-master-xxx的MachineConfig,并且其中的“pids_limit”参数为“2048”。
$ oc get MachineConfigs | grep rendered
rendered-master-1eac183c39006eab3480e3acfc9ba8db                  99eb744f5094224edb60d88ca85d607ab151ebdf   3.1.0             27h
rendered-master-d08c556ab53f07069ff0c46e741de224                  99eb744f5094224edb60d88ca85d607ab151ebdf   3.1.0             50s
rendered-worker-92b2d6fba537bbf64d3493dcc2b6a207                  99eb744f5094224edb60d88ca85d607ab151ebdf   3.1.0             27h$ python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" $(oc get MachineConfig/rendered-master-d08c556ab53f07069ff0c46e741de224 -o YAML | grep -B4 crio.conf | grep source | tail -n 1 | cut -d, -f2) | grep pidpids_limit = 2048
  1. 查看master节点更新状态,确认集群中master轮流进行了更新。
$ oc get node -l node-role.kubernetes.io/master -w
NAME                                              STATUS                        ROLES    AGE   VERSION
ip-10-0-134-103.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-178-236.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-134-103.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-178-236.ap-southeast-1.compute.internal   NotReady,SchedulingDisabled   master   26h   v1.19.0+d59ce34
ip-10-0-178-236.ap-southeast-1.compute.internal   NotReady,SchedulingDisabled   master   26h   v1.19.0+d59ce34
ip-10-0-134-103.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-178-236.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      master   26h   v1.19.0+d59ce34
ip-10-0-178-236.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-178-197.ap-southeast-1.compute.internal   Ready                         worker   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      master   26h   v1.19.0+d59ce34
ip-10-0-157-96.ap-southeast-1.compute.internal    Ready                         worker   26h   v1.19.0+d59ce34
ip-10-0-178-236.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   NotReady,SchedulingDisabled   master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-134-103.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-134-103.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      master   26h   v1.19.0+d59ce34
ip-10-0-178-236.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-221-178.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
ip-10-0-134-103.ap-southeast-1.compute.internal   NotReady,SchedulingDisabled   master   26h   v1.19.0+d59ce34
ip-10-0-134-103.ap-southeast-1.compute.internal   Ready,SchedulingDisabled      master   26h   v1.19.0+d59ce34
ip-10-0-134-103.ap-southeast-1.compute.internal   Ready                         master   26h   v1.19.0+d59ce34
  1. 用上小一节的步骤再次查看/etc/crio/crio.conf文件,确认“pids_limit”已经被修改为2048。

参考

https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.5/html-single/scalability_and_performance/index
https://docs.openshift.com/container-platform/4.5/scalability_and_performance/recommended-host-practices.html
https://www.redhat.com/en/blog/red-hat-openshift-container-platform-4-now-defaults-cri-o-underlying-container-engine

OpenShift 4 - 用KubeletConfig和ContainerRuntimeConfig分别修改集群节点的Kubelet和cri-o的配置相关推荐

  1. OpenShift 4 - 如何用Machine Config Operator修改集群节点CoreOS的配置

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 OpenShift 4 和 RHCOS MachineConfig相关概念 ...

  2. OpenShift 4 - 利用 File Integrity Operator 实现对集群节点进行入侵检测

    <OpenShift / RHEL / DevSecOps 汇总目录> 说明:本文已经在OpenShift 4.9环境中验证 文章目录 File Integrity Operator 功能 ...

  3. OpenShift 4 - 集群节点日志和API审计日志策略

    <OpenShift / RHEL / DevSecOps 汇总目录> 说明:本文已经在OpenShift 4.8 环境中验证 文章目录 集群节点日志 集群节点日志类型 收集集群节点日志 ...

  4. OpenShift 4 - 在集群节点用crictl对Pod/Image/Container进行操作

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 查看crictl命令的配置文件 用crictl命令操作Pod/Image/C ...

  5. OpenShift 4 - 设置集群节点和Pod容器的时间和时区

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 OpenShift的时间和时区 节点和容器的时间 节点和容器的时区 节点时间 ...

  6. cluster oracle修改,Oracle 修改集群的资源属性(依赖关系)

    修改集群的资源属性: -- 在11g中 使用Crsctl modify resource res_name -attr 命令可以随意添加修改集群的各项资源的属性 来个例子: 查看数据库资源的全部属性: ...

  7. ES修改集群最大分片数量max_shards_per_node

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  8. OpenShift 4 之让Route只运行在集群中Infra节点

    很多OpenShift的用户都非常喜欢其自带的Route功能,Route为外部用户提供了访问Pod的负载均衡功能,它要比Kubernetes缺省提供的Ingress功能强大很多.有关介绍可参见< ...

  9. 如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1)

    如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1) 文档内容 用途 适用范围 详细信息   情况1.   修改公网对应的主机名   情况2.  只修改公网 IP或者VIP, 但 ...

最新文章

  1. mysql 多表关联建模_(四)多对多模式 - 数据库模型设计专栏 - CSDN博客
  2. java调用天气预报api_java调用中国天气网api获得天气预报信息
  3. 【STM32】I2C详解
  4. 数学--矩阵快速幂详解
  5. Linux 命令简单介绍第二课笔记
  6. Master PDF Editor_v5.7.00 PDF编辑
  7. 使用Weka进行数据挖掘
  8. 云计算介绍、TCP/IP协议及配置
  9. 专业的Excel管理工具LibXL V3.8.0发布 | 附下载
  10. php基础--变量及作用域
  11. 深度学习大神都推荐入门必须读完这9篇论文
  12. V4L2视频输入框架概述
  13. PADS过孔与安全间距的设置与使用
  14. python数据分析入门【二】 --- 数据处理
  15. 2021年危险化学品生产单位安全生产管理人员考试内容及危险化学品生产单位安全生产管理人员试题及解析
  16. System32下文件说明
  17. 已知一个如图所示的训练数据集,其正例点是x1=(3,3),x1=(4,3),负例点是x3=(1,1),试求最大间隔分离超平面。
  18. matlab hdf属性,matlab hdf 读取
  19. 如何将DWG(CAD格式文件)转换到shp或其它gis文件
  20. 如何给PDF嵌入相关字体

热门文章

  1. ft232h引脚_一种基于芯片ft232h的usb接口电路的制作方法
  2. matlab的7.3版本是什么_MX Linux 19.3 发布,Debian和antiX Linux的混合版本
  3. arduino openmv 显示图像_OpenMV与Arduino NUO的连接方式
  4. c语言400行小游戏,400行代码编C语言控制台界版2048游戏,编写疯子一样的C语言代码...
  5. linux清空输入框,Linux uniq 命令
  6. 刚入行的UI设计师,通过临摹优秀UI KIT作品开始
  7. poj 1006 java_POJ 1006 Java:中国剩余定理
  8. C++11左值和右值引用讲解
  9. ASN.1编解码:asn1c-ORAN-E2AP编解码示例
  10. Linux内存管理:分页