ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

90DaysOfDevOps 第 61 天:使用 Terraform 管理 Kubernetes 集群内资源与多环境部署

90DaysOfDevOps 第 61 天:使用 Terraform 管理 Kubernetes 集群内资源与多环境部署 文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载在 90DaysOfDevOps 的 IaC基础设施即代码学习路线中前几课已经分别用 Terraform 部署了 VirtualBox 虚拟机与 Docker 容器。本篇第 61 天的内容将把 Terraform 的使用范围延伸到 Kubernetes不仅可以用 Terraform 编排集群本身还能直接管理集群内部的对象namespace、deployment、service并通过terraform workspaces或目录文件结构两种方式将同一套代码复用到 dev、staging、production 多环境。读完本篇你将掌握 Kubernetes Provider 的核心用法、一条完整的 nginx 应用部署链路以及多环境隔离方案的选择依据。从虚拟机、容器到 Kubernetes为什么用 Terraform 管理集群内对象到目前为止本部分课程已经演示过两条 IaC 路径用 Terraform 定义并部署 VirtualBox 虚拟机见 virtualbox.tf以及用 Terraform 拉取 nginx 镜像并启动 Docker 容器见 docker.tf。它们的原则一致用代码声明最终应该长什么样再由工具执行部署。本课的主题是第三条路径——Kubernetes。Terraform 可以从两个层面与 Kubernetes 交互集群层面用于创建、销毁整个 Kubernetes 集群。作者本人曾用它跨三大主流云厂商部署演示用集群。集群内部层面管理集群中的对象例如 namespace、deployment、service 等。这可以通过两个官方 Provider 实现Kubernetes Provider直接管理原生的 Kubernetes 资源对象Helm Provider管理 Helm Chart 的部署与发布。为什么不用 kubectl 而用 Terraform前面课程已经展示过kubectl的用法但在 Kubernetes 环境中使用 Terraform 仍有其独特价值统一的工作流如果你已经用 Terraform 部署了集群那么可以继续用同一套工作流和工具来管理集群内部资源无需在 kubectl 与 Terraform 之间来回切换心智模型生命周期管理Terraform 不只是一次性供给工具它同时支持变更、更新与删除。通过 state 文件跟踪资源现状任何修改都能以声明式方式收敛到目标状态。简单 Kubernetes 实战用 Terraform 部署 nginx 到 minikube为了延续前几课的演示风格本课同样选用 minikube 作为本地 Kubernetes 环境。完整的配置文件保存在仓库的 kubernetes.tf 中与文档中的示例完全一致。它的目标很明确定义 Kubernetes Provider、指向本机 kubeconfig、创建一个名为nginx的 namespace再创建一个 2 副本的 deployment最后暴露一个 service。完整的kubernetes.tf内容如下terraform { required_providers { kubernetes { source hashicorp/kubernetes version 2.0.0 } } } provider kubernetes { config_path ~/.kube/config } resource kubernetes_namespace test { metadata { name nginx } } resource kubernetes_deployment test { metadata { name nginx namespace kubernetes_namespace.test.metadata.0.name } spec { replicas 2 selector { match_labels { app MyTestApp } } template { metadata { labels { app MyTestApp } } spec { container { image nginx name nginx-container port { container_port 80 } } } } } } resource kubernetes_service test { metadata { name nginx namespace kubernetes_namespace.test.metadata.0.name } spec { selector { app kubernetes_deployment.test.spec.0.template.0.metadata.0.labels.app } type NodePort port { node_port 30201 port 80 target_port 80 } } }逐段解读这份配置Provider 声明required_providers锁定hashicorp/kubernetes且要求版本 2.0.0provider kubernetes块通过config_path指向~/.kube/config即复用本机 kubectl 的认证配置无需额外保存集群凭据namespace创建名为nginx的命名空间作为后续资源的隔离边界deployment通过replicas 2声明两个副本selector 与 template 使用一致的标签app MyTestApp这是 Kubernetes 将 Pod 与 Deployment 关联起来的关键容器镜像为nginx容器名nginx-container暴露 80 端口service类型为NodePortnode_port固定为30201将容器 80 端口映射到节点端口selector直接引用 deployment 模板中的标签值kubernetes_deployment.test.spec.0.template.0.metadata.0.labels.app实现了资源之间的显式引用而非手写字符串这是 Terraform 管理 Kubernetes 的一个典型技巧。执行流程terraform init → apply → 验证在新建的项目目录中第一步执行terraform init它会下载并初始化 kubernetes Provider 到本地插件目录执行terraform apply之前可以先确认集群中还没有任何 namespace示例中 minikube 的默认集群此时没有任何 namespace随后运行terraform applyTerraform 会按依赖关系依次创建三个新资源——namespace、deployment 和 serviceapply 完成后可以用kubectl get namespaces、kubectl get deployments -n nginx、kubectl get services -n nginx等命令查看集群内的实际部署结果访问应用kubectl port-forward由于演示环境是 minikube直接依赖 Docker 网络的 ingress 方案存在一些限制。本课采用最直接的验证方式执行kubectl port-forward -n nginx svc/nginx 30201:80将集群内的 Service 转发到本机端口然后在浏览器中访问http://localhost:30201/即可看到 NGINX 的默认欢迎页至此一套代码声明 → Terraform 执行 → kubectl 验证的 Kubernetes 应用交付闭环已经跑通。从仓库结构来看这正是整个 IaC 学习路径的一部分本课对应的 kubernetes.tf 与前一课 docker.tf、Docker-WordPress/docker-wordpress.tf 同处于 IaC 目录下展示了同一份学习代码库如何从单机容器逐步演进到容器编排平台。多环境部署workspaces 与文件结构之争学会了单环境部署后自然会遇到这样的问题如果想把 dev、staging、production 三个环境做得一模一样并复用同一份代码Terraform 提供了两种主流做法terraform workspaces在一个 backend 中划分多个命名的 state 段文件结构file structure用目录布局实现环境分离用 module 实现代码复用。两种方案各有利弊选择时取决于团队的隔离需求与运维习惯。Terraform workspaces优点上手简单创建独立 workspace 非常直接几乎零学习成本表达式便利可以在配置中直接使用terraform.workspace表达式按当前环境动态生成资源命名或参数减少代码重复一份配置同时服务多个环境无需复制目录。缺点易受人为错误影响多个环境共享同一份 state backend误切 workspace 可能导致操作错环境而这恰恰是引入 IaC 想要消除的风险state 集中存储所有环境的 state 保存在同一个 backend 中隔离度低代码可读性不足从代码库本身无法一眼看出某个环境对应的部署配置环境差异隐含在 workspace 切换中。文件结构目录分离优点backend 隔离每个环境拥有独立的 state backend安全性与环境边界更清晰降低人为错误环境之间物理隔离误操作面更小代码即事实代码库的目录结构完整、明确地呈现了各环境的部署状态。缺点多次 apply要为多个环境分别运行terraform apply部署次数随环境数线性增加代码重复目录复制会带来一定量的重复代码但可以通过 module 机制将公共部分抽取复用把重复降到最低。从仓库源码看本课的延伸印证仓库中与本课直接相关的证据主要有三处可以作为进一步学习的入口Kubernetes/kubernetes.tf本课核心配置的真实落盘版本与文档示例一致可作为模板直接复制使用Docker/docker.tf 与 Docker-Wordpress/docker-wordpress.tf前一课Day 60的 Docker 容器与 WordPress 多容器示例与 Kubernetes 一课形成容器 → 编排的递进关系Terratest仓库还提供了面向 AWS 的 Terratest 示例examples 下的instance.tf、provider.tf、securitygroup.tf、versions.tf等以及 test/terraform_test.go 的 Go 测试代码展示了基础设施代码 自动化测试的进阶方向——当你把环境数量变多后为 Terraform 代码编写可重复的测试是降低多环境运维风险的实用手段。小结本课完成了一次Terraform × Kubernetes的完整闭环用 Kubernetes Provider 在 minikube 中声明式地创建 namespace、deployment 与 service用terraform init/apply驱动部署再用kubectl port-forward完成访问验证。在此基础上terraform workspaces与目录文件结构给出了多环境复用的两条路径前者胜在快捷、代码少但隔离与可读性弱后者隔离彻底、代码即事实代价是多次 apply 与一定的代码重复可用 module 化解。实际选型时建议先明确团队对 state 隔离、安全边界与运维粒度的要求再决定采用哪一种模式。继续学习下一课Ngày 62第 62 天。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 第 61 天实战用 Terraform 管理 Kubernetes 资源与多环境部署90DaysOfDevOps 第 61 天实战用 Terraform 管理 Kubernetes 资源与多环境部署 导读 本篇文章是 90DaysOfDevO文档/教程90DaysOfDevOps 第 61 天用 Terraform 编排 Kubernetes 资源与多环境部署90DaysOfDevOps 第 61 天用 Terraform 编排 Kubernetes 资源与多环境部署 本文是 90DaysOfDevOps 挑战中“文档/教程90DaysOfDevOps 实战用 Terraform 管理 Kubernetes 资源与多环境部署Day 6190DaysOfDevOps 实战用 Terraform 管理 Kubernetes 资源与多环境部署Day 61 导读 本文是 90DaysOfDevO文档/教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表