一 METRICS子系统组件

1.1 metric架构介绍

OpenShift metric子系统支持捕获和长期存储OpenShift集群的性能度量,收集节点以及节点中运行的所有容器的指标。
metric子系统被由以下开源项目的容器组件构成:
  • Heapster
从Kubernetes集群中的所有节点收集指标,并将其转发给存储引擎进行长期存储。OCP使用Hawkular作为Heapster的存储引擎。
Heapster项目是由Kubernetes社区孵化的,目的是为第三方应用程序提供一种从Kubernetes集群捕获性能数据的方法。
  • Hawkular Metrics
提供用于存储和查询时间序列数据的REST API。Hawkular Metrics组件是更大的Hawkular项目的一部分。Hawkular Metrics使用Cassandra作为其数据存储。
Hawkular是作为RHQ项目(Red Hat JBoss Operations Network product)的继承者创建的,是Red Hat CloudForms产品中间件管理功能的一个关键部分。
  • Hawkular Agent
从应用程序收集自定义性能指标,并将其转发到Hawkular Metrics进行存储。应用程序为Hawkular agent提供度量标准。
Hawkular OpenShift Agent (HOSA)目前是一个技术预览功能,默认情况下没有安装,Red Hat不支持技术预览功能,也不建议将其用于生产。
  • Cassandra
将时间序列数据存储在非关系分布式数据库中。
OpenShift Metrics子系统独立于其他OpenShift组件工作。OpenShift只有三个部分需要metrics子系统来提供一些可选特性:
  • web控制台调用Hawkular Metrics API来获取数据,以呈现项目中pod的性能图形。如果没有部署度量子系统,则不显示图表。
注意,这些调用是从用户web浏览器发出的,而不是从OpenShift主节点发出的。
  • oc adm top命令使用Heapster API来获取关于集群中所有pod和节点的当前状态的数据。
  • Kubernetes的autoscaler控制器调用Heapster API来从部署中获取关于所有pod当前状态的数据,以便决定如何伸缩部署控制器。
OCP并不强制一定部署完整的度量子系统,如果已经有一个监视系统,并且希望使用它来管理OpenShift集群,那么可以选择只部署Heapster组件,并将度量的长期存储委托给外部监视系统。
如果现有的监视系统只提供警报和健康功能,那么监视系统可以使用Hawkular API捕获指标来生成警报。
Heapster收集节点及其容器的指标,然后聚合pod、namespace和整个集群的指标。
Heapster为一个节点收集的指标包括:
working set:节点中运行的所有进程有效使用的内存,以bytes为单位度量。
CPU usage:节点中运行的所有进程使用的CPU数量,以millicores单位度量,十个millicores相当于一个CPU繁忙时间的1%。
Heapster还支持对内存中保留的指标进行简单查询,这些查询允许获取在特定时间范围内收集和聚合的度量。

1.2 访问Heapster和Hawkular

OpenShift用户需要区分声明的资源请求(和限制)与实际的资源使用情况。pod声明的资源请求用于调度,声明的资源请求从节点容量中减去,其差值是节点的剩余可用容量。
节点的可用容量不反映在节点内运行的容器和其他应用程序使用的实际内存和CPU。
oc describe node命令,在OCP 3.9中,只显示与pods声明的资源请求相关的信息。如果pod没有声明任何资源请求,则不会考虑pod的实际资源使用情况,节点的可用容量可能看起来比实际容量大。
web控制台显示的信息与oc describe node命令相同,还可以显示Hawkular Metrics的实际资源使用情况。但是,OCP 3.9的web控制台只显示pod和项目的指标,web控制台不显示节点指标。
要获得节点的实际资源使用情况,并确定节点是否接近其全部硬件或虚拟容量,系统管理员需要使用oc adm top命令。如果需要更详细的信息,系统管理员可以使用标准的Linux命令,比如vmstat和ps。
OpenShift不向集群外部公开Heapster组件。外部应用程序需要访问Heapster必须使用OpenShift master API代理。master API代理确保对内部组件API的访问遵从OpenShift集群身份验证和访问控制策略。
将Hawkular暴露给外部访问涉及到一些安全方面的考虑。如果系统管理员认为使用Heapster和Hawkular api过于复杂,那么Origin和Kubernetes开源项目的上游社区还提供了与Nagios和Zabbix等流行的开源监控工具的集成,或者当前最火热的Prometheus。

1.3 Metrics subsystem大小

OpenShift度量子系统的每个组件都使用自己的dc进行部署,并且独立于其他组件进行伸缩。它们可以计划在OpenShift集群的任何地方运行,但是建议为生产环境中的metrics子系统pod特定保留一些node0。
Cassandra和Hawkular是Java应用程序。Hawkular运行在JBoss EAP 7应用服务器中。Hawkular和Cassandra都利用了大规模的优势,默认值是为中小型OpenShift集群设置的大小。测试环境可能需要更改默认值,以减少内存和CPU资源。
Heapster和Hawkular部署使用标准的OpenShift工具部署size、比例和调度。少量Heapster和Hawkular pods可以管理数百个OpenShift节点和数千个项目的指标。
可以使用oc命令配置Heapster和Hawkular部署。例如增加每个pod请求的副本数量或资源数量,但是推荐的配置参数的方法是修改为安装Metrics的Ansible剧本中的变量。
Cassandra不能使用标准oc命令进行伸缩和配置,因为Cassandra(大多数数据库都是这样)不是无状态云应用程序。Cassandra有严格的存储要求,每个Cassandra pod都有不同的部署配置。必须使用Metrics安装playbook来伸缩和配置Cassandra部署。

1.4 CASSANDRA配置持久存储

Cassandra可以部署为单个pod,使用一个持久卷。但至少需要三个Cassandra pod才能为度量子系统实现高可用性(HA)。每个pod都需要一个独占卷:Cassandra使用“无共享”存储架构。
尽管Cassandra可以使用enptyDir存储进行部署,但这意味着存在永久数据丢失的风险。通常生产环境不推荐使用临时存储(即emptyDir卷类型)。
每个Cassandra卷使用的存储量不仅取决于预期的集群大小(节点和pod的数量),还取决于度量的时间序列的粒度和持续时间。
Metrics安装剧本支持使用静态供应的持久卷或动态卷。无论选择哪种方法,playbook都基于前缀创建持久卷声明,前缀后面附加一个序列号。对于静态供应的持久卷,请确保使用相同的命名约定。

二 METRICS子系统

2.1 部署metrics子系统

OpenShift Metrics子系统由Ansible playbook部署,可以选择使用基本playbook或单独用于Metrics的playbook进行部署。
大多数Metrics子系统配置是使用用于高级安装方法的Inventory文件中的Ansible变量执行的。尽管可以使用-e选项覆盖或自定义某些变量的值,更建议在Inventory中定义metrics变量。如果需要更改度量Metrics配置,可更新Inventory中的变量并重新运行安装剧本。
metrics子系统在许多生产环境中不需要认定配置,可直接通过运行metrics安装剧本使用默认设置安装。
示例:Ansible结合主配置文件和Metrics子系统playbook安装。
Ansible主配置文件如下:
  1 [defaults]
2 remote_user = student
3 inventory = ./inventory
4 log_path = ./ansible.log
5 [privilege_escalation]
6 become = yes
7 become_user = root
8 become_method = sudo
9 Metrics子系统剧本:
10 # ansible-playbook \
11 /usr/share/ansible/openshift-ansible/playbooks
/openshift-metrics/config.yml \
-e openshift_metrics_install_metrics=True
提示:OpenShift metrics剧本由openshift-ansibl -playbooks包提供,该包是作为atom-openshift-utils包的依赖项安装的。
openshift_metrics_install_metrics Ansible变量配置剧本用来部署metrics子系统,playbook为metrics子系统创建dc、service和其他支撑metrics的Kubernetes资源,还可以在用于部署集群的Inventory文件中定义该变量。
metrics子系统安装playbook会在openshift-infra项目中创建所需Kubernetes资源。安装playbook不配置任何节点选择器来限制pod所运行的node。

2.2 卸载metrics子系统

卸载OpenShift metrics子系统的一种方法是手动删除OpenShift-infra项目中的所有Kubernetes资源。通常需要多个oc命令,且容易出错,因为其他OpenShift子系统也被部署到这个项目。
卸载metrics子系统的推荐方法是运行安装剧本,但是将openshift_metrics_install_metrics Ansible变量设置为False,如下面的示例所示,-e选项覆盖库存文件中定义的值。
  1  # ansible-playbook \
2 /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml \
3 -e openshift_metrics_install_metrics=False

2.3 验证metrics子系统

OpenShift metrics子系统playbook完成后,应该创建所有Cassandra、Hawkular和Heapster pod,并可能需要一些时间进行初始化。可能由于Cassandra pod初始化时间过长,会重新启动Hawkular和Heapster pod。
除非另外配置,否则安装程序剧本应该为每个组件创建一个dc,其中包含一个pod,并且openshift-infra项目的oc get pod能显示相应pod。

2.4 部署metrics子系统常见错误

造成部署错误的常见原因通常有:
  • image缺失;
  • metrics所需资源过高,节点无法满足;
  • Cassandra pod所需的持久卷无法满足。

2.5 其他配置

在所有pod准备好并运行之后,需要执行一个特定配置以便于和web对接。如果跳过此步骤,OpenShift web控制台将无法显示项目的metrics图形,尽管底层metrics子系统正在正常工作。
OpenShift web控制台是一个JavaScript应用程序,它直接访问Hawkular API,而不需要经过OpenShift master service。
但由于内部使用TLS访问API,默认情况下,TLS证书不是由受信任的认证机构签署的。因此web浏览器拒绝连接到Hawkular API endpoint。
在OpenShift安装之后,web控制台本身也会出现类似证书不信任的问题。与metrics同样的方式解决,配置浏览器接受TLS证书。为此,在web浏览器中打开Hawkular API欢迎页面,并接受不受信任的TLS证书。
https://hawkular-metrics.<master-wildcard-domain>
主通配符域DNS后缀应该与OpenShift主服务中配置的后缀相同,并用作新路由的默认域。
playbook从Ansible hosts文件中获取主通配符域值,由openshift_master_default_subdomain变量定义。如果更改了OpenShift master service配置,则它们将不匹配。在本例中,为metrics剧本中的openshift_metrics_hawkular_hostname变量提供新值。2.6

2.6 metrics涉及变量

OCP安装和配置文档提供了metrics安装剧本使用的所有可能变量的列表,它们控制着各种配置参数。常见有:
每个组件的pod比例:
  • openshift_metrics_cassandra_replicas
  • openshift_metrics_hawkular_replicas
每个组件对pod的资源请求和限制:
  • openshift_metrics_cassandra_requests_memory
  • openshift_metrics_cassandra_limits_memory
  • openshift_metrics_cassandra_requests_cpu
  • openshift_metrics_cassandra_limits_cpu
对于Hawkular和Heapster,有类似配置:
  • openshift_metrics_hawkular_requests_memory
  • openshift_metrics_heapster_requests_memory
用于duration和resolution参数:
  • openshift_metrics_duration
  • openshift_metrics_resolution
Cassandra pods的持久卷声明属性:
  • openshift_metrics_cassandra_storage_type
  • openshift_metrics_cassandra_pvc_prefix
  • openshift_metrics_cassandra_pvc_size
用于pull metrics子系统容器image的仓库:
  • openshift_metrics_image_prefix
  • openshift_metrics_image_version
其他配置参考:
  • openshift_metrics_heapster_standalone
  • openshift_metrics_hawkular_hostname
示例1:使用自定义配置安装metrics子系统,用于覆盖Inventory中定义的Cassandra配置。
  1 [OSEv3:vars]
2 ...output omitted...
3 openshift_metrics_cassandra_replicas=2
4 openshift_metrics_cassandra_requests_memory=2Gi
5 openshift_metrics_cassandra_pvc_size=50Gi
示例2:使用自定义配置,用于覆盖Cassandra定义的属性。
  1 # ansible-playbook \
2 /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml \
3 -e openshift_metrics_cassandra_replicas=3 \
4 -e openshift_metrics_cassandra_requests_memory=4Gi \
5 -e openshift_metrics_cassandra_pvc_size=25Gi
提示:大多数配置参数都可以使用OpenShift oc命令进行更改,但是推荐的方法是使用更新Inventory中变量值运行metrics安装剧本进行修改。

三 安装metrics子系统

3.1 前置准备

准备完整的OpenShift集群,参考《003.OpenShift网络》2.1。

3.2 本练习准备

  1 [student@workstation ~]$ lab install-metrics setup

3.3 验证image

  1 [student@workstation ~]$ docker-registry-cli registry.lab.example.com \
2 search metrics-cassandra ssl
3 [student@workstation ~]$ docker-registry-cli registry.lab.example.com \
4 search ose-recycler ssl

3.4 验证NFS

  1 [root@services ~]# ll -aZ /exports/metrics/
2 drwxrwxrwx. nfsnobody nfsnobody unconfined_u:object_r:default_t:s0 .
3 drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 ..
4 [root@services ~]# cat /etc/exports.d/openshift-ansible.exports

3.5 创建PV

  1 [student@workstation ~]$ cat /home/student/DO280/labs/install-metrics/metrics-pv.yml
2 apiVersion: v1
3 kind: PersistentVolume
4 metadata:
5 name: metrics
6 spec:
7 capacity:
8 storage: 5Gi #定义capacity.storage容量为5G
9 accessModes:
10 - ReadWriteOnce #定义访问模式
11 nfs:
12 path: /exports/metrics #定义nfs.path
13 server: services.lab.example.com #定义nfs.services
14 persistentVolumeReclaimPolicy: Recycl #定义回收策略
  1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
2 [student@workstation ~]$ oc create -f /home/student/DO280/labs/install-metrics/metrics-pv.yml
3 [student@workstation ~]$ oc get pv
4 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
5 metrics Gi RWO Recycle Available 14s

3.6 规划安装变量

openshift_metrics_image_prefix:指向服务VM上的私有仓库,并添加openshift3/ose-作为映像名称前缀。
openshift_metrics_image_version:要使用的容器image标记,私有仓库为image添加一个v3.9标记。
openshift_metrics_heapster_requests_memory:本环境配置300mb内存。
openshift_metrics_hawkular_requests_memory:本环境配置750mb内存。
openshift_metrics_cassandra_requests_memory:本环境配置750mb内存。
openshift_metrics_cassandra_storage_type:使用pv选择一个持久卷作为存储类型。
openshift_metrics_cassandra_pvc_size:本环境配置5gib容量。
openshift_metrics_cassandra_pvc_prefix:使用metrics作为pvc名称的前缀.
提示:生产环境中建议根据实际规划进行配置,可适当调大配置规格。

3.7 配置安装变量

  1 [student@workstation ~]$ cd /home/student/DO280/labs/install-metrics
2 [student@workstation install-metrics]$ cat metrics-vars.txt
3 # Metrics Variables
4 # Append the variables to the [OSEv3:vars] group
5 openshift_metrics_install_metrics=True
6 openshift_metrics_image_prefix=registry.lab.example.com/openshift3/ose-
7 openshift_metrics_image_version=v3.9
8 openshift_metrics_heapster_requests_memory=300M
9 openshift_metrics_hawkular_requests_memory=750M
10 openshift_metrics_cassandra_requests_memory=750M
11 openshift_metrics_cassandra_storage_type=pv
12 openshift_metrics_cassandra_pvc_size=5Gi
13 openshift_metrics_cassandra_pvc_prefix=metrics
14 [student@workstation install-metrics]$ cat metrics-vars.txt >> inventory
15 [student@workstation install-metrics]$ lab install-metrics grade #本环境使用脚本判断配置

3.8 执行安装

  1 [student@workstation install-metrics]$ ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml

3.9 验证安装

  1 [student@workstation install-metrics]$ oc get pvc -n openshift-infra		#验证持久卷是否成功挂载
2 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
3 metrics-1 Bound metrics 5Gi RWO 5m
4 [student@workstation install-metrics]$ oc get pod -n openshift-infra #验证metric相关pod
5 NAME READY STATUS RESTARTS AGE
6 hawkular-cassandra-1-6k7fr 1/1 Running 0 5m
7 hawkular-metrics-z9v85 1/1 Running 0 5m
8 heapster-mbdcl 1/1 Running 0 5m
9 [student@workstation install-metrics]$ oc get route -n openshift-infra #查看metric route地址
10 NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
11 hawkular-metrics hawkular-metrics.apps.lab.example.com hawkular-metrics <all> reencrypt
12 None
浏览器访问:
https://hawkular-metrics.apps.lab.example.com
提示:浏览器信任SSL证书。

3.10 部署测试应用

  1 [student@workstation ~]$ oc login -u developer -p redhat \
2 https://master.lab.example.com #登录OpenShift
3 [student@workstation ~]$ oc new-project load #创建project
4 [student@workstation ~]$ oc new-app --name=hello \
5 --docker-image=registry.lab.example.com/openshift/hello-openshift #部署应用
6 [student@workstation ~]$ oc scale --replicas=9 dc/hello #扩展应用
7 [student@workstation ~]$ oc get pod -o wide #查看pod
8 NAME READY STATUS RESTARTS AGE IP NODE
9 hello-1-4nvfd 1/1 Running 0 1m 10.129.0.40 node2.lab.example.com
10 hello-1-c9f8t 1/1 Running 0 1m 10.128.0.22 node1.lab.example.com
11 hello-1-dfczg 1/1 Running 0 1m 10.128.0.23 node1.lab.example.com
12 hello-1-dvdx2 1/1 Running 0 1m 10.129.0.36 node2.lab.example.com
13 hello-1-f6rsl 1/1 Running 0 1m 10.128.0.20 node1.lab.example.com
14 hello-1-m2hb4 1/1 Running 0 1m 10.129.0.39 node2.lab.example.com
15 hello-1-r64z9 1/1 Running 0 1m 10.128.0.21 node1.lab.example.com
16 hello-1-tf4l5 1/1 Running 0 1m 10.129.0.37 node2.lab.example.com
17 hello-1-wl6zx 1/1 Running 0 1m 10.129.0.38 node2.lab.example.com
18 [student@workstation ~]$ oc expose svc hello

3.11 压力测试

  1 [student@workstation ~]$ sudo yum -y install httpd-tools
2 [student@workstation ~]$ ab -n 300000 -c 20 http://hello-load.apps.lab.example.com/

3.12 查看资源使用情况

  1 [student@workstation ~]$ oc login -u admin -p redhat
2 [student@workstation ~]$ oc adm top node \
3 --heapster-namespace=openshift-infra \
4 --heapster-scheme=https
5 NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
6 master.lab.example.com 273m 13% 1271Mi 73%
7 node1.lab.example.com 1685m 84% 3130Mi 40%
8 node2.lab.example.com 1037m 51% 477Mi 6%
提示:保持3.11的压测程序,重开终端进行查看。

3.13 获取指标

  1 [student@workstation ~]$ cat ~/DO280/labs/install-metrics/node-metrics.sh	#使用此脚本获取指标
  1 [student@workstation ~]$ ./DO280/labs/install-metrics/node-metrics.sh
浏览器访问:https://master.lab.example.com
查看相关性能监控。

008.OpenShift Metric应用的更多相关文章

  1. 009.OpenShift管理及监控

    一 资源限制 1.1 pod资源限制 pod可以包括资源请求和资源限制: 资源请求 用于调度,并控制pod不能在计算资源少于指定数量的情况下运行.调度程序试图找到一个具有足够计算资源的节点来满足pod ...

  2. OpenShift实战(五):OpenShift容器监控Metrics

    1.创建持久化metric pv卷 [root@master1 pv]# cat metrics.json apiVersion: v1 kind: PersistentVolume metadata ...

  3. 理解OpenShift(3):网络之 SDN

    理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...

  4. openshift pod对外访问网络解析

    openshift封装了k8s,在网络上结合ovs实现了多租户隔离,对外提供服务时报文需要经过ovs的tun0接口.下面就如何通过tun0访问pod(172.30.0.0/16)进行解析(下图来自理解 ...

  5. OpenShift DNS的机制

    为什么不直接用kube-dns? 为什么不直接用kube-dns? 为什么不直接用kube-dns? 感谢各位前辈的专研,在下午有限的时间里把Openshift DNS的机制理了一下.更详细的材料大家 ...

  6. Openshift中Pod的SpringBoot2健康检查

    Openshift中Pod的SpringBoot2应用程序健康检查 1. 准备测试的SpringBoot工程, 需要Java 8 JDK or greater and Maven 3.3.x or g ...

  7. 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练

    在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...

  8. 调戏OpenShift:一个免费能干的云平台

    一.前因后果 以前为了搞微信的公众号,在新浪sae那里申请了一个服务器,一开始还挺好的 ,有免费的云豆送,但是一直运行应用也要消费云豆,搞得云豆也所剩无几了.作为一名屌丝,日常吃土,就单纯想玩一玩微信 ...

  9. redhat openshift 跳转

    网址: https://openshift.redhat.com/ OpenShift免费套餐的限制是:最多15PV/s,有3个512MB内存的应用,月流量在50K以下. 可以绑米,可惜的是,需要代理 ...

随机推荐

  1. 7.SortSet排序集合类型操作

    Sort Set排序集合类型 (1)介绍 和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个权.通过权值可以有序的获取集合中的元素 该Sort Set类型适合 ...

  2. 5.Linux的启动过程和系统指令

    1.Linux的启动过程 作为一台计算机,启动它的第一步是加电自检,也就是给电脑用电然后按电源按钮开机.加电之后的运行步骤:(1)加载bios,然后检查硬盘信息 (2)读取MBR的配置(MBR就是硬盘 ...

  3. 使用 fileupload 组件完成文件的上传应用

    1. 使用 fileupload 组件完成文件的上传应用 commons-dbutils-1.3.jarcommons-fileupload-1.2.1.jar 1). 需求: > 在 uplo ...

  4. 07 . Nginx常用模块及案例

    访问控制 用户访问控制 ngx_http_auth_basic_module 有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问 ...

  5. jchdl进展 - 20180918

    这几天看了下SystemC,发现与jchdl相似的地方,或者jchdl与之相似的地方. 但总体而言: 1. jchdl的模型更简单,更清晰: 2. jchdl还有一些建模需要的工具需要补充,比如: i ...

  6. 【Hadoop】hdfs的秘密,namenode,datanode,yarn,安全模式,fsimage,edits...

    1.bin/hdfs namenode -format ** 注意事项 1.在配置好了配置文件之后,首次启动之前,做初始化操作 2.在后续启动的时候,不需要再初始化 3.初始化的一些影响 一.初始化操 ...

  7. SSM 的 基本原理与面试相关

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.MyBatis 1.Mybatis出现最多的问题是什么? 问题: 在XML配置文件中语句的书写与对象 ...

  8. Java实现 LeetCode 677 键值映射(字典树)

    677. 键值映射 实现一个 MapSum 类里的两个方法,insert 和 sum. 对于方法 insert,你将得到一对(字符串,整数)的键值对.字符串表示键,整数表示值.如果键已经存在,那么原来 ...

  9. Java实现 LeetCode 405 数字转换为十六进制数

    405. 数字转换为十六进制数 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能 ...

  10. Java实现 LeetCode 338 比特位计数

    338. 比特位计数 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1 ...