Crossplane - 比 Terraform 更先进的云基础架构管理平台?

?️URL: http://crossplane.io/

?Description:

将云基础架构和服务组成自定义平台 API

简介

在 11 月的 KCD 上海现场,听了一场阿里云的工程师关于他们自己的多云基础架构管理工具的介绍,前边的引言部分有介绍到 Terraform,还有另一款竞品就是 Crossplane,而且表示 Crossplane 在通用性 API 等方面做得比 Terraform 更好,阿里云的也参考了其架构和实现。就让我很感兴趣,同时在 2019 年使用 OpenShift 4 的时候也在其 OperatorHub 里有发现 Crossplane,当时觉得其 Logo 很有辨识度便一直有印象。所以这次抽了个周末专门体验了一下,看它是否当得起这个标题。开始~

Crossplane(跨平面,意思是可以跨越多个 公有云平台) 是一个开源的 Kubernetes 插件,它允许平台团队组装来自多个供应商的基础设施,并向应用程序团队公开更高级别的自助服务 api,而不需要编写任何代码。

Crossplane Overview

愿景

为更开放的云提供动力

Crossplane 通用 API 说明

构建 Crossplane 是为了帮助组织构建他们的云,就像云供应商构建他们的云一样——通过一个控制平面。Crossplane 是一个 CNCF 项目,它扩展了 Kubernetes API 来管理和组合基础设施。操作人员可以在 Crossplane 生成的自定义 API 线后封装策略、权限和其他防护措施,而应用程序开发人员无需成为基础设施专家就可以从 API 自助服务。

对标产品

Terraform

价值

以下是它的价值所在:

使用 kubectl 提供和管理云基础设施和服务

Crossplane 基础设施示意

Crossplane 扩展您的 Kubernetes 集群,为您提供任何基础设施或托管服务的 crd。将这些细粒度资源组合成更高级别的抽象,这些抽象可以使用您喜欢的工具,也可以和已经集成到集群中的现有流程进行版本管理、管理、部署和使用。

在 Crossplane 中,每个人都有自己的基础设施

Crossplane 支持公有云供应商

Crossplane 支持来自所有主要云提供商的基础设施,社区也在不断开发新的提供商。目前支持以下主流公有云供应商:

为你的应用程序提供简化的基础架构抽象

Crossplane 对资源的简化抽象

在 CRDs Crossplane 提供的基础上构建您自己的内部基础架构抽象。您的自定义 api 可以包含策略护栏,隐藏基础设施的复杂性,并确保应用程序可以安全地使用它。

通用云 API

Crossplane 制作标准通用 API

Crossplane 在不同的供应商、资源和抽象集合中提供一致的 API。跨平面资源模型(XRM, Crossplane Resource Model)以一种武断的方式扩展了 Kubernetes 资源模型(KRM),不管是哪个供应商或供应商构建了它们都能产生了一种统一的资源管理体验。

Run Crossplane anywhere

标准 API

无论您是在 EKS、AKS、GKE、ACK、PKS 中使用单个 Kubernetes 集群,还是在 Rancher 或 Anthos 等多集群管理器中使用,Crossplane 都能很好地集成它们。Crossplane 可以安装到任何现有的集群中,跨基础设施和服务提供商公开 crd 和标准 API,使供应和管理变得轻而易举。

为什么要使用 Crossplane 来管理应用程序和基础设施?

? 声明式基础设施配置

Crossplane 将 kubernetes 风格的声明式和 api 驱动的配置和管理引入到任何基础设施、本地和云中。通过这种方法,通过 Crossplane 管理的基础设施可以通过kubectl 进行访问,可以使用 YAML 进行配置,并且可以立即自修复。

? 统一应用程序和基础设施的配置和部署

Crossplane 允许应用程序和基础设施配置在相同的 Kubernetes 集群上共存,降低了工具链和部署管道的复杂性。

⚓️ 基础设施配置和设置的单一真实来源

Crossplane 集成了 CI/CD 管道,因此应用程序基础设施配置存储在单个控制集群中。团队可以使用已经在使用的 GitOps 最佳实践创建、跟踪和批准变更。

? 使用协调控制器自动化操作任务

资源控制器负责资源的整个生命周期。此资源负责供应、运行状况、扩展、故障转移,并积极响应与所需配置不一致的外部更改。

➕ 具有高水平的可扩展性

Crossplane 利用了广泛接受的 Kubernetes 模式,通过添加自己的 api 和控制器可以轻松地扩展它。通过将策略、配额和权限打包到自定义基础设施定义中来提高灵活性和安全性。

⇅ 强烈的关注点分离

开发人员可以定义工作负载,而不必担心实现细节、环境约束或策略。管理员可以定义环境细节和策略。支持更高程度的可重用性并降低复杂性。

Crossplane vs Terraform

Crossplane 经常被比作 HashiCorp 的 Terraform。这两个项目有相似之处:

  • 两者都允许工程师将其基础设施建模为声明性配置

  • 两者都支持使用提供商插件管理大量不同的基础设施

  • 两者都是拥有强大社区的开源工具

关键的区别是 Crossplane 是一个控制平面,而 Terraform 是一个命令行工具 —— 一个控制平面的界面。下面触及了企业在扩展 Terraform 时经常面临的几个痛点,并强调了 Crossplane 如何解决这些问题。

协作

企业通常通过运维团队采用 Terraform。将基础设施表示为声明性配置,可以让运维团队从软件工程的最佳实践中获益 —— 将配置保存在修订控制中,以便在必要时对更改进行同行评审和恢复。

当更多的工程师需要合作管理他们组织的基础设施时,Terraform 就会崩溃。Terraform 依赖于一个单一的状态文件将所需的配置映射到实际运行的基础设施。在应用配置时,这个状态文件上必须有一个锁,而应用 Terraform 配置是一个阻塞过程,可能需要几分钟才能完成。在此期间,没有其他实体 —— 没有其他工程师—— 可以对配置进行更改。类似地,Terraform 使用一个单一的 apply 进程 —— 在一个配置中,没有推荐的方法只修改一个基础设施。如果您使用相同的配置来管理缓存和数据库,您必须始终同时更新它们 — 您不能只更新缓存。

Terraform 建议将单个配置分解为越来越细粒度的配置。因此,虽然运维团队可能从代表「产品(production)」的 Terraform 配置开始,但他们被鼓励将其纳入「产品账单(production billing)」和「产品认证(production auth)」等范围配置中。这是很难做到的,所以它可能需要大量的重构时间,并经常导致一个复杂的网格状的 Terraform 配置耦合其输入和输出。

跨平面资源模型(Crossplane Resource Model, XRM)促进了松散耦合和最终的一致性。在 Crossplane 中,基础设施的每个部分都是支持创建、读取、更新和删除操作的 API 端点。Crossplane 不需要计算依赖关系图来进行更改,因此即使使用 Crossplane 管理整个生产环境,也可以轻松地对单个数据库进行操作。

自服务

现代组织正从基础设施的集中管理发展到自助服务模型,在这种模型中,运维团队(通常称为平台团队)定义了他们支持的开发团队可以按需使用的基础设施抽象。Terraform 已经通过使用模块(modules)来支持这个模型。模块与软件库没有什么不同。与 Crossplane 一样,Terraform 资源也是外部 API 资源的高保真表示。模块在这些资源的更广泛的配置之上提供了一个简化的抽象 —— 例如,RDS 模块将 8 个不同的 Terraform 资源抽象为一个单一的「RDS实例」概念。

将应用团队视为 Terraform 配置「库」的消费者,意味着他们要受制于 Terraform 的协作约束。应用程序开发人员被邀请在他们组织的基础设施上进行协作,就好像他们是一个关注范围较窄的运维团队。平台团队邀请应用程序开发团队共享他们的工作流,而不是向他们提供服务。这意味着应用团队必须学习一种新的、特殊用途的工具集和语言——Terraform 和 HashiCorp 配置语言(HCL)。它还提高了应用程序开发人员的配置抽象级别,而不提高访问控制抽象级别。虽然平台团队可以发布一个模块,允许应用程序团队管理「RDS实例」,但访问控制仍然在云提供商 API 级别,因此围绕着「数据库子网组」和「数据库参数组」展开。

而 Crossplane 相当于一个 Terraform 模块的是一个复合资源 —— 一个 XR。每个 XR 都作为 API 端点公开。平台团队可以定义和记录每个 XR (每个 API)的OpenAPI 模式,并在 API 级别实施基于角色的访问控制(RBAC)。这意味着,如果一个平台团队决定框架抽象它们并提供给他们的开发团队「AcmeCo PostgreSQL数据库」,他们可以授予 RBAC 访问创建、读取、更新或删除一个 AcmeCo PostgreSQL 数据库,而不必管理对各种潜在的云概念,比如 RDS 实例的访问或子网组。因为 Crossplane 建立在经过实战历练的 Kubernetes RBAC 系统上,平台团队可以轻松地在一个控制平面内支持多个应用程序开发团队。每个团队只能被授予访问他们需要的抽象的权限 —— 一些团队可能只能管理存储桶,而另一些团队可能被允许管理缓存和数据库。

在 Crossplane 中,自助服务的规模甚至更大,因为任何一个 XR 都可以提供多种服务。Crossplane 将 XR 的输入和输出(Kubernetes的说法是它的 spec 和 status )与它的实现解耦,后者由 Composition 来描述。如果应用程序开发人员被授予创建 AcmeCo PostgreSQL 数据库的权限,他们可以很容易地从任何服务类中选择——任何组合——他们的平台团队已经声明与上述数据库兼容。这些服务类可以代表生产、staging 和开发; AWS、Azure和GCP; 快和慢; 或两者的任何组合。

集成和自动化

Terraform 有很多 api,但它不提供自己的 api。这使得许多团队将他们的 Terraform 配置提交到版本控制(git)中,并将 Terraform 作为 CI/CD 管道的一部分执行。相对于一个团队在他们的笔记本电脑上运行 Terraform 来说,这是一个进步,但它暴露了组织在试图扩大 Terraform 的使用时面临的一个关键问题。Terraform 是一个命令行工具 —— 不是一个控制平面。因为它是一个短暂的、一次性的过程,所以在调用它时,它只会尝试将所需的配置与实际的基础设施协调起来。无论是从 CI/CD 管道运行还是从笔记本电脑运行,Terraform 通常只在工程师希望基础设施需要更新时才会被调用。

Terraform 的保守的、「按需」的方法与实际的基础设施状态相协调,可能会导致新的死锁。回想一下,应用 Terraform 配置的过程是「要么全部成功,要么全部失败」的——如果你在相同的配置中描述你的缓存和数据库,你必须总是同时更新它们。这意味着,如果你的组织中有人绕过 Terraform,下一个触发 Terraform 运行的人将面临一个令人惊讶的计划,因为他试图撤销改变。例如,考虑这样一个场景: 工程师在半夜被呼叫来处理一个事件,通过 AWS 控制台对生产缓存配置进行了一些快速编辑,却忘记在 Terraform 中反映这些更改。基础设施漂移如此之大,以至于应用 Terraform 配置成为一个有风险的、令人生畏的命题,这并非前所未闻。

而另一方面,Crossplane 是由一系列长期运行的控制循环所组成。它不断地观察和纠正组织的基础设施,以匹配其期望的配置,无论是否期望更改。这阻碍了团队绕过 Crossplane。当 Crossplane 被要求管理一段基础设施时,在该基础设施之外所做的任何更改都将自动且持久地恢复。

Terraform 简化技术栈

组织在使用 Terraform 时面临的一个持续的问题是它没有提供 API。与 Terraform 集成是一个挑战,因为它是使用领域特定语言(DSL,Domain Specific Language) ——(HCL) 配置的,并通过调用命令行工具来调用。Crossplane 公开了 REST API —— 自动化的通用语言。无论团队主要编写 shell 脚本、主要编写 Python,还是主要编写 Erlang common pattern 都可以调用 REST API。

Crossplane 简化技术栈

Crossplane 不公开任何旧的 REST API。在 Kubernetes API 上构建意味着团队可以使用 kubectl 这样的工具来编排他们所有的基础设施 —— 云或者其他。他们使用相同的工具来编排他们的容器化应用程序。Crossplane 甚至可以将应用程序需要连接到基础设施的细节作为 Kubernetes Secret 公开,以简化集成。它可以与ArgoCD、Gatekeeper 或 Velero 等项目搭配使用,以启用 GitOps、高级策略和备份。需要定制的自动化? 构建自己的 Kubernetes Operator,来与 Crossplane 集成。

两者一起?

Crossplane 和 Terraform 都可以协调一个组织的基础设施。两者之间有相似之处,但每个项目的编排方法不同。Terraform 提供了一个命令行接口来控制平面 api,而 Crossplane 本身就是一个控制平面,可以用来在其他控制平面上构建抽象。因为 Crossplane 让平台团队能够提供自己的控制平面,所以它避免了平台团队在缩放 Terraform 时所面临的许多挑战。

包含 Terraform 的 Crossplane 技术栈

精明的读者可能会注意到,这两个项目可以相互补充——Terraform 是一个控制平面的接口,它的 Kubernetes 提供商允许编排 Kubernetes 控制平面! 这意味着可以将 Terraform 与 Crossplane 配对,例如,如果您的组织更喜欢 HCL 而不是 YAML,那么您的平台团队就可以使用 Terraform 来定义 xr 和 composition,对于您的应用团队来说,可以使用 Terraform 来规划并应用 Crossplane 所需状态的更改!

我们认为,对于平台团队来说,Crossplane 是一种很好的方式,可以帮助他们支持的开发人员自助服务他们的基础设施需求。

安装配置

希望获得更多灵活性的用户可以将 Crossplane 安装到自己的 Kubernetes 集群中。

Crossplane 将使用定期发布的 Helm Chart 安装。Helm 图表包含部署和配置 Crossplane 所需的所有自定义资源和控制器。

将 Crossplane 安装到现有的 Kubernetes 集群中需要更多的设置,但是可以为需要它的用户提供更多的灵活性。

前提

  • Kubernetes 集群
  • Helm 3

安装 Crossplane

kubectl create namespace crossplane-system

helm repo add crossplane-master http://charts.crossplane.io/master/
helm repo update
helm search repo crossplane-master --devel

helm install crossplane --namespace crossplane-system crossplane-master/crossplane \
  --devel --version <version>

检查 Crossplane 状态

helm list -n crossplane-system

kubectl get all -n crossplane-system

安装 Crossplane CLI

Crossplane CLI 扩展了 kubectl 的功能,可以构建、推送和安装 Crossplane 包:

curl -sL http://raw.githubusercontent.com/crossplane/crossplane/release-1.5/install.sh | CHANNEL=master sh

选择一个入门配置

Crossplane 超越了简单地将基础设施原语建模为自定义资源 —— 它使您能够使用您选择的模式定义新的自定义资源。我们称之为“复合资源”(XRs, composite resources)。复合资源组合托管资源 —— Kubernetes 自定义资源,提供基础设施原语的高保真表示,如 SQL 实例或防火墙规则.

我们使用两个特殊的 Crossplane 资源来定义和配置这些新的自定义资源:

  • 一个是 CompositeResourceDefinition (XRD) 它定义了一种新的复合资源,包括它的 schema 。XRD 可以选择性地提供一项声明(XRC)。
  • Composition 指定复合资源将由哪些资源组成,以及应该如何配置它们。您可以为每个复合资源创建多个 Composition 选项。

XRD 和 Composition 可以打包并作为 configuration 安装。Configuration是一个组合配置 package,可以通过创建声明性配置资源或使用 kubectl crossplane install configuration 轻松地安装到 Crossplane。

在下面的示例中,我们将安装一个配置,该配置定义一个新的 XPostgreSQLInstance XR 和一个接受单个 storageGB 参数的 PostgreSQLInstance XRC,并创建一个连接 Secret,其中包含用户名、密码和端点的密钥。每个提供程序都有一个 Configuration,它可以满足 PostgreSQLInstance。让我们开始吧!

安装 Configuration Package

如果您想了解这个配置包的内容以及在安装之前如何构造它,请跳到创建 Configuration部分。

kubectl crossplane install configuration registry.upbound.io/xp/getting-started-with-aws:v1.5.1

等到所有的 package 都变得健康:

watch kubectl get pkg

获取AWS帐户密钥文件

使用 AWS 帐号管理 RDS 数据库:

AWS_PROFILE=default && echo -e "[default]\naws_access_key_id = $(aws configure get aws_access_key_id --profile $AWS_PROFILE)\naws_secret_access_key = $(aws configure get aws_secret_access_key --profile $AWS_PROFILE)" > creds.conf

创建一个 云提供商 Secret

kubectl create secret generic aws-creds -n crossplane-system --from-file=creds=./creds.conf

配置云提供商

我们将创建以下 ProviderConfig 对象来为 AWS Provider 配置凭证:

apiVersion: aws.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds
      key: creds
kubectl apply -f http://raw.githubusercontent.com/crossplane/crossplane/release-1.5/docs/snippets/configure/aws/providerconfig.yaml

现在您已经配置了支持 PostgreSQLInstance 的 Crossplane,现在可以提供基础设施了。

提供基础设施

组合资源(XRs,Composite resources) 总是在集群范围内 — 它们存在于任何名称空间之外。这允许 XR 表示可能来自几个不同 namespace 的基础设施。对于VPC 网络来说,这通常是正确的 —— 基础设施管理员可能希望定义一个 VPC 网络 XR 和一个 SQL 实例 XR,只有后者可能由应用程序操作员管理。应用程序操作员只能使用其团队的 namespace,但是他们的 SQL 实例都应该连接到基础架构操作员管理的 VPC 网络。Crossplane 允许基础设施操作人员向其应用程序操作人员提供复合资源声明(XRC,composite resource claim),从而实现这样的场景。XRC 是 XR 的命名空间代理; XRC 的 schema 与其对应的 XR 的 schema 是相同的。当应用程序操作员创建一个 XRC 时,会自动创建一个相应的后备 XR。这个模型与 Kubernetes 中的持久卷(PV)和持久卷声明(PVC)相似

声明基础设施

我们在上一节中安装的 Configuration 包:

  • 定义一个XPostgreSQLInstance XR。

  • 提供一个对应 XR 的 PostgreSQLInstance 声明(XRC)。

  • 创建一个可以满足 XR 的 Composition

这意味着我们可以在 default 的命名空间中创建一个 PostgreSQLInstance XRC来提供一个PostgreSQL 实例和它可能需要的所有支持基础设施(vpc、防火墙规则、资源组等)!

注意,该资源将使用您的默认 VPC 创建一个 RDS 实例,该实例可能允许也可能不允许来自互联网的连接,这取决于它的配置方式。

apiVersion: database.example.org/v1alpha1
kind: PostgreSQLInstance
metadata:
  name: my-db
  namespace: default
spec:
  parameters:
    storageGB: 20
  compositionSelector:
    matchLabels:
      provider: aws
      vpc: default
  writeConnectionSecretToRef:
    name: db-conn
kubectl apply -f http://raw.githubusercontent.com/crossplane/crossplane/release-1.5/docs/snippets/compose/claim-aws.yaml

创建 PostgreSQLInstance Crossplane 后,将开始在您选择的云供应商上提供一个数据库实例。一旦配置完成,当你运行时,你应该在输出中看到READY: True:

kubectl get postgresqlinstance my-db

注意:

在等待 PostgreSQLInstance 就绪时,您可能想查看集群中的其他资源。通过以下命令可以查看 Crossplane 资源组:

  • kubectl get claim: 获取所有声明类型的所有资源,如 PostgreSQLInstance
  • kubectl get composite: 获取所有复合类型的资源,如 XPostgreSQLInstance
  • kubectl get managed:获取代表一个外部基础设施单元的所有资源。
  • kubectl get <name-of-provider>:获取与云供应商相关的所有资源。
  • kubectl get crossplane:获得所有与 Crossplane 相关的资源。

试试下面的命令,以观察您准备好的资源:

kubectl get crossplane -l crossplane.io/claim-name=my-db

一旦准备好 PostgreSQLInstance,您应该在 default 命名空间中看到一个名为 db-conn 的 Secret,它包含我们在 XRD 中定义的 key。如果它们是由 composition 填充的,那么它们应该出现:

$ kubectl describe secrets db-conn
Name:         db-conn
Namespace:    default
...

Type:  connection.crossplane.io/v1alpha1

Data
====
password:  27 bytes
port:      4 bytes
username:  25 bytes
endpoint:  45 bytes

这里我创建好了一个 RDS,endpoint 是:my-db-lfcp2-v792d.cbijsmocclgy.us-east-1.rds.amazonaws.com

消费基础设施

因为连接秘密信息被写成 Kubernetes Secret,它们很容易被 Kubernetes 原语使用。Kubernetes 中最基本的构建块是 Pod。让我们定义一个 Pod,它将显示我们能够连接到新供应的数据库。

apiVersion: v1
kind: Pod
metadata:
  name: see-db
  namespace: default
spec:
  containers:
  - name: see-db
    image: postgres:12
    command: ['psql']
    args: ['-c', 'SELECT current_database();']
    env:
    - name: PGDATABASE
      value: postgres
    - name: PGHOST
      valueFrom:
        secretKeyRef:
          name: db-conn
          key: endpoint
    - name: PGUSER
      valueFrom:
        secretKeyRef:
          name: db-conn
          key: username
    - name: PGPASSWORD
      valueFrom:
        secretKeyRef:
          name: db-conn
          key: password
    - name: PGPORT
      valueFrom:
        secretKeyRef:
          name: db-conn
          key: port
kubectl apply -f http://raw.githubusercontent.com/crossplane/crossplane/release-1.5/docs/snippets/compose/pod.yaml

这个 Pod 只是连接到一个 PostgreSQL 数据库并打印它的名字,所以如果你运行 kubectl logs see-db,你应该在创建它之后看到以下输出(或类似的):

 current_database
------------------
 postgres
(1 row)

清理

要清理 Pod,运行:

kubectl delete pod see-db

为了清理准备好的基础设施,你可以删除 PostgreSQLInstance XRC:

kubectl delete postgresqlinstance my-db

当我执行这个的时候,对应的 Crossplane 状态为 deleting

$ kubectl get crossplane -l crossplane.io/claim-name=my-db
NAME                                                       READY   SYNCED   STATE      ENGINE     VERSION   AGE
rdsinstance.database.aws.crossplane.io/my-db-lfcp2-v792d   False   True     deleting   postgres   12.7      14m

查看 AWS 控制台,也正在删除:

AWS 控制台正在删除

删除完毕后,2 边也是状态一致的:

AWS 控制台状态和 Crossplane 状态一致

下一步

现在您已经了解了如何通过组合来供应和使用复杂的基础设施。在下一节中,您将学习如何编写和打包您自己的基础设施api。

卸载

See Uninstall docs for cleaning up resources, packages, and Crossplane itself.

总结

结合前面章节《Crossplane vs Terraform》里提到的,Crossplane 确实在云基础设施管理这块更进一步,仅从上面这个简单的「快速上手」环节,就能感觉到,相比 Terraform,Crossplane 在这些方面更有优势:

  • ? 声明式基础设施配置(Kubernetes 一脉相承)
  • ? 统一应用程序和基础设施的配置和部署(都用 Kubernetes)
  • ? 使用协调控制器自动化操作任务 (这点体验真的不错)
  • ⇅ 强烈的关注点分离

以上。

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

本文转载于网络 如有侵权请联系删除

相关文章

  • 互联网家装,不变中求变

    配图来自Canva可画伴随着国内O2O浪潮的兴起,互联网家装行业迎来了快速发展的历史机遇期。据相关数据统计,我国互联网家装市场规模由2016年的137.9亿元增长至2020年的567.1亿元,复合年均增长率高达42.4%。另据中商产业研究院预测,2022年我国互联网家装市场规模将达到867.1亿元,巨大的市场规模迅速吸引了许多玩家参与其中。目前来看,参与互联网家装行业的玩家主要有两类:一类是垂直领域的互联网家装企业,例如土巴兔、齐家网等;另一类则是后续入场的综合性互联网平台,例如阿里、京东、国美等,二者共同推动了互联网家装行业的发展与变革,但二者所走的路线显然有着明显的差异。垂直类互联网装企:回归平台本身不同于其他纯线上的互联网平台,家装平台由于需要大量介入线下服务,所以天然融入了半垂直的性质。事实上,随着互联网平台的扩大,以土巴兔、齐家网为代表的垂类家装平台,垂直化程度也会变得越来越深。一来,垂直类互联网装企回归平台本身,在供应端对家装产业链进行重构。众所周知,用户之所以找装修公司,是为了找到能力强的设计师、靠谱的施工队,以及高性价比的装修材料,所以齐家网、土巴兔等平台纷纷借助互联网

  • 操作系统总览

    大家好,又见面了,我是你们的朋友全栈君。第一遍看操作系统,有很多需要理解的东西,所以觉得比较难。第二遍开始后,大家在一起结合生活中的例子来讲解每一章的内容,发现并不是像我们想象的那么难。第一章首先介绍了操作系统的基础知识,从最基本的定义开始,向我们介绍什么是操作系统。操作系统的类型、发展以及功能。在接下来的章节里,就操作系统的功能展开详细的讲解。第二章这一章介绍了处理器管理,从发展开始引入,对进程做了详细、重点的讲解,在第六章专门介绍了并发进程。处理器调度和中断处理也是非常重要的内容。第三章这一章主要是在讲对存储管理的不断探索与优化,从单用户连续存储到固定分区,发展到可变分区以及页式虚拟存储,使对存储空间的利用效率大大提高。第四章随着操作系统的发展,文件越来越多,所以出现了文件管理,所以我们需要了解文件的组织方式,存储原理,还需要注意文件安全。第五章使用操作系统离不开设备,所以也要对其进行管理,主要包括设备的分配、启动、中断,由于存储的问题,就出现了缓冲以及虚拟设备。最后,我们可以结合自己的生活来了解操作系统的工作原理,有的内容书上用了大量的语言来介绍,转换成自己的理解就是非常简单的过

  • C语言实例第03期,使用*打印平行四边形

    实例代码// //Createdby冲哥on2020/9/8. // #include"stdio.h" intmain(){ chararr[5]={'*','*','*','*','*'}; for(inti=0;i<5;i++){//输出5行 for(intj=1;j<=i;j++){ printf("");//输出空格的数量随着行数的变化而变化 } for(intk=0;k<5;k++){ printf("%c",arr[k]);//输出数组中的元素 } printf("\n");//输出一行后换行 } } 复制运行结果:程序分析本实例的要点就是理解三个for循环第一个for循环控制整个图形的行数,本实例中的图形共5行,所以i的范围为0~4。第二个for循环用来控制空格的数量。第三个for循环用将数组a中的元素逐个输出。

  • 内网渗透测试:DCSync 攻击技术的利用研究

    DCSync是什么在域环境中,不同域控制器(DC)之间,每15分钟都会有一次域数据的同步。当一个域控制器(DC1)想从其他域控制器(DC2)获取数据时,DC1会向DC2发起一个GetNCChanges请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync就是利用的这个原理,通过DirectoryReplicationService(DRS)服务的GetNCChanges接口向域控发起数据同步请求。DCSync是域渗透中经常会用到的技术,其被整合在了Mimikatz中。在DCSync功能出现之前,要想获得域用户的哈希,需要登录域控制器,在域控制器上执行代码才能获得域用户的哈希。2015年8月,BenjaminDelpy(神器Mimikatz的作者)和VincentLeToux发布了新版本的Mimikatz,新增加了DCSync功能。该功能可以模仿一个域控制器,从真实的域控制器中请求数据,例如用户的哈希。该功能最大的特点就是不用登陆域控制器,即可远程通过域数据同步复制的方式获得域控制器上的的数据。注意:DCSync攻击的对象如果是只读域控制器(ROD

  • 21天自制chromium -- cc篇

    好吧,我承认有点标题党了。 不过从这篇开始,我们来点干货,如何从blink打造一个可以实用的浏览器。 chromium从零几年搞到现在,已经完全变成一个无所不包的庞然大物。 如果你只是想要一个能浏览网页的组件,方便嵌入到自己的程序里,或者想用网页来做界面--例如QQ音乐,网易云音乐那样, chromium的那堆多进程、mojo通信、ChromeApps框架、AuraShell、增量升级系统、ChromeExtensions、headless模式、P2P通信库,native_client、pdf、ppapi、沙盒机制等等一堆乱七八糟你听都没听过的东西都不会需要。然而只要用了chromium的内核,这堆东西除了占用系统资源外,你还不得不都打包带上。 这时候你就会有个强烈的想法,我不需要这堆乱七八糟的功能,只要能浏览大部分网页的排版渲染组件可以么。 答案是肯定的。webkit内核就是为此而生。 但这里有个问题,chromium虽然当年是使用webkit内核,但自从和苹果分道扬镳后,把webkit改名成blink不说,代码和结构完全是面目全非,而且最重要的是blink已经不是像webki

  • FPGA加速:面向数据中心和云服务的探索和实践

    作者介绍:章恒——腾讯云FPGA专家,目前在腾讯架构平台部负责FPGA云的研发工作,探索FPGA加速数据中心的应用,包括:图像处理、深度学习、SDN等。为了进一步加速云计算的创新发展、建立云计算信任体系、规范云计算行业、促进市场发展、提升产业技术和服务水平,由中国信息通信研究院、中国通信标准化协会主办的“2018可信云大会”于2018年8月14日-8月15日在北京国际会议中心召开。云计算已经发展了十余个年头,并逐渐形成庞大的产业规模,企业“上”云也并非难事。但不断出现的信息数据泄露事件给火爆的云计算敲响了警钟,企业开始逐渐意识到云计算存在的风险,明白部署哪一种云都有可能受到黑客攻击。虽然云计算可带来显著的优势,但潜在的风险也不容忽视。“2018可信云大会”将邀请行业内多位大咖人物共同探索可信云与云计算的创新发展路径。以下是腾讯云FPGA专家章恒在“2018可信云大会”上做的——《FPGA加速:面向数据中心和云服务的探索和实践》的演讲全文:章恒:各位嘉宾下午好,我是来自腾讯的章恒,今天分享的主题是《FPGA加速:面向数据中心和云服务上的探索和实践》。之前各位专家已经从学术界、标准化的方面

  • 来人!关门!放视频!

    今天放两个视频,一个是我做的ZeroMQ的BBL,和上一篇文章ZeroMQ及其模式遥相呼应:视频内容E文的,不要敲我。。。slides请戳阅读原文。另一个是上个月做的直播的录像,对应用LeanCanvas自我剖析(一)。中文的,更不要敲我——不忍看视频的,听声音,声音没那么差;不忍听声音的,看文字,文字还过得去;不忍看文字的,大侠,您还是敲我吧。视频内容这两个视频传上腾讯视频后,我一直只敢捂着脸看,不敢相信视频里的英俊少年就是我。犹豫了很久是否要删掉以免丑态四射,后来不小心在youtube上看到了zurk刚出道的青涩视频(和日后的成熟老练相比,判若两人啊),顿觉一盆鸡汤从头浇下,小学语文课本中的那段“人家zurk能办到的事情,我童第周经过努力,也一定能办到”仿佛在耳边回响。。。于是,就让你们看看我的丑态,有这两个黑白双煞垫底,以后就算放个抠鼻屎的视频,也妥妥的全是加分,是不??另,「用LeanCanvas自我剖析(二)」的直播我还没准备好,现在半夜做铲屎官外加人肉摇篮,不够睡,火车上除了站着的时候全在睡觉。。。所以,上周日食言了。。。非常抱歉!我会尽快准备好素材的⛽️肿么办,我啰嗦这么

  • 【报告】2016全球物联网发展研究报告

  • C4C Cloud Application Studio做ABSL开发的一些性能方面的最佳实践

    StefanHagen在博文SAPCloudApplicationStudioPerformanceBestPractices里介绍了在C4C里使用CloudApplicationStudio进行ABSL编程的一些性能方面的最佳实践。文章里提纲挈领地给出了一些guideline。这里提供一些具体的例子。如何批量调用BOaction不好的例子:第一行和第四行有两个循环,然后在第二次循环里调用一个比较耗时的ServiceRequestBO的item节点上定义的标准actionFinishFulfilmentProcessing。代码的时间复杂度为o(n<sup>2</sup>)正确的做法:优化的原理就是,C4C和其他很多基于Netweaver的SAP产品一样,其BO的核心service都支持批量操作。所谓批量操作,技术上就是指这些service的输入参数是一个内表,而非单条数据。如果您做过CRM开发,可以类比CRM_ORDER_MAINTAIN这个functionmodule,其所有输入参数都是内表结构。C4C的BO提供的service的接口定义也完全采用了这种支持

  • Linux使用笔记3-crontab添加定时任务

    linux中任务管理的软件有很多,个人比较倾向于crontab。简单来说,crontab就是linux下一个方便任务管理的工具,可以添加定时任务,执行脚本。1.开启crontab日志  crontab默认情况下是不执行开启日子的,所以一开始写完后,不能执行,想查看日志,却找不到。所以先开启定时任务的日志来查看  修改rsyslog服务,将/etc/rsyslog.d/50-default.conf文件中的#cron.*前的#删掉;用以下命令重启rsyslog服务:servicersyslogrestart;   然后再重启crontab服务:servicecronrestart;   网上很多人说开启,停止或者重启contab服务用命令servicecrondrestart,执行这个命令会报出unrecognisedservice,这里吧crond改成cron就可以了。  之后,在这个位置/var/log/cron.log就可以查看定时任务的文件日志文件了;  下面这个命令还可以查看crontab的状态servicecronstatus;   查看运行时的日志文件,如果在日志文件中执行

  • Istio服务级指标

    服务级指标 Istio暴露的服务级指标用于监控服务间通信 这类指标涵盖了服务监控的四个基本需求:延迟、流量、错误和饱和度 Istio默认配置了一组服务指标(通常也可称为标准指标),并将这些指标导出至Prometheus监控系统 舍弃Mixer之后,Istio的这些服务指标则由Envoy代理通过Proxy-wasm插件直接导出 服务级指标的旧时代(TelemetryV1) 在Istio1.4及之前的版本中,服务级别的指标由Mixer提供 服务级指标的新实现(TelemetryV2) 实现路径:将服务级指标的实现借助于特定“extension”移入Envoy 目标:以被动收集方式实现,从而减少资源消耗,并降低延迟; 实现方式 静态预编译:需要使用C++编写相关的Filter,并集成到Envoy的源码中,因而需要重新编译和滚动更新 动态运行时加载:支持基于WASM(WebAssembly)来动态加载Filter,完成Envoy扩展 IstioTelemetryV2使用两个自定义的Envoy插件实现服务级指标 metadata-e

  • deepmind 不确定性估计软件包

    https://github.com/deepmind/neural_testbed IntroductionPosteriorpredictivedistributionsquantifyuncertaintiesignoredbypointestimates.Theneural_testbedprovidestoolsforthesystematicevaluationofagentsthatgeneratesuchpredictions.Crucially,thesetoolsassessnotonlythequalityofmarginalpredictionsperinput,butalsojointpredictionsgivenmanyinputs.Jointdistributionsareoftencriticalforusefuluncertaintyquantification,buttheyhavebeenlargelyoverlookedbytheBayesiandeeplearningcommunity.Thislibraryautomatestheevalu

  • 每日复盘_2021.02.19-学习OOP面向对象编程

    每日复盘——2021.02.19 有价值的事: 学习OOP,对OOP有认识、编写Demo并通过了测试。 解决本职工作遇到的问题。 复盘: 睡眠不足,有影响第二天状态的可能,需要合理调整工作、学习时间。 以上,是今天复盘的内容。 白时,2021.02.19

  • deepin 删除文件后目录不刷新解决方案

    调整最大文件监控数量 sudovim/etc/sysctl.conf复制 添加参数 fs.inotify.max_user_watches=10000复制 运行使配置生效 sudo/sbin/sysctl-p复制   https://unix.stackexchange.com/questions/444998/how-to-set-and-understand-fs-notify-max-user-watches

  • mysq查询语句包含中文以及中文乱码,字符集 GBK、GB2312、UTF8的区别

    一、查看mysql字符集设置情况    使用NavicatforMysql查看工具,打开命令列界面,输入showvariableslike'%char%';如下图,查看当前mysql字符集设置情况    1、在查询结果中可以看到mysql数据库系统中客户端、数据库连接、数据库、文件系统、查询结果、服务器、系统的字符集设置     2、在这里,文件系统字符集是固定的,系统、服务器的字符集在安装时确定,与乱码问题无关。乱码的问题与客户端、数据库连接、数据库、查询结果的字符集设置有关    *注:客户端是看访问mysql数据库的方式,通过命令行访问,命令行窗口就是客户端,通 过JDBC等连接访问,程序就是客户端    二、设置mysql数据库的字符集方式   默认设置情况下,mysql的默认字符集为latin1(ISO_8859_1),若要操作中文字符则需要修改字符集:   修改默认字符集    (1)最简单的修改方法,就是修改my

  • WebService 与 Socket 区别

    一、WebService 1.什么是WebService     WebService(WEB服务)能够快捷和方便地综合结合各种系统、商务和任何应用平台。利用最新的WebService标准能够使任何软件系统和系统之间的应用互通互联,方便,而且更加廉价。   2.WebService的应用场合 (1)跨越防火墙通信      客户端和服务器端之间通信都会有防火墙或者代理服务器。传统的实现互相通信的方法是在分布式对象,如DCOM、CORBA之间进行相互的远程过程调用(TCP/IP),但在这种场合下HTTP协议的特性没有得到应用,因此在Internet环境下的远程过程调用不是一件容易的事情,同时在Internet上使用远程过程调用还存在安全问题,防火墙和代理服务器还有可能阻挡这种类型的数据传输。HTTP是在Internet上发送消息的标准协议。Web服务使用基于XML消息处理作为基本的数据通信方式,应用程序可以使用HTTP和XML消息等标准在基于Web的应用程序之间交换信息,从而跨越防火

  • C#如何调用浏览器并打开指定网址?

    System.Diagnostics.Process.Start("http://zhating.cn");复制 在.NETFreamWork中,是能够正常使用的 参考:https://blog.csdn.net/weixin_43653287/article/details/91460838   但是!!! 在.netcore中是不能使用的,是会报错的。 .newcore中具体的用法: varpsi=newProcessStartInfo { FileName="http://www.baidu.com/", UseShellExecute=true }; Process.Start(psi);复制 参考:https://www.cnblogs.com/Jaywhen-xiang/p/14027243.html

  • 「四」vim执行外部命令、文件另存为、文件提取合并、打开类命令、光标后插入内容、替換、复制粘贴、查找设置

    vim执行外部命令 查看当前目录文件::!command 另存为 完整内容::wfilename 选择性内容: v:选择内容、 复制 :wfilename 复制 文件提取合并 向当前文件插入文件内容::rfilename :rtest.txt :r!ls读取ls命令的输出 打开类命令 在上方插入新的一行O 在光标下方插入新的一行o 光标后插入内容 将光标移动到单词末尾e 光标后插入内容a 替換 替换内容的同时删除原内容:R 复制粘贴 选择内容:v 复制选择内容:y 粘贴p 查找设置 查找时忽略字母大小写setic 查找短语时显示部分匹配且高亮显示所有的匹配短语sethlsis

  • osi七层协议

    互联网的本质就是一系列的网络协议。连接两台计算机之间的internet实际上就是一系列统一的标准,这些标准称之为互联网协议。 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 每层运行常见物理设备      三层交换机:既有路由功能,又有交换机功能。   集线器目前很少在用了。   不同设备连接,网线用直通线(T568A或者T568B)。 OSI七层协议数据传输的封包与解包过程  1.物理层:完成组网,发送高低电压(电信号),高电压对应数字1,低电压对应数字0;   2.数据链路层:定义了电信号的分组方式。   以太网协议(ethernet):     一组电信号构成一个数据包,叫做‘帧’     每一数据帧分成:报头head和数据data两部分   mac地址:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。   广播:有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另外一台主机的mac地址)      ethernet采用最原始的方式,广播

  • 图的遍历

    从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。 (1)深度优先遍历 深度优先遍历类似于数的先序遍历,是树的先序遍历的推广。 从图中某个顶点v出发,访问v。 找到刚访问过得顶点的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直至刚访问的顶点没有未被访问的邻接点为止。 返回前一个访问过得且扔有未被访问的邻接点的顶点,找到该顶点的下一个未被访问的邻接点,访问该顶点。 重复步骤2,3,直至图中所有顶点都被访问过。 深度优先遍历算法的实现 为了在遍历过程中便于区分顶点是否已经被访问,需附设访问标志组visited,其初值为false,一旦某个顶点被访问,则其相应的分量置为true。 #python代码实现邻接矩阵的深度优先遍历 classMGraph(): def__init__(self): self.vertex=[] self.matrix=[] self.numNodes=0 self.numEdges=0 self.visited=[] defcreateMGraph(self): """创建无向

  • 参数:默认参数必须指向不变对象!

    定义默认参数要牢记一点:默认参数必须指向不变对象!参见廖雪峰url:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000

相关推荐

推荐阅读