CNCF 会重蹈 OpenStack 的覆辙吗?

CNCF 会重蹈 OpenStack 的覆辙吗?

作者:莫非&刘玺元 2017-09-01 17:05:16

企业动态

OpenStack CNCF 执行董事 Dan Kohn 表示:CNCF 一直非常专注于确保所有成员在迅速扩张的组织中都有各自的代表性。CNCF 的最大优势是他们足够新兴,所以他们能够向前人学习,其的愿景是只犯新的错误, 而不是照搬过去的错误。所以推断 CNCF 会重蹈 OpenStack 的覆辙,这样的论断是错误的。

[[202023]]

CNCF(Cloud Native Computing Foundation),即云原生计算基金会,于 2015 年 7 月成立,隶属于 Linux 基金会,初衷围绕“云原生”服务云计算,致力于维护和集成开源技术,支持编排容器化微服务架构应用。

由于最近大佬级别的云提供商的加入,云原生计算基金会(CNCF)很快就站在了开源容器世界的中心。在过去的几个星期里, CNCF 吸引了微软和亚马逊的 Web 服务 (AWS)的加入。他们的加入对于这个本来就隶属于 Linux 基金会的组织来说,无疑是如虎添翼。

而伴随着 Kubernetes 的成功,和市场对于容器技术的需求逐渐扩大,CNCF 的声势也日渐浩大。微软和 AWS 相继加入 CNCF,对于 CNCF、开源和 Kubernetes 来说, 也是一个巨大的胜利。

尽管这些会给 CNCF 带来规模和潜在的影响,但组织仍然面临挑战。

CNCF 执行董事 Dan Kohn 表示:

CNCF 一直非常专注于确保所有成员在迅速扩张的组织中都有各自的代表性。CNCF 的最大优势是他们足够新兴,所以他们能够向前人学习,其的愿景是只犯新的错误, 而不是照搬过去的错误。所以推断 CNCF 会重蹈 OpenStack 的覆辙,这样的论断是错误的。

而对 OpenStack 来说,许多运营商早期的时候使用 OpenStack 来实现他们的 SDN 计划,而现在供应商社区则无法提供所需的解决方案。同时,OpenStack 存在的一些问题还归咎于它无法处理一些较大成员的不同需求。

而为了规避这样的问题,CNCF 留出了在供应商之上添加更多产品的余地,让社区来决定其有用性。这样他们的生存和死亡由自身的优势决定,但 OpenStack 社区人为地支撑着将死的平台。

同时,Dan Kohn 也承认 Kubernetes 一直处于爆炸性增长的状态。如果能管理这一增长,则能实现组织目前最大的成就。

Kubernetes 1.7.4 版本发布

[[202024]]

8 月 17 日, Kubernetes 1.7.4 版本发布,相比 1.7.3 版本共有 17 处明显变化,例如:

  • 修复创建或更新 ELB 会修改全局定义的 Security Group Bug
  • 修复 kubefed 在不同版本 RBAC 创建问题
  • 修复 API Server Watch Cache 中一个 Bug
  • Azure:允许 VNet 在一个单独的资源组中
  • Cluster Autoscaler -修复了与 taints 相关的问题,并更新了 kube – proxy cpu请求
  • 以 Stackdriver 模式收集来自 Heapster 的 Metrics
  • GCE:Bump GLBC 版本更新到 0.9.6
  • 更新 Heapster 版本 1.4.1

Docker Tips:将容器的文件重定向到您的 Docker 主机

[[202025]]

每隔一段时间,我都需要将容器的文件转存到我的 Docker 主机上。在这里向大家提供一种简单的方法。

有时为了调试,您可能想将容器内部的配置文件的内容复制到 Docker 主机,以便您在自己喜欢的代码编辑器中打开它,或将其发送给别人。这对于已经运行的 Docker 容器来说非常方便,并且您不希望用 volume 重新启动它,因为你想要立刻就获取这个文件。

完成以下两点你就可以达成目的:

  1. # 重写那个镜像的 Dockerfile 的 CMD, 来cat到你想要的文件 
  2. docker run --rm alpine cat /etc/hosts 

以上步骤将打印出容器的 /etc/hosts 文件的内容

  1. # 修改命令将该输出重定向到 Docker 主机上的新文件。 
  2. docker run --rm alpine cat /etc/hosts > /tmp/alpinehosts 

你可以运行命令ls -la /tmp | grep alpinehosts来进行验证。

当然,如果您在 Docker 主机上运行 Windows 而不是 MacOS 或 Linux,则你的命令需要进行一些小的调整。例如,在 Windows 上不起作用。如果您使用 PowerShell 等,您将需要 Google 一下如何将输出重定向到文件。

另外,在这两种情况下,您都需要将Cat指令安装在 Docker 镜像中,但所有主要的 Linux 版本都已经默认安装了(包括 Alpine)。

从环境变量到 Docker secrets

1. 12 Factor app

12 Factor app 中的第三项告诉我们要将配置存储在环境中。

它还提供了以下内容的示例:

  • 资源处理数据库,Memcached 和其他后台服务
  • 对外部服务的认证,如 Amazon S3 或 Twitter
  • 部署的规范主机名

我们想知道如今是否仍然推荐这种方法,并且使用它的风险程度。在这篇文章中,我们将一个简单的应用程序为例,看看如何修改它以更安全的方式来处理这些敏感的信息。

2. 在 Docker 世界运行的应用

在过去的几年中,我们看到了许多应用在开发和部署方面都产生了变化。这主要是因为Docker 平台的流行。应用程序现在主要采用微服务体系结构:它们由多个隔离式服务组成。使用 Docker Compose 文件格式定义微服务应用程序现在非常普遍。此格式定义了服务及其使用的组件(网络,卷,…)。以下是用于定义由以下组成的 Web 应用程序的 Docker Compose 文件(其默认名称为 docker-compose.yml)的简单示例:

  1. version: "3.3" 
  2. services: 
  3.   db: 
  4.     image: mongo:3.4 
  5.     network: 
  6.       - backend 
  7.     volumes: 
  8.       — mongo-data:/data/db 
  9.     deploy: 
  10.       restart_policy: 
  11.         condition: on-failure 
  12.   api: 
  13.     image: lucj/api:1.0 
  14.     networks: 
  15.       - backend     
  16.     deploy: 
  17.       restart_policy: 
  18.         condition: on-failure 
  19.   web: 
  20.     image: lucj/web:1.0 
  21.     networks: 
  22.       - frontend 
  23.       - backend     
  24.     deploy: 
  25.       restart_policy: 
  26.         condition: on-failure     
  27. volumes: 
  28.   mongo-data: 
  29. networks: 
  30.   frontend:   
  31.   backend: 

3. 使用环境变量处理 AWS 凭据

当我们深入了解 api 服务,假设这需要 AWS S3 的一些凭据。api 服务是在 Node.js 中编写的。使用 aws-sdk npm 模块连接到 Amazon API 的代码类似于以下内容。

  1. // Middleware handling user's profile images 
  2. const AWS = require('aws-sdk'), 
  3.       config = require(‘../config’), 
  4.       aws_config = config.amazon; 
  5. // Configure AWS SDK 
  6. AWS.config.update(aws_config.credentials); 
  7. // Define S3 bucket 
  8. var s3Bucket = new AWS.S3( { params: {Bucket: aws_config.bucket} } ) 
  9. ... 
  10. // Upload image object 
  11. s3Bucket.putObject(obj, function(err){ 
  12.     if (err) { 
  13.         log.error(err); 
  14.         return next(err); 
  15.     } else { 
  16.           return next(); 
  17.     } 
  18. } 

以上代码中所需的配置模块在一些其他配置内容中定义了 AWS 凭据。我们在这里看到,每个元素从一个环境变量获取它的值。

  1. // config.js 
  2. module.exports = { 
  3. ... 
  4.   "amazon":{ 
  5.     "credentials": { 
  6.       "accessKeyID": process.env.AWS_ACCESS_KEY_ID, 
  7.       "secretAccessKey": process.env.AWS_SECRET_ACCESS_KEY, 
  8.     }, 
  9.     "bucketName": process.env.AWS_BUCKET_NAME 
  10.   } 
  11. }; 

然后,当通过 Docker Compose 运行应用程序时,我们通过环境键指定这些环境变量。

  1. api: 
  2.  image: lucj/api:1.0 
  3. networks: 
  4.       - backend     
  5.     deploy: 
  6.       restart_policy: 
  7.         condition: on-failure 
  8.  environment: 
  9.    — AWS_BUCKET_NAME=BucketName 
  10.    — AWS_ACCESS_KEY_ID=AccessKeyID 
  11.    — AWS_SECRET_ACCESS_KEY=SecretAccessKey 

这的确是处理这个问题的一个方式,但是,将这些敏感信息以纯文本格式化是非常危险的。

4. 处理具有 Docker secrets 的 AWS 凭据

有几种方式可以以安全的方式处理这些信息。使用 Docker secrets 就是其中之一。

我们不再在环境变量中以纯文本定义凭据信息,而是从中创建 docker secrets。

  1. $ echo "BucketName"| docker secret create AWS_BUCKET_NAME - 
  2. vjp5zh8hwb9dqkvohtyvtifl1 
  3. $ echo "AccessKeyID" | docker secret create AWS_ACCESS_KEY_ID - 
  4. 5txxg3fslf9g5z1o4i19vvmcr 
  5. $echo "SecretAccessKey"|docker secret create AWS_SECRET_ACCESS_KEY - 
  6. v8g65iwcx1eb6uuwsjzknyi7g 

secrets 创建成功。使用docker secret ls。

  1. $ docker secret ls 
  2. ID NAME CREATED UPDATED 
  3. 5x..vm AWS_ACCESS_KEY_ID About a minute ago About a minute ago 
  4. v8..7g AWS_SECRET_ACCESS_KEY About a minute ago About a minute ago 
  5. vj..l1 AWS_BUCKET_NAME About a minute ago About a minute ago 

但他们的内容无法被检索。例如,如果我们检查与关键字 AWSACCESSKEY_ID 相关联的 secret,我们只会获取元数据,而不是其实际内容。

  1. $ docker secret inspect 5txxg3fslf9g5z1o4i19vvmcr 
  2. [ 
  3.   { 
  4.     "ID": "5txxg3fslf9g5z1o4i19vvmcr", 
  5.     "Version": { 
  6.       "Index": 12 
  7.     }, 
  8.     "CreatedAt": "2017–08–13T12:58:50.54021338Z", 
  9.     "UpdatedAt": "2017–08–13T12:58:50.54021338Z", 
  10.     "Spec": { 
  11.       "Name": "AWS_ACCESS_KEY_ID", 
  12.       "Labels": {} 
  13.     } 
  14.   } 
  15. ] 

创建了 secret 以后,我们就可以在 Docker Compose 文件中引用它们。

  1. secrets: 
  2.   AWS_BUCKET_NAME: 
  3.     external: true 
  4.   AWS_ACCESS_KEY_ID: 
  5.     external: true 
  6.   AWS_SECRET_ACCESS_KEY: 
  7.     external: true  

在 Docker Compose 文件中,我们还需要修改 api 服务的描述,以便使用这些 secrets。

  1. api: 
  2.  image: lucj/api:2.0 
  3.  secrets: 
  4.    — AWS_BUCKET_NAME 
  5.    — AWS_ACCESS_KEY_ID 
  6.    — AWS_SECRET_ACCESS_KEY 
  7.  networks: 
  8.    — backend 
  9.  deploy: 
  10.    restart_policy: 
  11.      condition: on-failure 

当一个服务需要访问一个 secret 时,默认情况下,它被安装在该服务的每个容器中的临时文件系统中。

由于我们的应用程序仅在此阶段检查环境变量,因此需要进行更新。

这可以用一个简单的模块来实现,只需要从`/run/secrets`中读取一个 secret。这在以下代码中说明。

  1. // secrets.js 
  2. const fs = require("fs"), 
  3.       util = require("util"); 
  4. module.exports = { 
  5.   // Get a secret from its name 
  6.   get(secret){ 
  7.     try{ 
  8.       // Swarm secret are accessible within tmpfs /run/secrets dir 
  9.       return fs.readFileSync(util.format(“/run/secrets/%s”, secret), "utf8").trim(); 
  10.      } 
  11.      catch(e){ 
  12.        return false; 
  13.      } 
  14.   } 
  15. }; 

然后,我们可以修改配置文件,以便它使用 secrets.js 模块的 get 函数:

  1. ... 
  2. "amazon":{ 
  3.   "credentials": { 
  4.     "accessKeyId": secrets.get(“AWS_ACCESS_KEY_ID”) || process.env.AWS_ACCESS_KEY_ID, 
  5.     "secretAccessKey": secrets.get(“AWS_SECRET_ACCESS_KEY”) || process.env.AWS_SECRET_ACCESS_KEY, 
  6.   }, 
  7.  "bucket": secrets.get("AWS_BUCKET_NAME") || process.env.AWS_BUCKET_NAME 
  8.  } 

对于每个 key,我们首先检查它是否作为 secret 存在。如果没有的话,我们仍然使用环境变量。

【本文是51CTO专栏机构“道客船长”的原创文章,转载请通过微信公众号(daocloudpublic)联系原作者】

戳这里,看该作者更多好文

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/278324.html<

赞 (0)
管理的头像管理
上一篇2025-05-11 13:03
下一篇 2025-05-11 13:04

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注