kubernetes中文手册
  • 前言
    • 序言
  • 云原生
    • 云原生(Cloud Native)的定义
    • 云原生的设计哲学
    • Kubernetes 的诞生
    • Kubernetes 与云原生应用概览
    • 云原生应用之路 —— 从 Kubernetes 到云原生
    • 定义云原生应用
      • OAM
        • Workload
        • Component
        • Trait
        • Application Scope
        • Application Configuration
      • Crossplane
    • 云原生编程语言
      • 云原生编程语言 Ballerina
      • 云原生编程语言 Pulumi
    • 云原生的未来
  • 快速入门
    • 云原生新手入门指南
    • Play with Kubernetes
    • 快速部署一个云原生本地实验环境
    • 使用 Rancher 在阿里云上部署 Kubenretes 集群
  • 概念与原理
    • Kubernetes 架构
      • 设计理念
      • Etcd 解析
      • 开放接口
        • CRI - Container Runtime Interface(容器运行时接口)
        • CNI - Container Network Interface(容器网络接口)
        • CSI - Container Storage Interface(容器存储接口)
      • 资源对象与基本概念解析
    • Pod 状态与生命周期管理
      • Pod 概览
      • Pod 解析
      • Init 容器
      • Pause 容器
      • Pod 安全策略
      • Pod 的生命周期
      • Pod Hook
      • Pod Preset
      • Pod 中断与 PDB(Pod 中断预算)
    • 集群资源管理
      • Node
      • Namespace
      • Label
      • Annotation
      • Taint 和 Toleration(污点和容忍)
      • 垃圾收集
    • 控制器
      • Deployment
      • StatefulSet
      • DaemonSet
      • ReplicationController 和 ReplicaSet
      • Job
      • CronJob
      • Horizontal Pod Autoscaling
        • 自定义指标 HPA
      • 准入控制器(Admission Controller)
    • 服务发现与路由
      • Service
      • 拓扑感知路由
      • Ingress
        • Traefik Ingress Controller
      • Kubernetes Service API
        • Service API 简介
    • 身份与权限控制
      • ServiceAccount
      • 基于角色的访问控制(RBAC)
      • NetworkPolicy
    • 网络
      • Kubernetes 中的网络解析 —— 以 flannel 为例
      • Kubernetes 中的网络解析 —— 以 calico 为例
      • 具备 API 感知的网络和安全性管理开源软件 Cilium
        • Cilium 架构设计与概念解析
    • 存储
      • Secret
      • ConfigMap
        • ConfigMap 的热更新
      • Volume
      • 持久化卷(Persistent Volume)
      • Storage Class
      • 本地持久化存储
    • 集群扩展
      • 使用自定义资源扩展 API
      • 使用 CRD 扩展 Kubernetes API
      • Aggregated API Server
      • APIService
      • Service Catalog
    • 多集群管理
      • 多集群服务 API(Multi-Cluster Services API)
      • 集群联邦(Cluster Federation)
    • 资源调度
      • 服务质量等级(QoS)
  • 用户指南
    • 用户指南概览
    • 资源对象配置
      • 配置 Pod 的 liveness 和 readiness 探针
      • 配置 Pod 的 Service Account
      • Secret 配置
      • 管理 namespace 中的资源配额
    • 命令使用
      • Docker 用户过渡到 kubectl 命令行指南
      • kubectl 命令概览
      • kubectl 命令技巧大全
      • 使用 etcdctl 访问 Kubernetes 数据
    • 集群安全性管理
      • 管理集群中的 TLS
      • kubelet 的认证授权
      • TLS Bootstrap
      • 创建用户认证授权的 kubeconfig 文件
      • IP 伪装代理
      • 使用 kubeconfig 或 token 进行用户身份认证
      • Kubernetes 中的用户与身份认证授权
      • Kubernetes 集群安全性配置最佳实践
    • 访问 Kubernetes 集群
      • 访问集群
      • 使用 kubeconfig 文件配置跨集群认证
      • 通过端口转发访问集群中的应用程序
      • 使用 service 访问群集中的应用程序
      • 从外部访问 Kubernetes 中的 Pod
      • Cabin - Kubernetes 手机客户端
      • Lens - Kubernetes IDE/桌面客户端
      • Kubernator - 更底层的 Kubernetes UI
    • 在 Kubernetes 中开发部署应用
      • 适用于 Kubernetes 的应用开发部署流程
      • 迁移传统应用到 Kubernetes 中 —— 以 Hadoop YARN 为例
      • 使用 StatefulSet 部署用状态应用
  • 最佳实践
    • 最佳实践概览
    • 在 CentOS 上部署 Kubernetes 集群
      • 创建 TLS 证书和秘钥
      • 创建 kubeconfig 文件
      • 创建高可用 etcd 集群
      • 安装 kubectl 命令行工具
      • 部署 master 节点
      • 安装 flannel 网络插件
      • 部署 node 节点
      • 安装 kubedns 插件
      • 安装 dashboard 插件
      • 安装 heapster 插件
      • 安装 EFK 插件
    • 生产级的 Kubernetes 简化管理工具 kubeadm
      • 使用 kubeadm 在 Ubuntu Server 16.04 上快速构建测试集群
    • 服务发现与负载均衡
      • 安装 Traefik ingress
      • 分布式负载测试
      • 网络和集群性能测试
      • 边缘节点配置
      • 安装 Nginx ingress
      • 安装配置 DNS
        • 安装配置 Kube-dns
        • 安装配置 CoreDNS
    • 运维管理
      • Master 节点高可用
      • 服务滚动升级
      • 应用日志收集
      • 配置最佳实践
      • 集群及应用监控
      • 数据持久化问题
      • 管理容器的计算资源
    • 存储管理
      • GlusterFS
        • 使用 GlusterFS 做持久化存储
        • 使用 Heketi 作为 Kubernetes 的持久存储 GlusterFS 的 external provisioner
        • 在 OpenShift 中使用 GlusterFS 做持久化存储
      • GlusterD-2.0
      • Ceph
        • 用 Helm 托管安装 Ceph 集群并提供后端存储
        • 使用 Ceph 做持久化存储
        • 使用 rbd-provisioner 提供 rbd 持久化存储
      • OpenEBS
        • 使用 OpenEBS 做持久化存储
      • Rook
      • NFS
        • 利用 NFS 动态提供 Kubernetes 后端存储卷
    • 集群与应用监控
      • Heapster
        • 使用 Heapster 获取集群和对象的 metric 数据
      • Prometheus
        • 使用 Prometheus 监控 Kubernetes 集群
        • Prometheus 查询语言 PromQL 使用说明
      • 使用 Vistio 监控 Istio 服务网格中的流量
    • 分布式追踪
      • OpenTracing
    • 服务编排管理
      • 使用 Helm 管理 Kubernetes 应用
      • 构建私有 Chart 仓库
    • 持续集成与发布
      • 使用 Jenkins 进行持续集成与发布
      • 使用 Drone 进行持续集成与发布
    • 更新与升级
      • 手动升级 Kubernetes 集群
      • 升级 dashboard
    • 扩展控制器
      • OpenKruise
        • 原地升级
    • 安全策略
      • 开放策略代理(OPA)
      • 云原生安全
  • 服务网格
    • 服务网格(Service Mesh)
    • 企业级服务网格架构
      • 服务网格基础
      • 服务网格技术对比
      • 服务网格对比 API 网关
      • 采纳和演进
      • 定制和集成
      • 总结
    • Istio
      • 使用 Istio 前需要考虑的问题
      • Istio 中 sidecar 的注入规范及示例
      • 如何参与 Istio 社区及注意事项
      • Istio 免费学习资源汇总
      • Sidecar 的注入与流量劫持
      • Envoy Sidecar 代理的路由转发
      • Istio 如何支持虚拟机
      • Istio 支持虚拟机的历史
    • Envoy
      • Envoy 的架构与基本术语
      • Envoy 作为前端代理
      • Envoy mesh 教程
  • 领域应用
    • 领域应用概览
    • 微服务架构
      • 微服务中的服务发现
      • 使用 Java 构建微服务并发布到 Kubernetes 平台
        • Spring Boot 快速开始指南
    • 大数据
      • Spark 与 Kubernetes
        • Spark standalone on Kubernetes
        • 运行支持 Kubernetes 原生调度的 Spark 程序
    • Serverless 架构
      • 理解 Serverless
      • FaaS(函数即服务)
        • OpenFaaS 快速入门指南
      • Knative
    • 边缘计算
    • 人工智能
    • 可观察性
  • 开发指南
    • 开发指南概览
    • SIG 和工作组
    • 开发环境搭建
      • 本地分布式开发环境搭建(使用 Vagrant 和 Virtualbox)
    • 单元测试和集成测试
    • client-go 示例
      • client-go 中的 informer 源码分析
    • Operator
      • operator-sdk
    • kubebuilder
      • 使用 kubebuilder 创建 operator 示例
    • 高级开发指南
    • 社区贡献
    • Minikube
  • 社区及生态
    • 云原生计算基金会(CNCF)
      • CNCF 章程
      • CNCF 特别兴趣小组(SIG)说明
      • 开源项目加入 CNCF Sandbox 的要求
      • CNCF 中的项目治理
      • CNCF Ambassador
    • 认证及培训
      • 认证 Kubernetes 服务提供商(KCSP)说明
      • 认证 Kubernetes 管理员(CKA)说明
  • 附录
    • 附录说明
    • Kubernetes 中的应用故障排查
    • Kubernetes 相关资讯和情报链接
    • Docker 最佳实践
    • Kubernetes 使用技巧
    • Kubernetes 相关问题记录
    • Kubernetes 及云原生年度总结及展望
      • Kubernetes 与云原生 2017 年年终总结及 2018 年展望
      • Kubernetes 与云原生 2018 年年终总结及 2019 年展望
    • CNCF 年度报告解读
      • CNCF 2018 年年度报告解读
      • CNCF 2020 年年度报告解读
由 GitBook 提供支持
在本页
  • Pulumi 是什么?
  • 我最喜欢的东西
  • 下一步是什么?
  • 参考
  1. 云原生
  2. 云原生编程语言

云原生编程语言 Pulumi

上一页云原生编程语言 Ballerina下一页云原生的未来

最后更新于3年前

2018 年 6 月 18 日 Joe Duffy 在中宣布开源了云原生编程语言 。这是继 之后我看到的另一款云原生编程语言,他们之间有一些共同的特点,例如都是为了支持多种云环境,基于不可变基础设施和基础设施即代码的理念构建,使云原生应用的集成更加方便,但也有一些不同,Ballerina 是直接创建了一个基于 JVM 的语言,而 Pulumi 是为不同编程语言构建了 SDK。

下文部分来自 Joe Duffy 的博客 !

TL;DR 有了 Pulumi,38 页的手动操作说明将变成了 38 行代码。25000 行 YAML 配置变成了使用真实编程语言的 500 行语句。

Pulumi 的整个运行时、CLI、支持的库都可以在 GitHub 上免费下载。我们的团队正急切的等待您的反馈。与此同时,我需要告诉您一些关于 Pulumi 的事情,为什么我们会创造它。

Pulumi 是什么?

Pulumi 是一个支持多语言和混合云开发平台。它可以让您使用真实语言和真实代码创建云计算的各个方面,从基础设施到应用程序本身。只需编写程序并运行它们,Pulumi 就能帮你完成出其余部分。

Pulumi 的中心是一个云对象模型,与运行时相结合以了解如何以任何语言编写程序,理解执行它们所需的云资源,然后以强大的方式规划和管理您的云资源。这种云运行时和对象模型本质上是与语言、云中立的,这就是为什么我们能够支持如此多的语言和云平台。更多支持正在路上。

Pulumi 采用了基础设施即代码以及不可变基础设施的概念,并可让您从您最喜欢的语言(而不是 YAML 或 DSL)中获得自动化和可重复性优势。在部署它们之前,您可以对变更进行区分,并且我们会对谁更改了什么以及何时更改进行完善的审计追踪。核心模型因此是陈述性的。

使用真正的语言可以带来巨大的好处:

  • 熟悉:不需要学习新的定制 DSL 或基于 YAML 的模板语言

  • 抽象:正如我们喜爱的编程语言那样,我们可以用更小的东西来构建更大的东西

  • 共享和重用:利用现有的语言包管理器共享和重用这些抽象,无论是与社区、团队内部共享

  • 表现力:充分利用您的编程语言,包括异步、循环和条件

  • 工具:通过使用真正的语言,我们可以即时访问 IDE、重构、测试、静态分析和编排等等

  • 生产力:将以上所有好处加在一起,一起将变得更快,我们也会变得更快乐

当提供原始云资源时,这些好处当然最重要,但是我们在团队中发现,您只能使用抽象。这包括在函数中包装事物以消除样板并创建引入更高级别概念的自定义类,通常将它们打包并重复使用。

例如,此代码在 AWS 中创建一个 DynamoDB 数据库:

import * as aws from "@pulumi/aws";
let music = new aws.dynamodb.Table("music", {
    attributes: [
        { name: "Album", type: "S" },
        { name: "Artist", type: "S" },
    ],
    hashKey: "Album",
    rangeKey: "Artist",
});

此代码创建一个基于容器的任务和无服务器功能,由一个存储桶触发:

import * as cloud from "@pulumi/cloud";
let bucket = new cloud.Bucket("bucket");
let task = new cloud.Task("ffmpegThumbTask", {
    build: "./path_to_dockerfile/",
});
bucket.onPut("onNewVideo", bucketArgs => {
    let file = bucketArgs.key;
    return task.run({
        environment: {
            "S3_BUCKET":   bucket.id.get(),
            "INPUT_VIDEO": file,
            "TIME_OFFSET":  file.substring(file.indexOf('_')+1, file.indexOf('.')).replace('-',':'),
            "OUTPUT_FILE": file.substring(0, file.indexOf('_')) + '.jpg',
        },
    });
});

更好的是,这些代码可以根据您的需求部署到任何公共或私有云中。

最后,这个例子创建了一个 Redis 缓存。我们怎么知道?我们不需要。缓存组件是一个抽象,它封装了我们可以安全忽略的不重要的细节:

import {Cache} from "./cache";
let cache = new Cache("url-cache");

在使用 Pulumi 之后,你不会再以同样的方式考虑基础设施。你的大脑将不再是一个独立于应用程序的独特 “事物”,而是开始将分布式云系统看作是你的程序架构的核心部分,而不是事后的想法。

由于抽象,我们已经能够提供一些强大的库。该库是提炼和执行最佳实践的绝佳方式。当然,对于我们自己的库来说没有什么特别的,因为它们只是功能、类和代码,我们期待着看到你为自己、你的团队或者社区建立的那些库。

我们最复杂的库 ——Pulumi 云框架 —— 提供了一些令人兴奋的正在进行的工作的早期预览,展示如何创建跨越云提供商自己对诸如容器、无服务器功能和存储桶等核心概念的抽象。以同样的方式,您可以用 Node.js、Python、Java、.NET 等语言编写功能强大的应用程序,利用进程、线程和文件系统,无论是在 macOS、Linux 还是 Windows 上,这种方法都可以让您创建针对任何云提供商的现代混合云应用程序。像 Kubernetes 和其他 CNCF 产品组合这样的技术正在帮助推动这一不可避免的结果,因为它们在整个云基板上实现了对基本计算抽象的民主化和共识。

Pulumi 不是 PaaS,尽管它提供类似 PaaS 的生产力;您的程序总是直接针对您选择的云运行,并且始终可以访问该基础云的全部功能。即使您选择使用更高级别的组件,它也会向下兼容,并且您可以随时直接使用原始资源。它就像任何复杂的现代软件:有时,整个事情必须用 C++ 编写,以便访问底层平台的全部功能,但对于大多数常见情况,70% 到 100%可以是平台独立代码,而只有不到 30% 的专业化才能真正需要直接与操作系统交互。

接下来我还将发布十几篇博客文章来介绍 Pulumi 所有方面的更多细节。然而,为了保持这篇文章尽量简短,我将首先介绍下 Pulumi 的一些我最喜欢的方面。

我最喜欢的东西

这很难选择,但这里有一些关于 Pulumi 我最喜欢的东西:

开源。我坚信所有开发人员工具都应该是开源的。当然,Pulumi 也是一家公司,但是有充足的机会通过增加便利性以建立商业模式。(可以认为是Git 与 GitHub 的关系)我们从以前的工作中受益匪浅,其中包括 Docker、Terraform、Kubernetes、TypeScript 以及其他许多明确提及的工作。我们期待成为生态系统的一部分。因为我们在开放源代码方面下了很大功夫,所以我很高兴看到社区给我们带来什么,特别是在更高级别的软件包领域。

多语言。就像使用 Java 和.NET 一样,Pulumi 运行时的架构可以支持多种语言,并以目标语言的所有方面(风格、语法、软件包等)的惯用方式来实现。因为我们是开源的,任何人都可以贡献自己的力量。

混合云。我们的云对象模型是一个强大的基础,可以支持任何云提供商。这提供了一个统一的编程模型,工具和控制平面,用于在任何地方管理云软件。如果仅仅是为了让一个简单的基于容器的应用程序在生产中运行起来,没有必要学习三种不同的 YAML 方言和五种不同的 CLI。

云对象模型。这个底层云对象模型为您的云计算构建方式提供了丰富的视图。所得到的对象使用程序中的依赖关系组成一个 DAG,系统可以分析和理解这些依赖关系以提供洞察力,这是我们打算随着时间的推移解锁复杂的静态分析和可视化的功能。

可重复使用的组件。由于拥有真正的语言,我们可以构建更高层次的抽象。我最喜欢的例子之一是帮助我们的客户定期从部署中排除 1000 行 YAML,这是我们的 AWS 基础架构软件包。它采用 AWS 最佳实践来设置虚拟私有云,并提供专用子网和多可用区域支持,并将其转变为几行代码以配置整个网络:

import * as awsinfra from "@pulumi/aws-infra";
let network = new awsinfra.Network(`${prefix}-net`, {
    numberOfAvailabilityZones: 3, // Create subnets in many AZs
    usePrivateSubnets: true,      // Run inside private per-AZ subnets
});

迄今为止,我最喜欢的成功案例是将客户的 25,000 行 AWS CloudFormation YAML 文件(其中使用无服务器、容器、基础设施和三个自定义部署管道)使用 500 行 TypeScript 和一个 Pulumi 的持续部署架构来替换。这不仅仅使得公司所有工程师都可以理解的代码变得少得多,这样他们可以将过去需要花费数周时间才能完成的事情现在用一个下午就可以搞定,而且现在可以在任何云或原生的 Kubernetes 上运行,而不仅是在 AWS。管理团队的 CloudFormation 堆栈,而不是一个工作量过饱和的工程师,整个团队可以更加高效。

统一的容器构建 / 发布管道。尝试将容器投入生产时有个问题让我早就感到很沮丧,就是同步我的应用程序、容器和基础架构管理,因为每个容器都倾向于使用不同的工具。我们的云框架演示了一个集成的工作流程,在这个工作流程中,只需简单地运行 Pulumi 构建、diff、推送和拉取新的容器镜像,所有这些都经过精心安排,以消除停机时间。

**Lambda 无服务器功能 **。 AWS 的取了个好名字:Lambda。在 Pulumi 中,我现在可以用我最喜欢的语言使用 lambda 表达式来编写我的无服务器函数,而不需要一行 YAML:

import * as aws from "@pulumi/aws";
import * as serverless from "@pulumi/aws-serverless";
let topic = new aws.sns.Topic("topic");
serverless.cloudwatch.onEvent("hourly", "rate(60 minutes)", event => {
    const sns = new (await import "aws-sdk").SNS();
    return sns.publish({
        Message: JSON.stringify({ event: event }),
        TopicArn: topic.id.get(),
    }).promise();
});

此功能允许您捕获对变量的引用:常量、配置设置或加密,甚至可以引用其他资源,以便与它们进行通信。当你第一次这样做的时候,我保证你会有一个 “哇塞” 的时刻,将无服务器连接到你写过的每一个事件驱动的代码片段。

使用 API 的资源。因为我可以捕获对其他云资源的引用,所以我可以在其上创建 API 以使它们更易于在我的运行时代码中使用。这使得 “演员般的” 编程模型无需处理配置和服务发现。

堆栈。 Pulumi 的核心是 “堆栈” 的概念。堆栈是您的云计算的独立实例,其资源和配置与所有其他堆栈不同。您可能有一堆用于生产、暂存和测试的堆栈,或者可能是每个单一租户的环境。Pulumi 的 CLI 使得启动和卸载大量堆栈变得轻而易举。这会打开以前可能没有尝试过的工作流,例如每个开发人员都拥有自己的堆栈,将新堆叠起来(并拆除)以测试每个 Pull 请求,甚至将服务的层拆分成多个链接在一起的堆栈。

我将在未来的博客文章介绍如何做。现在 Pulumi 已经公开,期望在接下来的几天和几周内听到更多的消息。我希望这能让您更好地了解整体平台,其方法和独特优势。

下一步是什么?

我们希望通过 Pulumi,开发人员和 DevOps 团队都将体验到云的复兴。构建强大的云软件将更加愉快、更高效、更具协作性。现代云计算软件将从代码孤岛转变为等量的配置胶水,成为优雅的分布式系统。

这是一个难题。我绝不会说我们已经解决了它。我确实相信 Pulumi 是我亲身见过并希望最接近我心目中的云开发平台。在这个激动人心的时刻,投注于语言将使我们所有人 “站在巨人的肩膀上”,这让我感到乐观;语言总是一个安全的赌注。

今天很可能是我职业生涯中最激动人心的一天。我想感谢我们的团队和所有帮助过我们的人,放纵我们的疯狂想法并相信我们。

$ curl -fsSL https://get.pulumi.com | sh

我迫不及待想看看你将使用 Pulumi 构建的所有令人难以置信的东西。

参考

现在访问 或者直接运行:

Pulumi 官方文档
Pulumi 官网 - pulumi.com
Hello, Pulumi! - joeduffyblog.com
他的博客
Pulumi
Ballerina
Hello, Pulumi
云原生编程语言Pulumi