背景

前面的几篇文章我们从一个简单的 SpringBoot 服务开始,依次将其打包为镜像,推送至私有镜像仓库,安装 Kubernetes 的极简实践环境 minikubeminikube 传递秘钥使用阿里云私有镜像仓库,然后使用 kubectl run 命令启动 Pod ,使用 YAML 描述文件启动 Pod ,使用 Deployment 启动弹性伸缩的 Pod ,最后使用 Service 暴露服务,经过这一系列实践,基本算是入门 Kubernetes 了。

那么,对 Kubernetes 有了基本的认识后我们再稍微了解下 Kubernetes 的资源(Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob;Node、Namespace、Service、Secret、ConfigMap、Ingress、Label)管理。在这篇文章中我们主要涉及:标签选择器 Label ,注解 Annotation 以及命名空间 Namespace 这3种资源。

以我们之前使用的 Podcloud-native 为例,通过命令 kubectl get pod cloud-native -o yaml 获取的 cloud-native 详细信息如下,重点关注: LabelAnnotationNamespace

[root@k8s0 ~]# kubectl get pod cloud-native -o yaml
apiVersion: v1
kind: Pod
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"cloud-native","namespace":"default"},"spec":{"containers":[{"image":"registry.cn-hangzhou.aliyuncs.com/container-repo/docker-hub:0.0.1-SNAPSHOT","name":"cloud-native"}],"imagePullSecrets":[{"name":"aliyunregistry"}]}}creationTimestamp: "2022-08-24T01:26:32Z"name: cloud-nativenamespace: defaultresourceVersion: "82104"uid: da48251e-f036-464d-8676-7b0cf454a7b1
spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/container-repo/docker-hub:0.0.1-SNAPSHOTimagePullPolicy: IfNotPresentname: cloud-nativeresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /var/run/secrets/kubernetes.io/serviceaccountname: kube-api-access-db2knreadOnly: truednsPolicy: ClusterFirstenableServiceLinks: trueimagePullSecrets:- name: aliyunregistrynodeName: minikubepreemptionPolicy: PreemptLowerPrioritypriority: 0restartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}serviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30tolerations:- effect: NoExecutekey: node.kubernetes.io/not-readyoperator: ExiststolerationSeconds: 300- effect: NoExecutekey: node.kubernetes.io/unreachableoperator: ExiststolerationSeconds: 300volumes:- name: kube-api-access-db2knprojected:defaultMode: 420sources:- serviceAccountToken:expirationSeconds: 3607path: token- configMap:items:- key: ca.crtpath: ca.crtname: kube-root-ca.crt- downwardAPI:items:- fieldRef:apiVersion: v1fieldPath: metadata.namespacepath: namespace
status:conditions:- lastProbeTime: nulllastTransitionTime: "2022-08-24T01:26:32Z"status: "True"type: Initialized- lastProbeTime: nulllastTransitionTime: "2022-09-03T12:43:03Z"status: "True"type: Ready- lastProbeTime: nulllastTransitionTime: "2022-09-03T12:43:03Z"status: "True"type: ContainersReady- lastProbeTime: nulllastTransitionTime: "2022-08-24T01:26:32Z"status: "True"type: PodScheduledcontainerStatuses:- containerID: docker://2804198750e70414b7cea29b6904c5e4d5df7ca9c91064c3a3289a87a7ffa5f9image: registry.cn-hangzhou.aliyuncs.com/container-repo/docker-hub:0.0.1-SNAPSHOTimageID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/container-repo/docker-hub@sha256:aa901df7e77dce21461b28d3c4c46241cdc3e0247631541b29eee551f3ee529blastState:terminated:containerID: docker://912e26fa74ef1f3b3cd07e2a6ee21cd7db533e444245964be2c1be9cbea68e2eexitCode: 255finishedAt: "2022-09-03T12:42:37Z"reason: ErrorstartedAt: "2022-09-01T07:37:51Z"name: cloud-nativeready: truerestartCount: 6started: truestate:running:startedAt: "2022-09-03T12:43:02Z"hostIP: 192.168.76.2phase: RunningpodIP: 172.17.0.5podIPs:- ip: 172.17.0.5qosClass: BestEffortstartTime: "2022-08-24T01:26:32Z"

标签选择器 Label

为什么要有标签选择器

其实,一提到标签选择器,我第一时间便想到了 HTMLCSSJavaScriptWeb三剑客 了,因为 HTML 作为一种标记语音,其中充满了各类标签,而 CSSJavaScript 在对标签操作时,第一步便是进行标签选择。

此外,我们做物联网平台开发时,为了方便对设备的管理,我们会对设备进行分组,同样也是通过不同的标签来实现,说白了,标签无非就是为了进行批量操作而进行的一个分组、归类手段。那么在容器化、微服务盛行的今天, Kubernetes 作为一种容器编排工具,面临的服务实例动辄成百上千,需要一种手段通过一次操作对属于某个组的所有 Pod 进行操作,而不必单独为每个 Pod 执行操作。在 Kubernetes 的世界中,通过标签来组织 Pod 和所有其他 Kubernetes 对象。

显示标签

# 获取所有Pod
[root@k8s0 ~]# kubectl get po
NAME                              READY   STATUS    RESTARTS         AGE
cloud-native                      1/1     Running   7 (4m32s ago)    12d
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (4m32s ago)    9d
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (4m32s ago)    9d
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (4m32s ago)   42d# 获取所有Pod并显示标签
[root@k8s0 ~]# kubectl get po --show-labels
NAME                              READY   STATUS    RESTARTS         AGE   LABELS
cloud-native                      1/1     Running   7 (4m58s ago)    12d   <none>
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (4m58s ago)    9d    app=cloud-native,pod-template-hash=7bc75f4c94
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (4m58s ago)    9d    app=cloud-native,pod-template-hash=7bc75f4c94
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (4m58s ago)   42d   app=hello-minikube,pod-template-hash=58647b77b8# 获取所有Pod并分列显示指定标签
[root@k8s0 ~]# kubectl get po -L app,pod-template-hash
NAME                              READY   STATUS    RESTARTS         AGE   APP              POD-TEMPLATE-HASH
cloud-native                      1/1     Running   7 (5m56s ago)    12d
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (5m56s ago)    9d    cloud-native     7bc75f4c94
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (5m56s ago)    9d    cloud-native     7bc75f4c94
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (5m56s ago)   42d   hello-minikube   58647b77b8

添加/修改标签

# 为cloud-native这个Pod设置标签:app=cloud-native-pod
[root@k8s0 ~]# kubectl label po cloud-native app=cloud-native-pod
pod/cloud-native labeled# 查看新增的标签信息
[root@k8s0 ~]# kubectl get po -L app,pod-template-hash
NAME                              READY   STATUS    RESTARTS         AGE   APP                POD-TEMPLATE-HASH
cloud-native                      1/1     Running   7 (3h11m ago)    12d   cloud-native-pod
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (3h11m ago)    9d    cloud-native       7bc75f4c94
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (3h11m ago)    9d    cloud-native       7bc75f4c94
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (3h11m ago)   43d   hello-minikube     58647b77b8# 修改标签值,报错了
[root@k8s0 ~]# kubectl label po cloud-native app=cloud-native-pod1
error: 'app' already has a value (cloud-native-pod), and --overwrite is false# 修改标签值,需附加--overwrite参数
[root@k8s0 ~]# kubectl label po cloud-native app=cloud-native-pod-label --overwrite
pod/cloud-native labeled# 查看修改后的标签信息
[root@k8s0 ~]# kubectl get po -L app,pod-template-hash
NAME                              READY   STATUS    RESTARTS         AGE   APP                      POD-TEMPLATE-HASH
cloud-native                      1/1     Running   7 (3h12m ago)    12d   cloud-native-pod-label
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (3h12m ago)    9d    cloud-native             7bc75f4c94
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (3h12m ago)    9d    cloud-native             7bc75f4c94
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (3h12m ago)   43d   hello-minikube           58647b77b8

标签过滤

重头戏。就像数据库的 CRUD 操作,增加(Create)、更新(Update)和删除(Delete)这三个操作比较简单,检索(Retrieve)操作是核心。 Kubernetes 的标签管理操作中新增、修改、删除也很简单,关键在查询过滤标签:标签选择器。

# 标签过滤:单个条件,获取所有带有app标签且标签值为cloud-native的Pod
[root@k8s0 ~]# kubectl get po -l app=cloud-native
NAME                            READY   STATUS    RESTARTS        AGE
cloud-native-7bc75f4c94-47zg7   1/1     Running   6 (3h19m ago)   9d
cloud-native-7bc75f4c94-c2php   1/1     Running   6 (3h19m ago)   9d# 标签过滤:单个条件,获取所有带有app标签的Pod
[root@k8s0 ~]# kubectl get po -l app
NAME                              READY   STATUS    RESTARTS         AGE
cloud-native                      1/1     Running   7 (3h19m ago)    12d
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (3h19m ago)    9d
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (3h19m ago)    9d
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (3h19m ago)   43d# 标签过滤:取反操作,获取所有不包含pod-template-hash标签的Pod
[root@k8s0 ~]# kubectl get po -l '!pod-template-hash'
NAME           READY   STATUS    RESTARTS        AGE
cloud-native   1/1     Running   7 (3h20m ago)   12d# 标签过滤:in操作,获取所有app标签为cloud-native或者hello-minikube的Pod
[root@k8s0 ~]# kubectl get po -l 'app in (cloud-native, hello-minikube)'
NAME                              READY   STATUS    RESTARTS         AGE
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (3h26m ago)    9d
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (3h26m ago)    9d
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (3h26m ago)   43d# 标签过滤:notin操作,获取所有app标签不为cloud-native或者hello-minikube的Pod
[root@k8s0 ~]# kubectl get po -l 'app notin (cloud-native, hello-minikube)'
NAME           READY   STATUS    RESTARTS        AGE
cloud-native   1/1     Running   7 (3h27m ago)   12d# 标签过滤:多个条件同时满足,获取所有app标签为cloud-native且pod-template-hash标签为7bc75f4c94的Pod
[root@k8s0 ~]# kubectl get po -l 'app=cloud-native, pod-template-hash=7bc75f4c94'
NAME                            READY   STATUS    RESTARTS        AGE
cloud-native-7bc75f4c94-47zg7   1/1     Running   6 (3h29m ago)   9d
cloud-native-7bc75f4c94-c2php   1/1     Running   6 (3h29m ago)   9d

删除标签

下面我们先加一个 gpu=true 的标签,然后删除。

# 添加一个gpu=true的标签
[root@k8s0 ~]# kubectl label po cloud-native gpu=true
pod/cloud-native labeled# 查看新增的标签信息
[root@k8s0 ~]# kubectl get po -L app,gpu
NAME                              READY   STATUS    RESTARTS         AGE   APP                      GPU
cloud-native                      1/1     Running   7 (3h39m ago)    12d   cloud-native-pod-label   true
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (3h39m ago)    9d    cloud-native
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (3h39m ago)    9d    cloud-native
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (3h39m ago)   43d   hello-minikube           # 标签过滤:查看新增的标签信息
[root@k8s0 ~]# kubectl get po -l gpu=true
NAME           READY   STATUS    RESTARTS        AGE
cloud-native   1/1     Running   7 (3h45m ago)   12d# 删除标签(注意关键在于标签后面的-)
[root@k8s0 ~]# kubectl label po cloud-native gpu-
pod/cloud-native unlabeled# 验证删除标签操作
[root@k8s0 ~]# kubectl get po -L app,gpu
NAME                              READY   STATUS    RESTARTS         AGE   APP                      GPU
cloud-native                      1/1     Running   7 (3h52m ago)    12d   cloud-native-pod-label
cloud-native-7bc75f4c94-47zg7     1/1     Running   6 (3h52m ago)    9d    cloud-native
cloud-native-7bc75f4c94-c2php     1/1     Running   6 (3h52m ago)    9d    cloud-native
hello-minikube-58647b77b8-srpbq   1/1     Running   13 (3h52m ago)   43d   hello-minikube

为node添加标签

默认情况下,我们创建的 Pod 是随机地调度到工作节点上的。这正是在 Kubernetes 集群中工作的正确方式。由于 Kubernetes 将集群中的所有节点抽象为一个整体的部署平台,因此对于 Pod 实际调度到哪个节点而言是无关紧要的。然而,有时候我们需要对 Pod 调度到哪个节点上有发言权,eg:在用 Pytorch 做深度学习模型训练时,我们需要将执行 GPU 密集型运算的 Pod 调度到实际硬件支持 GPU 加速的节点上。

  • 调度到指定节点
[root@k8s0 ~]# kubectl label node minikube gpu=true
node/minikube labeled
[root@k8s0 ~]# kubectl get nodes -l gpu=true
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   43d   v1.23.1# 在YAML描述文件中配置,
spec:nodeSelector:gpu: "true"
  • 节点标签

实际上,每个节点都有一个唯一标签,其中键为 kubernetes.io/hostname ,值为该节点的实际主机名

# 查看node的详细信息
[root@k8s0 ~]# kubectl get nodes -o wide
NAME       STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION           CONTAINER-RUNTIME
minikube   Ready    control-plane,master   43d   v1.23.1   192.168.76.2   <none>        Ubuntu 20.04.4 LTS   3.10.0-1127.el7.x86_64   docker://20.10.17# 查看node的标签
[root@k8s0 ~]# kubectl get nodes --show-labels
NAME       STATUS   ROLES                  AGE   VERSION   LABELS
minikube   Ready    control-plane,master   43d   v1.23.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gpu=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=minikube,kubernetes.io/os=linux,minikube.k8s.io/commit=f4b412861bb746be73053c9f6d2895f12cf78565,minikube.k8s.io/name=minikube,minikube.k8s.io/primary=true,minikube.k8s.io/updated_at=2022_07_23T23_06_42_0700,minikube.k8s.io/version=v1.26.0,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=

Annotation注解

为什么需要注解

使用注解可以为每个 Pod 或其他 API 对象添加说明,以便每个使用该集群的入都可以快速查找有关每个单独对象的信息。例如,指定创建对象的人员姓名的注解可以使在集群中工作的人员之间的协作更加便利。

添加注解

从一开始的 kubectl get pod cloud-native -o yaml 信息中可以看到 Kubernetes 已经自动添加了一些 Annotations 信息,通过 kubectl annotate 命令可以添加/修改注解信息。

[root@k8s0 ~]# kubectl annotate pod cloud-native heartsuit.com/author="Heartsuit"
pod/cloud-native annotated

查看注解

可以使用 kubectl describe 命令查看刚刚添加的注解: Annotations

[root@k8s0 ~]# kubectl describe pod cloud-native
Name:         cloud-native
Namespace:    default
Priority:     0
Node:         minikube/192.168.76.2
Start Time:   Wed, 24 Aug 2022 09:26:32 +0800
Labels:       app=cloud-native-pod-label
Annotations:  heartsuit.com/author: Heartsuit
Status:       Running
IP:           172.17.0.6
IPs:IP:  172.17.0.6
Containers:cloud-native:Container ID:   docker://c7ccba0903247af3588514420c10252824e2e19ed3ef99b07dbdb20b49c16be7Image:          registry.cn-hangzhou.aliyuncs.com/container-repo/docker-hub:0.0.1-SNAPSHOTImage ID:       docker-pullable://registry.cn-hangzhou.aliyuncs.com/container-repo/docker-hub@sha256:aa901df7e77dce21461b28d3c4c46241cdc3e0247631541b29eee551f3ee529bPort:           <none>Host Port:      <none>State:          RunningStarted:      Mon, 05 Sep 2022 11:40:01 +0800Last State:     TerminatedReason:       ErrorExit Code:    255Started:      Sat, 03 Sep 2022 20:43:02 +0800Finished:     Mon, 05 Sep 2022 11:39:35 +0800Ready:          TrueRestart Count:  7Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-db2kn (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True
Volumes:kube-api-access-db2kn:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:                      <none>

NameSpace

就像我们在 Java 中使用 package 一样, KubernetesNamespace 也是为了对资源进行分组与隔离,而且可以将对象分割成完全独立且不重叠的组(显然,这一点与前面的标签进行分组有区别啦。前面的 Lable 标签是为了方便进行批量操作,而这里的 Namespace 命名空间则更多的是为了资源隔离)。

获取所有命名空间

如果我们不指定命名空间,则默认的资源都在 default 命名空间下。此外,我们可以看到 Kubernetes 默认还有其他自带的系统命名空间: kube-node-lease , kube-public , kube-system ;还有我们之前运行的 Dashboard 则在 kubernetes-dashboard 命名空间。

[root@k8s0 ~]# kubectl get ns
NAME                   STATUS   AGE
default                Active   43d
kube-node-lease        Active   43d
kube-public            Active   43d
kube-system            Active   43d
kubernetes-dashboard   Active   43d

查看kube-system命名空间下的所有pod

以下是 Kubernetes 本身运行的一些 Pod 组件,在 kube-system 命名空间下。

[root@k8s0 ~]# kubectl get po --namespace kube-system
NAME                               READY   STATUS    RESTARTS         AGE
coredns-64897985d-rcrjq            1/1     Running   14 (4h17m ago)   43d
etcd-minikube                      1/1     Running   14 (4h17m ago)   43d
kube-apiserver-minikube            1/1     Running   14 (4h17m ago)   43d
kube-controller-manager-minikube   1/1     Running   14 (4h17m ago)   43d
kube-proxy-6ffnk                   1/1     Running   14 (4h17m ago)   43d
kube-scheduler-minikube            1/1     Running   14 (4h17m ago)   43d
storage-provisioner                1/1     Running   29 (4h16m ago)   43d

Note: 关于简写,在 Kubernetes 中通常会用到以下简写。

namespaces ns
nodes no
pods po
services svc
deployments deploy
replicationcontrollers rc
replicasets rs
configmaps cm
endpoints ep
events ev
cronjobs cj
persistentvolumeclaims pvc
persistentvolumes pv

If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

云原生之容器编排实践-Kubernetes资源管理:标签选择器,注解以及命名空间相关推荐

  1. 云原生之容器编排实践-在CentOS7上安装minikube

    背景 前面做了一些基础的铺垫后,终于进入正题了. 作为初学者,为避免在裸金属主机上搭建 Kubernetes 集群的复杂度,以及使用云服务商提供的容器编排服务的一脸懵逼等打击信心的深坑,建议使用 mi ...

  2. 云原生之容器安全实践

    概述 云原生(Cloud Native)是一套技术体系和方法论,它由2个词组成,云(Cloud)和原生(Native).云(Cloud)表示应用程序位于云中,而不是传统的数据中心:原生(Native) ...

  3. 【直播回看】「EDGE X Kubernetes · 云原生在边缘的实践与应用」

    简介:6 月 26 日(本周六)下午 13:00-18:00 ,由阿里云联合 VMware.Intel 举办的「KubeMeet|EDGE X Kubernetes」专场沙龙将在杭州举办,12 位来自 ...

  4. EDGE X Kubernetes Meetup·杭州站:云原生在边缘的实践与应用

    简介:在 5G.IoT.AI 等新技术的高速发展下,企业正在积极探索如何更好地利用新技术创新应用,拓展业务边界.边缘云原生正在越来越被广泛地应用于汽车.农业.能源.交通等各行各业.与云原生模式的结合, ...

  5. 容器编排技术 -- Kubernetes入门概述

    容器编排技术 -- Kubernetes入门概述 简介 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powe ...

  6. 【大数据云原生系列】大数据系统云原生渐进式演进最佳实践

    1.引言 随着云原生概念的兴起,越来越多的企业投身于云原生转型的浪潮,以解决传统应用面临的弹性能力不足.资源利用率较低.迭代周期较长等问题.通过云原生技术(如容器,不可变基础设施和声明式API等),使 ...

  7. 快进键启动,一文带你了解云原生时代容器安全

    简介: 分享阿里云容器安全的治理能力与经验,致力保护生产环境安全. 都说国内需求离容器化还远,更谈不上关注安全,喊的热闹而落地困难.但总得有些声音面向未来向前看. 在2020年Forrester Ia ...

  8. 私有化场景下大规模云原生应用的交付实践

    本文根据作者在 CSDN 云原生 Meetup 深圳站的演讲内容整理,分享云原生趋势下网易数帆在私有化场景下大规模应用的交付实践,包括在实践过程中遇到的问题,如何实现标准化.高效率且高质量的交付方案, ...

  9. 对话绿盟科技丨云原生安全研究与实践

    云原生环境中,应用由传统的单体架构转向微服务架构,云计算模式也相应的从基础设施即服务(Infrastructure as a Service,IaaS)转向为容器即服务(Container as a ...

最新文章

  1. linux下使用NetBeans调试libevent库
  2. 难搞的偏向锁终于要被Java移除了
  3. corosync+pacemaker+crmsh的高可用web集群的实现
  4. 堆叠与M-LAG,为什么要从堆叠切换为M-LAG?
  5. jvm性能调优实战 -51修复栈内存区域内存溢出问题 StackOverFlow
  6. kibana显示JAVA,elasticsearch kibana简单查询讲解
  7. ON DUPLICATE KEY UPDATE 附带更新条件
  8. Spark修炼之道(高级篇)——Spark源码阅读:第六节 Task提交
  9. CompletableFuture详解~CompletionStage
  10. 查出数字字符字段中非数字字符的记录
  11. html5 学习_5分钟内学习HTML
  12. 修改eclipse中java和xml页面的字体的样式
  13. JavaScript权威设计--JavaScript表达式与运算符(简要学习笔记五)
  14. 大数据 ---(4)大数据驱动的金融业务创新(用户画像-数据架构-标签建模)
  15. 剑指offer(C++)-JZ35:复杂链表的复制(数据结构-链表)
  16. 二分法之旋转有序数组
  17. 360影视php采集接口,基于360影视采集实例
  18. php 时间转换yyyymmdd,YYYYMMDD字符串日期转换为日期时间值
  19. Android开发关于调用摄像头黑屏没反应的问题
  20. clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理

热门文章

  1. 〈Android 群英传-神兵利器〉第7章一个的寂寞与一群人的狂欢
  2. mtk配置flash
  3. windows聚焦照片_如何拍摄始终聚焦的照片
  4. unzip和zip指令的使用方法
  5. 项目经理杂事多,该怎么有效的安排时间
  6. mysql查询总成绩高于240_Egret应用开发实践(02) MVC 模块化 - SegmentFault 思否
  7. Splay(dispatching)
  8. Supervisor启动java服务(jar)
  9. 计算机内存条属于组合电路吗,寄存器和内存条的基础实现电路方案
  10. 郑豪8.6非农数据提前布局,黄金是延续跌势还是多头反击?美盘操作建议