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.     } 

以上代码中所需的配置模块在一些其他配置内容中定义了 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.     "ID": "5txxg3fslf9g5z1o4i19vvmcr", 
  4.     "Version": { 
  5.       "Index": 12 
  6.     }, 
  7.     "CreatedAt": "2017–08–13T12:58:50.54021338Z", 
  8.     "UpdatedAt": "2017–08–13T12:58:50.54021338Z", 
  9.     "Spec": { 
  10.       "Name": "AWS_ACCESS_KEY_ID", 
  11.       "Labels": {} 
  12.     } 
  13.   } 

创建了 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

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

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