<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Terraform on Ethan S. Chen</title><link>https://ethanschen.github.io/tags/terraform/</link><description>Recent content in Terraform on Ethan S. Chen</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Ethan S. Chen</copyright><lastBuildDate>Sat, 04 Jan 2025 12:00:00 +0800</lastBuildDate><atom:link href="https://ethanschen.github.io/tags/terraform/index.xml" rel="self" type="application/rss+xml"/><item><title>Kubernetes生态下的软件调试方法——以Provider为例</title><link>https://ethanschen.github.io/tech/2025-01-04-kubernetes-debugging-methods/</link><pubDate>Sat, 04 Jan 2025 12:00:00 +0800</pubDate><guid>https://ethanschen.github.io/tech/2025-01-04-kubernetes-debugging-methods/</guid><description>&lt;h2 id="背景">背景
&lt;/h2>&lt;p>在公司的时候，有很多调试环境部署有K8S集群供开发自验证，&lt;/p>
&lt;p>但在家参与一些开源项目的时候，因为无法使用公司环境，导致缺少可以自验证的环境。&lt;/p>
&lt;p>以前一般使用MiniKube或Docker部署K8S集群等方式构建测试环境，&lt;/p>
&lt;p>但缺点是对机器的要求比较高，我的17年8G运行内存的Mac只能是堪堪运行起集群，&lt;/p>
&lt;p>再要在上面做一些调试，开个IDE，开个浏览器等，十分费劲。&lt;/p>
&lt;h2 id="趋势">趋势
&lt;/h2>&lt;p>升级机器配置，我也有过这个想法，但不免几年就需要升级一次，费钱费时间，且机器95%以上的时间都是闲置的，并不划算。&lt;/p>
&lt;p>所以利用付费的云化资源+轻量的终端进行开发工作，越来越成为我近年来的一种趋势。&lt;/p>
&lt;p>本文也是基于这一种思想构建的一种调试方法，供君参考。&lt;/p>
&lt;h2 id="更进一步">更进一步
&lt;/h2>&lt;p>单纯的云化资源并不能很好的控制成本，借鉴企业的的做法，弹性伸缩才是降低成本的要点。&lt;/p>
&lt;p>所以我们在使用云化资源的时候也要贯彻这一种做法，&lt;/p>
&lt;p>尤其在需要使用K8S集群这类资源开销更大的业务时，&lt;/p>
&lt;p>使用Terraform在测试时自动化创建出基础设施，是我们应该提倡的。&lt;/p>
&lt;h2 id="以provider为例">以Provider为例
&lt;/h2>&lt;p>上周在工作中遇到一个Kubernetes Provider的社区Bug，因为公司的业务版本发布在即，所以优先采用打补丁的方式完成修复。&lt;/p>
&lt;p>但计划在业余时间帮助社区修复该Bug，修复时发现缺少自验证的环境，于是开始探索下面使用AWS的EKS构建测试环境的方法。&lt;/p>
&lt;h3 id="登录aws控制台">登录AWS控制台
&lt;/h3>&lt;p>登录AWS的&lt;a class="link" href="https://ap-southeast-2.console.aws.amazon.com/eks/home?region=ap-southeast-2#/clusters" target="_blank" rel="noopener"
>EKS&lt;/a>服务，本文以美国（俄亥俄州）为例&lt;/p>
&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735983171/2025-01-04-EKS%e6%9c%8d%e5%8a%a1_cy4fgp.png"
loading="lazy"
alt="EKS服务"
>&lt;/p>
&lt;h3 id="安装terraform">安装Terraform
&lt;/h3>&lt;p>参考Terraform的&lt;a class="link" href="https://developer.hashicorp.com/terraform/install" target="_blank" rel="noopener"
>Install教程&lt;/a>，在AWS临时终端中安装Terraform&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sudo yum install -y yum-utils shadow-utils
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum -y install terraform
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735983311/2025-01-04-%e5%ae%89%e8%a3%85Terraform_em4i3f.png"
loading="lazy"
alt="安装Terraform"
>&lt;/p>
&lt;h3 id="部署eks集群">部署EKS集群
&lt;/h3>&lt;p>参考Terraform的&lt;a class="link" href="https://developer.hashicorp.com/terraform/tutorials/kubernetes/eks" target="_blank" rel="noopener"
>部署EKS集群教程&lt;/a>，通过AWS终端部署EKS集群&lt;/p>
&lt;h4 id="初始化工作空间">初始化工作空间
&lt;/h4>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git clone https://github.com/hashicorp-education/learn-terraform-provision-eks-cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> learn-terraform-provision-eks-cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">terraform init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735983578/2025-01-04-%e5%88%9d%e5%a7%8b%e5%8c%96%e5%b7%a5%e4%bd%9c%e7%a9%ba%e9%97%b4_hizkxy.png"
loading="lazy"
alt="初始化工作空间"
>&lt;/p>
&lt;h4 id="部署集群">部署集群
&lt;/h4>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">terraform apply -auto-approve
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>预计花费10分钟完成集群部署，部署后可以在ESK集群管理页面看到该集群&lt;/p>
&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735992135/2025-01-04-%e9%83%a8%e7%bd%b2%e5%ae%8c%e6%88%90_dxddod.png"
loading="lazy"
alt="部署完成"
>&lt;/p>
&lt;h4 id="验证集群功能">验证集群功能
&lt;/h4>&lt;p>配置kubectl&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">aws eks --region &lt;span class="k">$(&lt;/span>terraform output -raw region&lt;span class="k">)&lt;/span> update-kubeconfig --name &lt;span class="k">$(&lt;/span>terraform output -raw cluster_name&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>查看集群信息&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">kubectl cluster-info
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>查看node信息&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">kubectl get nodes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735992522/2025-01-04-%e9%aa%8c%e8%af%81%e9%9b%86%e7%be%a4%e5%8a%9f%e8%83%bd_cr1jhi.png"
loading="lazy"
alt="验证集群功能"
>&lt;/p>
&lt;h4 id="部署deployment资源">部署Deployment资源
&lt;/h4>&lt;p>参考Terraform的&lt;a class="link" href="https://developer.hashicorp.com/terraform/tutorials/kubernetes/kubernetes-provider" target="_blank" rel="noopener"
>管理K8S资源&lt;/a>，通过Terraform部署测试服务到集群&lt;/p>
&lt;p>创建工作目录，编辑kubernetes.tf文件&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir learn-terraform-deploy-nginx-kubernetes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> learn-terraform-deploy-nginx-kubernetes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vim kubernetes.tf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>初始化工作目录&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">terraform init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>修改kubernetes.tf，增加Deployment资源后Apply&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">vim kubernetes.tf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">terraform apply -auto-approve
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>查看Deployment资源&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">kubectl get deployments
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1736005342/2025-01-04-%e6%9f%a5%e7%9c%8bDeployment%e8%b5%84%e6%ba%90_kyl29m.png"
loading="lazy"
alt="查看Deployment资源"
>&lt;/p>
&lt;h4 id="去部署deployment资源">去部署Deployment资源
&lt;/h4>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/learn-terraform-deploy-nginx-kubernetes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">terraform destroy -auto-approve
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1736005590/2025-01-04-%e5%8e%bb%e9%83%a8%e7%bd%b2Deployment%e8%b5%84%e6%ba%90_v0rvjx.png"
loading="lazy"
alt="去部署Deployment资源"
>&lt;/p>
&lt;h3 id="调试provider">调试Provider
&lt;/h3>&lt;p>参考Kubernetes Provider项目的&lt;a class="link" href="https://github.com/hashicorp/terraform-provider-kubernetes/blob/main/_about/CONTRIBUTING.md" target="_blank" rel="noopener"
>贡献指南&lt;/a>&lt;/p>
&lt;h4 id="安装go">安装Go
&lt;/h4>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">brew install go@1.22
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735985374/2025-01-04-%e5%ae%89%e8%a3%85Go_avfvmb.png"
loading="lazy"
alt="安装Go"
>&lt;/p>
&lt;h4 id="克隆provider项目">克隆Provider项目
&lt;/h4>&lt;p>Fork Provider项目到自己的仓库下，再克隆到本地&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git clone https://github.com/&amp;lt;YOUR-USERNAME&amp;gt;/terraform-provider-kubernetes.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> terraform-provider-kubernetes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735985599/2025-01-04-%e5%85%8b%e9%9a%86Provider%e9%a1%b9%e7%9b%ae_qkkqhd.png"
loading="lazy"
alt="克隆Provider项目"
>&lt;/p>
&lt;h4 id="修改代码">修改代码
&lt;/h4>&lt;p>即修改terraform-provider-kubernetes代码&lt;/p>
&lt;h4 id="编译provider">编译Provider
&lt;/h4>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">bash scripts/build.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1735989908/2025-01-04-%e7%bc%96%e8%af%91Provider_ndtjop.png"
loading="lazy"
alt="编译Provider"
>&lt;/p>
&lt;h4 id="替换二进制文件">替换二进制文件
&lt;/h4>&lt;p>将编译好的Provider上传到AWS终端，替换原二进制文件&lt;/p>
&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1736006202/2025-01-04-%e6%9b%bf%e6%8d%a2%e4%ba%8c%e8%bf%9b%e5%88%b6%e6%96%87%e4%bb%b6_gvdhgl.png"
loading="lazy"
alt="替换二进制文件"
>&lt;/p>
&lt;h4 id="验证provider修改">验证Provider修改
&lt;/h4>&lt;p>执行可以验证到修改的操作，例如再次部署Deployment资源&lt;/p>
&lt;h3 id="去部署eks集群">去部署EKS集群
&lt;/h3>&lt;p>验证完毕，别忘了销毁集群，因为它时刻都在计费！&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/learn-terraform-provision-eks-cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">terraform destroy -auto-approve
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://res.cloudinary.com/dbsadrsxp/image/upload/v1736009409/2025-01-05-%e5%8e%bb%e9%83%a8%e7%bd%b2%e5%ae%8c%e6%88%90_pfmvpl.png"
loading="lazy"
alt="去部署完成"
>&lt;/p>
&lt;h2 id="总结">总结
&lt;/h2>&lt;p>到此，本文介绍的方法就讲完了，欢迎各位一试～&lt;/p></description></item></channel></rss>