你好,我是潘野。
今天这次加餐,我为你整理了整门课程的思考题答案,希望对你有所帮助。建议你一定要先自己独立思考、动手编码以后,再对照参考答案,这样学习效果会更好。
因为课程里很多题目都涉及代码,只听音频的话很难理解,所以我建议你直接看文稿。我把每节课的题目和答案放在了一起,每节课的超链接也放在了文稿里,方便你跳转复习。
模块一 基础篇
第 2 讲
题目
请你尝试参考Terraform的官方文档,写一段Terraform的代码,在AWS上启动一个EC2的实例,然后在这个实例中启动http服务并对外提供服务。
答案
https://github.com/cloudnative-automation/cloud-automation/blob/main/example/webserver/main.cf
第 3 讲
题目
这一讲,我提到容器环境中重启主机这有可能会造成一些应用的中断。你知道什么样的情况会造成应用中断么?我们又该如何预防?
答案
如果同学们没有特意为Deployment或者StatefulSet设置过特殊的调度策略,你可能会遇到多个pods被调度到一台机器上的场景。此时重启主机,可能会因为应用容量不足而导致性能下降,甚至服务不可用的情况。
建议你在Deployment或者StatefulSet中设置反亲和性或者Pod拓扑分布约束,以保证pod尽可能分散调度,同时启用PDB,保证最小存活的pod数量。
https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/topology-spread-constraints/
第 4 讲
题目
结合上一讲中我们介绍的 Terraform,你能否写一段代码,同时在 AWS 和 Azure 上分别启动一个虚拟机,并在其中启动一个 HTTP 服务?
答案
https://github.com/cloudnative-automation/cloud-automation/tree/main/example/webserver
第 5 讲
题目
GitOps 并不是一种万能的解决方案,它同样存在一些挑战和限制,你能想到有哪些限制吗?
答案
GitOps依赖于大量的自动化,这需要投入大量的时间和精力来编写、测试和维护脚本和配置。这可能会对团队的资源和能力提出较高的要求。
GitOps通常依赖于特定的工具和平台,例如Kubernetes和云服务。这可能限制了GitOps的适用范围,对于不使用这些工具和平台的环境,可能无法直接应用GitOps。
模块二 CI/CD实战篇
第 6 讲
题目
今天,我们使用了 Terraform 在公有云中启动了一个 Kubernetes 集群。但实际工作中,公司里只有一个集群的情况极少,往往我们面对十多个、甚至上百个 Kubernetes 集群,那么我们要如何管理多个集群的 Terraform 代码呢?
答案
一点小Tips,这个思考题是今天课程的精髓所在,答案可以在我们课程代码的其他分支里找一找。
第 7 讲
题目
课程里,我们将 Terraform 状态文件存放在 S3 这步中,S3 存储桶是我们手动在页面上创建出来的,你能否自己写一段 Terraform 代码,通过 GitHub Action 来创建出 S3 存储桶呢?
答案
参考代码仓库中 S3存储桶 的代码以及说明。
第 8 讲
题目
在terraform init的这个环节中,我们加载模块代码往往需要花费 5 到 10 分钟。你有哪些手法可以加速加载模块代码么?
答案
一般有两种做法。
第一种是将terrafrom里涉及到的模块预先存在CI/CD环境中,比如这一讲放在了Docker镜像中,上一讲则是放在Github Runner所在的虚拟机中。
第二种做法是将terraform里涉及的模块放在公司内网环境中,在terrafrom init的时候直接从内网的服务器中加载。
第 9 讲
题目
请你根据 代码仓库 里提供的样例,来完成其他集群组件的部署。
---
clusterURL: 127.0.0.1
addons:
namespaces:
default: addons-system
grafana:
enabled: false
names:
app: grafana
chart: grafana
repoURL: https://grafana.github.io/helm-charts
targetVersion: 7.2.4
ingressNginx:
enabled: false
names:
app: ingress-nginx
chart: ingress-nginx/ingress-nginx
repoURL: https://kubernetes.github.io/ingress-nginx
targetVersion: 4.9.0
答案
https://github.com/cloudnative-automation/addon-manager/tree/ 09
第 10 讲
题目
请你根据这一讲提供的 Azure Service Operator 讲解,自己动手写一个申请 PostgreSQL 的配置。
答案
apiVersion: database.crossplane.io/v1alpha1
kind: PostgreSQLInstanceClass
metadata:
name: postgresql-standard
namespace: app-project1-dev
classRef:
kind: RDSInstanceClass
apiVersion: database.aws.crossplane.io/v1alpha2
name: rdspostgresql-standard
namespace: aws-infra-dev
---
apiVersion: database.aws.crossplane.io/v1alpha2
kind: RDSInstanceClass
metadata:
name: rdspostgresql-standard
namespace: aws-infra-dev
specTemplate:
class: db.t2.small
masterUsername: masteruser
securityGroups:
- # sg-ab1cdefg
- # sg-05adsfkaj1ksdjak
size: 20
engine: postgresql
providerRef:
name: example
namespace: aws-infra-dev
reclaimPolicy: Delete
模块三 进阶篇
第 11 讲
题目
假如你的公司计划将部分业务迁移到公有云,你觉得要如何评估该方案的成本和效益呢?
答案
影响成本的因素可不少,我们需要仔细梳理。
- 业务类型和需求:不同的业务,对资源的需求也不一样。比如,需要大量计算资源的业务,在公有云上可能比私有云更贵。
- 资源使用量:用得越多,花得就越多。合理规划资源,才能避免浪费。
- 数据敏感性:敏感数据需要额外防护,这也会增加成本。
- 技术支持:想要更完善的技术支持,需要额外付费。
- 地域:不同地区的云服务价格可能不同。选择合适的地域,可以省点钱。
- 应用架构:优化应用架构,可以更好地利用公有云的特性,从而降低成本。
- 公有云服务商的定价模式:不同的服务商,定价模式也不同。货比三家,才能选到最划算的。
- 成本管理策略:制定合理的成本管理策略,可以有效控制成本。
评估步骤和方法:
- 明确业务需求:你想把哪些业务搬到公有云?这些业务对资源有什么需求?
- 分析资源使用量:你目前使用了多少资源?未来可能需要多少资源?
- 评估数据敏感性:你的数据中有多少敏感数据?需要哪些防护措施?
- 选择合适的技术支持:你需要什么样的技术支持?愿意为此支付多少费用?
- 选择合适的地域:你的业务主要面向哪些用户?选择哪个地域可以更好地服务用户?
- 优化应用架构:如何改造应用架构,才能更好地利用公有云的特性?
- 公有云服务商的定价模式对比:哪家服务商的定价模式更符合你的需求?
- 制定成本管理策略:如何监控和控制成本?
评估结论和建议:
根据以上评估,可以得出公有云方案是否比传统方案更具成本效益的结论。如果结论是肯定的,可以制定具体的迁移方案。
以下是一些建议:
- 在迁移之前,先进行试用,以评估公有云方案的性能和成本。
- 选择合适的云服务商,并签订有利的合同。
- 制定合理的资源使用计划,避免浪费。
- 定期监控和分析成本,并进行必要的调整。
希望这些信息能帮你做出明智的决策!
第 12 讲
题目
今天的课程里,我提到了HPA的一些不足,比如在真正流量突发的时候,有可能会遇到反应慢半拍,无法及时跟上扩展,导致应用服务中断,那你有哪些思路来解决这个问题呢?
答案
这里我提供三个方面的应对思路供你参考。
-
优化监控指标和策略。
-
使用更灵敏的监控指标,并结合多维度的指标进行综合判断,以更快速地识别流量突发情况。
- 调整 HPA 策略,缩短扩缩容的评估周期和步长,使 HPA 能够更迅速地做出反应。
-
可以考虑使用预测模型,根据历史数据和当前趋势预测未来的流量需求,提前进行扩容。
-
结合其他扩容手段
-
使用 Pod 预热机制,提前创建并预热 Pod,以便在需要时快速投入使用。
-
使用 KEDA 等事件驱动的扩容工具,可以根据事件触发扩容,例如队列长度、消息积压等。
-
优化应用架构。
-
使用微服务架构,将应用拆分成多个独立的服务,可以更细粒度地进行扩缩容。
- 使用无状态服务,可以避免扩容时需要进行数据迁移。
第 13 讲
题目
你觉得 KEDA 在哪些场景下可以发挥最大价值?
答案
- 电商平台:在双十一等购物高峰期,电商平台的流量会激增。KEDA可以根据 HTTP 请求的负载自动扩缩容应用,以确保平台的稳定性和性能。
- 游戏服务器:游戏服务器的负载会随着玩家数量的增加而增加。KEDA 可以根据玩家登录事件自动扩缩容服务器,以确保玩家的游戏体验。
- 社交媒体平台:社交媒体平台会产生大量的用户消息。KEDA 可以根据消息队列中的消息数量自动扩缩容应用,以确保消息能被及时处理。
第 15 讲
题目
回顾一下这个模块的内容,应用层面的水平扩缩容HPA,垂直扩缩容VPA,集群层面的扩缩容Karpenter与Cluster Autoscaler,它们适用的场景与缺陷分别是什么。
答案
- HPA:应用水平扩容,但是Kubernetes原生只支持CPU/Memory指标,需要使用KEDA或者Prometheus-Adapter来配合不同的指标达到水平扩容。
- VPA:应用垂直扩容,对应用有要求,能够接受中断。
- Cluster Autoscaler:Kubernetes社区原生的公有云的集群扩缩容方案。
- Karpenter:AWS的集群扩缩容方案。只能用于AWS,暂时不能用于其他厂商。
模块四 安全篇
第 16 讲
题目
在Kubernetes集群和容器级别,具体有哪些安全软件来完成安全防护?
答案
这里我提供一些常见的工具供你参考。
Kubernetes 集群级别的工具包括Open Policy Agent、NetworkPolicy、Istio和Sealed secrets。
容器级别的工具有Clair 镜像扫描,以及Kubernetes Security Context。
第 17 讲
题目
课程里举了两个场景,你还知道哪些场景适合使用vault?
答案
Vault 可以用于各种需要管理敏感数据的场景,例如以下场景。
- 证书管理
- 数据库密码管理
- API 密钥管理
- SSH 密钥管理
- 云服务凭证管理
- 应用程序配置管理
- ……
第 18 讲
题目
不同类型的敏感数据(如数据库凭证、API密钥等)对租赁时间的需求可能不同。想一想,我们应该如何优化租赁与回收策略呢?
答案
我们一般从事前,事中,事后三个方面入手。
事前
首先,对所有敏感数据进行分类。根据数据的敏感性、使用频率和业务影响进行分级。
然后,根据数据的分类和风险评估,为不同类型的数据定制租赁时间。例如,对于经常变更的临时访问令牌,设置较短的租赁时间;对于稳定使用的API密钥,设置较长的租赁时间。
事中
接下来设置警报机制,当租赁即将到期或检测到异常使用模式时,自动通知系统管理员和数据所有者。对于到期或不再使用的租赁,自动化回收过程,确保敏感数据不被遗留在系统中。
事后
- 审计与合规:确保所有回收操作都有审计记录,以支持合规性要求和安全审计。
- 定期评审:定期评审和更新租赁与回收策略,以适应新的业务需求和技术变化。
第 19 讲
题目
除了Cert-Manager,你还有哪些手段可以从Vault中自动获取证书?
答案
除了使用Cert-Manager,还有多种其他手段可以从HashiCorp Vault中自动获取和管理TLS证书,适用于不同的应用和环境。以下是一些常见的方法。
Vault Agent
Vault Agent 是一个预配置的客户端守护进程,可以自动化从Vault获取证书的过程。它可以配置为自动认证并续订秘钥和证书,不仅限于Kubernetes,也适用于其他各种环境。
Terraform
使用Terraform管理Vault资源可以自动化证书的配置和部署。Terraform提供了一种声明式的方式来管理和编排IT资源,包括TLS证书。通过编写Terraform配置文件,我们可以自动从Vault请求证书,并将其部署到需要的环境中。
Ansible
Ansible是一个自动化平台,可以用来自动化证书的部署和管理。通过编写Ansible playbook,可以从Vault中获取证书,并配置到各种服务器和应用中。Ansible的Vault模块可以简化这一过程。
第 20 讲
题目
请你用Gatekeeper定义一个策略,规则是容器启动的时候禁止使用host network。
答案
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: denyhostnetwork
spec:
crd:
spec:
names:
kind: DenyHostNetwork
validation:
legacySchema: true
openAPIV3Schema:
properties:
hostNetwork:
type: boolean
max:
type: integer
min:
type: integer
targets:
- rego: |
package hostnetwork
violation[{"msg": msg, "details": {}}] {
input_share_hostnetwork(input.review.object)
msg := sprintf("hostNetwork is not allowed, pod: %v", [input.review.object.metadata.name])
}
input_share_hostnetwork(o) {
o.spec.hostNetwork
}
input_containers[c] {
c := input.review.object.spec.containers[_]
}
input_containers[c] {
c := input.review.object.spec.initContainers[_]
}
input_containers[c] {
c := input.review.object.spec.ephemeralContainers[_]
}
target: admission.k8s.gatekeeper.sh
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: DenyHostNetwork
metadata:
name: deny-hostnetwork
spec:
enforcementAction: deny
match:
excludedNamespaces:
- kube-system
kinds:
- apiGroups:
- ""
kinds:
好,以上就是这次加餐的全部内容。也欢迎你继续在留言区参与交流和讨论。