为DevOps预订Kubernetes

图片您好,habrozhiteli! Kubernetes是现代云生态系统的关键元素之一。该技术提供了容器虚拟化的可靠性,可伸缩性和弹性。约翰·阿伦德尔(John Arundel)和贾斯汀·多明格斯(Justin Domingus)讨论了Kubernetes生态系统,并介绍了针对日常问题的行之有效的解决方案。您将逐步构建自己的基于云的应用程序,并创建支持该应用程序的基础结构,配置开发环境和连续部署管道,这对于处理以下应用程序将非常有用。

•从头开始使用容器和Kubernetes:学习该主题不需要特殊的经验。•启动您自己的集群,或从Amazon,Google等选择托管的Kubernetes服务。•使用Kubernetes管理容器生命周期和资源消耗。•针对成本,性能,弹性,功能和可伸缩性优化集群。•学习用于开发,测试和部署应用程序的最佳工具。•利用当前的行业惯例进行安全和控制。•在您的公司中实施DevOps原则,以便开发团队变得更加灵活,快速和高效。

这本书是给谁的?


这本书与负责服务器,应用程序和服务的管理部门的员工以及参与构建新的云服务或将现有应用程序迁移到Kubernetes和云的开发人员最相关。不用担心,不需要知道如何使用Kubernetes和容器-我们将教您一切。

经验丰富的Kubernetes用户也将发现很多发现:诸如RBAC,持续部署,敏感数据管理和可观察性等主题都得到了深入介绍。我们希望,无论您的技能和经验如何,本书的页面一定会对您有所帮助。

这本书回答什么问题


在本书的计划和编写过程中,我们与数百人讨论了云技术和Kubernetes,并与行业的领导者和专家以及绝对的初学者进行了交谈。以下是他们希望在本出版物中找到答案的单个问题。

  • “我对为什么要花时间在这项技术上感兴趣。她将帮助我和我的团队解决哪些问题?”
  • “ Kubernetes似乎很有趣,但是进入门槛很高。准备一个简单的示例并不困难,但是进一步的管理和调试却令人恐惧。我们希望就人们在现实生活中如何管理Kubernetes集群以及我们可能遇到的问题获得可靠的建议。”
  • “主观建议会有所帮助。Kubernetes生态系统为新手团队提供了太多选择。当可以通过多种方式完成同一件事时,如何理解哪一个更好?如何做出选择?”

而且,可能是所有问题中最重要的:

  • “如何在不中断我的公司的情况下使用Kubernetes?”

摘抄。配置和秘密对象


将Kubernetes应用程序的逻辑与其配置(即可能随时间变化的任何值或设置)分开的功能非常有用。配置值通常包括用于特定环境的设置,第三方服务的DNS地址以及用于身份验证的凭据。

当然,所有这些都可以直接放在代码中,但是这种方法不够灵活。例如,要更改配置值,则必须重新组装和部署代码。更好的解决方案是将配置与代码分离,并从文件或环境变量中读取配置。

Kubernetes提供了几种不同的方法来管理您的配置。首先,您可以通过Pod Shell规范中指定的环境变量将值传递给应用程序(请参阅第192页的『环境变量』部分)。其次,可以使用ConfigMap和Secret对象将配置数据直接存储在Kubernetes中。

在本章中,我们将详细检查这些对象,并考虑使用示例演示应用程序管理配置和敏感数据的一些实用方法。

更改配置时更新Pod Shell


假设您的集群有一个部署,并且您想在其ConfigMap中更改一些值。如果您使用Helm图表(请参阅第102页的“ Helm:Kubernetes的软件包管理器”部分),则可以检测配置更改,并通过一种巧妙的技巧重新启动Pod Shell。将以下注释添加到您的部署规范中:

checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
       | sha256sum }}

现在,部署模板包含配置参数的校验和:更改参数后,总和将更新。如果运行helm upgrade命令,Helm将发现部署规范已更改,然后重新启动所有Pod Shell。

Kubernetes的机密数据


我们已经知道ConfigMap对象提供了一种用于在集群中存储和访问配置数据的灵活机制。但是,大多数应用程序具有机密信息:例如密码或API密钥。也可以将其存储在ConfigMap中,但是这样的解决方案并不理想。

相反,Kubernetes提供了一种旨在存储敏感数据的特殊对象:秘密。接下来,我们考虑一个如何在演示应用程序中应用此对象的示例。

首先,请查看Secret对象的Kubernetes清单(请参见hello-secret-env / k8s / secret.yaml):

apiVersion: v1
kind: Secret
metadata:
    name: demo-secret
stringData:
    magicWord: xyzzy

在此示例中,magicWord私钥为xyzzy(en.wikipedia.org/wiki/Xyzzy_(computing))。xyzzy一词通常在计算机领域非常有用。与ConfigMap相似,您可以在Secret对象中放置许多键和值。在这里,为简单起见,我们仅使用一个键值对。

使用Secret对象作为环境变量


与ConfigMap一样,Secret对象可以在容器中作为环境变量或磁盘上的文件使用。在以下示例中,我们将为环境变量分配Secret的值:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-env
          ports:
             - containerPort: 8888
          env:
             - name: GREETING
               valueFrom:
               secretKeyRef:
                  name: demo-secret
                  key: magicWord


在演示存储库中运行以下命令以应用清单:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created

和以前一样,将本地端口重定向到部署以在浏览器中查看结果:

kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

当您打开本地主机地址:9999 /时,您应该看到以下内容:

The magic word is "xyzzy"

将Secret对象写入文件


在此示例中,我们将Secret对象作为文件附加到容器。该代码位于演示存储库的hello-secret-file文件夹中。

要将Secret连接为文件,我们将使用以下部署:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-file
          ports:
              - containerPort: 8888
          volumeMounts:
              - name: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - name: demo-secret-volume
        secret:
           secretName: demo-secret

如第25页的“从ConfigMap对象创建配置文件”小节中所述。240,我们创建一个卷(在本例中为demo-secret-volume)并将其连接到volumeMounts规范部分中的容器。MountPath是/ secrets,因此Kubernetes将为该文件夹的Secret对象中定义的每个键值对创建一个文件。

在我们的示例中,我们仅定义了一个名为magicWord的键值对,因此清单将创建一个/ secrets / magicWord文件,该文件中的机密数据为只读。

如果以与上一个示例相同的方式应用此清单,则应获得相同的结果:

The magic word is "xyzzy"

读取机密对象


在上一节中,我们使用了kubectl describe命令来显示ConfigMap的内容。你能对秘密做同样的事情吗?

kubectl describe secret/demo-secret
Name:          demo-secret

Namespace:      default
Labels:             <none>
Annotations:
Type:               Opaque

Data
====
magicWord: 5   bytes

请注意,数据本身不会显示。Kubernetes中的秘密对象是不透明的类型:这意味着它们的内容不会显示在kubectl描述,日志条目和终端的输出中,从而不可能意外泄露敏感信息。

要以YAML格式查看敏感数据的编码版本,请使用kubectl get命令:

kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
   magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque

base64


什么是eHl6enk =,与我们的原始值完全不同?这实际上是一个秘密对象,以base64编码表示。 Base64是一种用于将任意二进制数据作为字符串的编码方案。

由于机密信息可能是二进制的,因此无法进行输出(例如,在TLS加密密钥的情况下),因此机密对象始终以base64格式存储。

文本beHl6enk =是我们的秘密单词xyzzy的base64编码版本。如果在终端中执行base64 --decode命令,则可以验证这一点:

echo "eHl6enk=" | base64 --decode
xyzzy

因此,尽管Kubernetes可以保护您避免在终端或日志文件中意外显示机密数据,但如果您有权读取特定名称空间中的Secret对象,则可以以base64格式接收此数据并随后对其进行解码。

如果需要在base64中编码一些文本(例如,将其放入Secret中),请使用不带参数的base64命令:

echo xyzzy | base64
eHl6enkK

访问秘密对象


谁可以读取和编辑Secret对象?这由访问控制机制RBAC确定(我们将在第258页的“基于角色的访问控制简介”中详细讨论)。如果使用不存在或未启用RBAC系统的群集,则所有用户和容器都可以访问所有Secret对象(我们将在后面解释,没有RBAC的情况下您不应有任何工业群集)。

被动数据加密


那些能够访问Kubernetes存储所有信息的etcd数据库的人呢?他们是否可以读取敏感数据而无权通过API读取Secret对象?

从1.7版本开始,Kubernetes支持被动数据加密。这意味着etcd内部的机密信息以加密形式存储在磁盘上,即使直接访问数据库的人也无法读取。要对其进行解密,您需要仅Kubernetes API服务器具有的密钥。在正确配置的群集中,必须启用被动加密。

通过执行以下操作,检查被动加密在您的群集中是否有效:

kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
        --experimental-encryption-provider-config=...

如果看不到experimental-encryption-provider-config标志,则不会启用被动加密。使用Google Kubernetes Engine或其他Kubernetes管理服务时,您的数据将使用其他机制进行加密,因此该标志将不存在。请与您的Kubernetes提供者联系,以查看etcd的内容是否已加密。

机密数据存储


有一些Kubernetes资源绝对不能从集群中删除:例如,特别重要的Secret对象。您可以使用Helm Manager提供的注释来防止资源被删除:

kind: Secret
metadata:
    annotations:
        "helm.sh/resource-policy": keep

秘密对象管理策略


在上一节的示例中,敏感数据被存储在集群中后立即受到保护,以防止未经授权的访问。但是在清单文件中,它们以纯文本格式存储。

切勿将机密信息放在版本控制系统中的文件中。在将其应用于Kubernetes集群之前如何安全地管理和存储此信息?

您可以选择任何工具或策略来处理应用程序中的敏感数据,但仍然至少需要回答以下问题。

  • 在哪里存储敏感数据,以便高度访问?
  • 如何使敏感数据可用于活动应用程序?
  • , ?


John Arundel是一位在计算机行业拥有30年经验的顾问。他写过几本书,并与来自不同国家的许多公司合作,为他们提供基于云的基础架构和Kubernetes的建议。在业余时间,他喜欢冲浪,射击好手枪和业余弹钢琴。住在英格兰康沃尔郡的一间神话般的小屋里。

Justin Domingus是一位使用Kubernetes和云技术在DevOps环境中工作的系统管理工程师。他喜欢花时间在户外,喝咖啡,捉螃蟹,坐在电脑旁。与一只漂亮的猫,一个更漂亮的妻子和兼职最好的朋友艾德丽安(Adrienne)一起住在华盛顿州的西雅图。

»有关这本书的更多信息,请访问出版商的网站
» 目录
» Khabrozhiteley的节录

-优惠券可享受25%的折扣-Kubernetes

支付纸本版本后,会通过电子邮件发送电子书。

All Articles