Linked2.10(循序渐进)—使用GitOps与Linkerd和ArgoCD一种管理和交付Kubernetes基础设施和应用程序的方法。它通常利用一些软件代理来检测和协调Git中的版本化工件与集群中运行的工件之间的任何差异。本指南将向您展示如何设置ArgoCD以使用GitOps工作流程管理Linkerd安装和升级。具体来说,本指南提供了有关如何使用SealedSecrets和cert-manager安全生成和管理Linkerd的mTLS私钥和证书的说明。它还将向您展示如何将自动代理注入功能集成到您的工作流程中。最后,本指南总结了遵循GitOps工作流将Linkerd升级到更新版本的步骤。本指南中使用的软件和工具仅用于演示目的。随意选择最适合您要求的其他产品。您需要按照下一节中定义的步骤将此示例存储库克隆到您的本地计算机并将其复制到您的Kubernetes集群。设置存储库将示例存储库克隆到本地计算机:gitclonehttps://github.com/linkerd/linkerd-examples.git该存储库将在本指南后面用于演示Git操作,例如添加、提交和推送。向存储库添加一个新的远程端点以指向集群内的Git服务器,这将在下一节中进行设置:cdlinkerd-examplesgitremoteaddgit-servergit://localhost/linkerd-examples.git以简化本指南中的步骤,我们将通过端口转发与集群内的Git服务器进行交互。因此,我们刚刚创建的远程端点以您的本地主机为目标。将Git服务器部署到集群中的scm命名空间:kubectlapply-fgitops/resources/git-server.yaml在本指南的后面,ArgoCD将配置为监控此Git服务器托管的存储库。这个Git服务器配置为通过git协议作为守护进程运行,可以未经身份验证访问Git数据。不建议将此设置用于生产。确认Git服务器运行状况:kubectl-nscmrolloutstatusdeploy/git-server将示例存储库克隆到集群内Git服务器:git_server=`kubectl-nscmgetpo-lapp=git??-server-oname|awk-F/'{print$2}'`kubectl-nscmexec"${git_server}"--\gitclone--barehttps://github.com/linkerd/linkerd-examples.git确认远程仓库克隆成功:kubectl-nscmexec"${git_server}"--ls-al/git/linkerd-examples.git确认您可以通过端口转发从本地存储库推送到远程存储库:kubectl-nscmport-forward"${git_server}"9418&gitpushgit-servermasterdeployArgoCDinstallArgoCD:kubectlcreatensargocdkubectl-nargocdapply-f\https://raw.githubusercontent.com/argoproj/argo-cd/v1.6.1/manifests/install.yaml确认所有pod已准备就绪:fordeployin"application-controller""dex-server""redis""repo-server""server";\dokubectl-nargocdrolloutstatusdeploy/argocd-${deploy};\done使用端口转发访问ArgoCD仪表板:kubectl-nargocdport-forwardsvc/argocd-server8080:443\>/dev/null2>&1&now可以使用默认管理员用户名和密码通过https://localhost:8080访问ArgoCD仪表板的默认管理员密码是自动生成的ArgoCDAPI服务器pod名称。您可以使用argocdaccountupdate-password命令更改它。验证ArgoCDCLI:argocd_server=`kubectl-nargocdgetpods-lapp.kubernetes.io/name=argocd-server-oname|cut-d'/'-f2`argocdlogin127.0.0.1:8080\--username=admin\--password="${argocd_server}"\--insecureconfigurationprojectaccessandpermissionsettingsdemoprojecttogroupourapplications:kubectlapply-fgitops/project.yaml这个项目定义了我们的应用程序可以使用的允许资源的种类和列表目标集群。确认项目已正确部署:argocdprojgetdemo在仪表板上:部署应用程序将主应用程序部署为所有其他应用程序的“父”应用程序:kubectlapply-fgitops/main.yaml“应用程序的应用程序”模式通常用于工作使用ArgoCD进程来引导应用程序。有关详细信息,请参阅ArgoCD文档。确认主应用部署成功:argocdappgetmain同步主应用:argocdappsyncmain注意只有主应用被同步。接下来,我们将单独同步其余应用程序。部署cert-manager以同步cert-manager应用程序:argocdappsynccert-manager由于ArgoCD使用的cert-manager0.16.0和kubectl<1.19以及Helm3.2存在问题,本指南使用cert-manager0.15.0。请参阅此处的升级说明。确认cert-manager正在运行:fordeployin"cert-manager""cert-manager-cainjector""cert-manager-webhook";\dokubectl-ncert-managerrolloutstatusdeploy/${deploy};\doneDeploySealedSecretsSynchronizesealed-secrets应用程序:argocdappsyncsealed-secrets确认sealed-secrets运行:kubectl-nkube-systemrolloutstatusdeploy/sealed-secrets创建mTLS信任锚在继续部署Linkerd之前,我们需要创建mTLS信任锚。然后我们还将设置linkerd-bootstrap应用程序来管理信任锚证书。创建新的mTLS信任锚私钥和证书:stepcertificatecreateroot.linkerd.cluster.localsample-trust.crtsample-trust.key\--profileroot-ca\--no-password\--not-after43800h\--insecureconfirmnew信任锚详细信息(加密算法、到期日期、SAN等):stepcertificateinspectsample-trust.crt创建一个SealedSecret资源来存储加密的信任锚:kubectl-nlinkerdcreatesecretlslinkerd-trust-anchor\--certsample-trust.crt\--keysample-trust.key\--dry-run=client-oyaml|\kubeseal--controller-name=sealed-secrets-oyaml-|\kubectlpatch-f-\-p'{"spec":{"template":{“类型”:“kubernetes.io/tls”,“元数据”:{“标签”:{“linkerd.io/control-plane-component”:“identity”,“linkerd.io/control-plane-ns”:“linkerd”},“注释”:{“linkerd.io/created-by”:“linkerd/clistable-2.8.1”,“linkerd.io/identity-issuer-expiry”:“2021-07-19T20:51:01Z"}}}}}'\--dry-run=client\--type=merge\--local-oyaml>gitops/resources/linkerd/trust-anchor.yaml这将覆盖本地gitops/resources/linkerd/trust-anchor.yaml文件中现有的SealedSecret资源。我们会将此更改推送到集群内Git服务器。确认只有spec.encryptedData发生了变化:gitdiffgitops/resources/linkerd/trust-anchor.yaml提交新的信任锚密钥并将其推送到您的集群内Git服务器:gitaddgitops/resources/linkerd/trust-anchor.ygitaddgitops/resources/linkerd/trust-anchor.yamlgitcommit-m"updateencryptedtrustanchor"gitpushgit-servermaster确认提交成功推送:kubectl-nscmexec"${git_server}"--git--git-dirlinkerd-examples.gitlog-1deploylinkerd-bootstrapsynclinkerd-bootstrapapp:argocdappsynclinkerd-bootstrap如果颁发者和证书资源处于降级状态,SealedSecrets控制器可能无法解密密封的linkerd-trust-anchor秘密。检查SealedSecrets控制器的错误日志。出于调试目的,可以使用kubectl-nlinkerdgetsealedsecretslinkerd-trust-anchor-oyaml命令检索密封资源。确保此资源与您之前推送到集群内Git服务器的gitops/resources/linkerd/trust-anchor.yaml文件匹配。SealedSecrets应该已经创建了一个包含解密的信任锚的秘密。从secret中取出解密后的信任锚:trust_anchor=`kubectl-nlinkerdgetsecretlinkerd-trust-anchor-ojsonpath="{.data['tls\.crt']}"|base64-d-w0-`确认是一样的正如您之前在本地sample-trust.crt文件中创建的解密信任锚证书匹配:diff-b\<(echo"${trust_anchor}"|stepcertificateinspect-)\<(stepcertificateinspectsample-trust.crt)部署Linkerd现在我们准备安装Linkerd。我们刚刚检索到的解密信任锚将使用identityTrustAnchorsPEM参数传递到安装过程。在安装Linkerd之前,请注意gloval.identityTrustAnchorsPEM参数设置为“空”证书字符串:argocdappgetlinkerd-ojson|\jq-r'.spec.source.helm.parameters[]|select(.name=="identityTrustAnchorsPEM")|.value'我们将在linkerd应用程序中使用${trust_anchor}的值覆盖此参数。在本地gitops/argo-apps/linkerd.yaml文件中找到identityTrustAnchorsPEM变量,并将其值设置为${trust_anchor}的值。确保多行字符串正确缩进。例如,source:chart:linkerd2repoURL:https://helm.linkerd.io/stabletargetRevision:2.8.0helm:parameters:-name:identityTrustAnchorsPEMvalue:|-----BEGINCERTIFICATE-----MIIBlTCCATygAwIBAgIRAKQr9ASqULvXDeyWpY1LJUQwCgYIKoZIzj0EAwIwKTEnMCUGA1UEAxMeaWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLmxvY2FsMB4XDTIwMDkxODIwMTAxMFoXDTI1MDkxNzIwMTAxMFowKTEnMCUGA1UEAxMeaWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+PUpIR74PsU+geheoyseycyquYyes5eeksIb5FDm8ptOXQ2xPcBpvesZkj6uIyS3k4qVE0S9VtMmHNeycL7446NFMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFHypCh7hiSLNxsKhMylQgqD9t7NNMAoGCCqGSM49BAMCA0cAMEQCIEWhI86bXWEd4wKTnG07hBfBuVCT0bxopaYnn3wRFx7UAiAwXyh5uaVgMwCC5xL+PM+bm3PRqtrmI6TocWH07GbMxg==-----ENDCERTIFICATE-----确认只更改了一个spec.source.helm.parameters.value字段:gitdiffgitops/argo-apps/linkerd.yaml提交并将更改推送到Gitserver:gitaddgitops/argo-apps/linkerd.yamlgitcommit-m"setidentityTrustAnchorsPEMparameter"gitpushgit-servermastersyncmainapp:argocdappsyncmain确认linkerd应用程序选择了新的信任锚:argocdappgetlinkerd-ojson|\jq-r'.spec.source.helm.parameters[]|select(.name=="identityTrustAnchorsPEM")|.value'同步linkerd应用程序:argocdappsynclinkerd检查Linkerd准备情况:linkerdcheck使用emojivoto部署emojivoto以测试自动代理注入:argocdappsyncemojivoto检查应用程序健康状况:fordeployin"emoji""vote-bot""voting""web";\dokubectl-nemojivotorolloutstatusdeploy/${deploy};\doneUpgradeLinkerdto2.8.1使用您的编辑器将gitops/argo-apps/linkerd.yaml文件中的spec.source.targetRevision字段更改为2.8.1:验证只有targetRevision字段已更改:gitdiffgitops/argo-apps/linkerd.yaml提交并将此更改推送到Git服务器:gitaddgitops/argo-apps/linkerd.yamlgitcommit-m"upgradeLinkerdto2.8.1"gitpushgit-servermastersyncmainapp:argocdappsyncmainsynclinkerdapp:argocdappsynclinkerdconfirm升级成功完成:linkerdcheckc确认新版本的控制平面:linkerdversioncleanupallapplicationscanberemovedbydeletethemainapplication:argocdappdeletemain--cascade=true
