GitOps 是为云原生应用程序实施持续部署的推荐方式。它通过在部署应用程序时最大限度地减少手动错误来帮助组织,因为 Git 将是唯一的真实来源。因此,可以轻松地跨团队跟踪更改。
本文旨在帮助那些希望通过 ArgoCD 在已经部署并在 Kubernetes 集群中运行的应用程序上采用 GitOps 文化的工程师。
由于 GitOps 相对较新,人们可能会对如何在不重新部署其微服务的情况下将现有应用程序载入 ArgoCD 产生疑问。让我们看看如何解决这个问题。
在 ArgoCD 中,您可以通过两种方式安装基于 Helm 的应用程序。其中之一是直接通过远程 Helm 存储库安装应用程序。这可以是 Gitlab 的 Helm 存储库、自托管选项(如 Chartmusem)或 GitHub Pages。
让我们使用 helm 存储库安装应用程序。在通过 ArgoCD 安装它之前,此步骤尝试模拟已经在通过 helm install 命令部署的集群中运行的应用程序。nginx-ingress
#add the helm repo
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
#install the helm chart
helm install ingress-nginx ingress-nginx/ingress-nginx --version 4.4.0 --set controller.service.type=ClusterIP
#kubectl get pod
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-6f7bd4bcfb-dp57x 1/1 Running 0 3m50s
Pod 运行后,让我们将 ArgoCD 安装到我们的集群中。
#add the helm repo
helm repo add argo https://argoproj.github.io/argo-helm
#install the helm chart
helm install argocd argo/argo-cd --set-string configs.params."server\.disable\.auth"=true --version 5.12.0 --create-namespace -n argocd
验证 ArgoCD pod 正在运行并处于 READY 状态。
kubectl get pod -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 14m
argocd-applicationset-controller-6cb8549cd9-ms2tr 1/1 Running 0 14m
argocd-dex-server-77b996879b-j2zd8 1/1 Running 0 14m
argocd-notifications-controller-6456d4b685-kb6hn 1/1 Running 0 14m
argocd-redis-cdf4df6bc-xg7v6 1/1 Running 0 14m
argocd-repo-server-8b9dd576b-xfv8s 1/1 Running 0 14m
argocd-server-b9f6c4ccd-7vdjz 1/1 Running 0 14m
现在 ArgoCD 正在运行,让我们为我们的应用程序创建 ArgoCD 应用程序清单。
cat <<EOF >> nginx-ingress.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: ingress-nginx
namespace: argocd
spec:
project: default
destination:
namespace: default #update namespace name if you wish
name: in-cluster #update cluster name if its different
source:
repoURL: https://kubernetes.github.io/ingress-nginx
targetRevision: "4.4.0"
chart: ingress-nginx
helm:
values: |
controller:
service:
type: ClusterIP
EOF
上述清单中有几点需要注意:
targetRevision
helm 图表版本的 git 标签,ArgoCD 就会拉取该图表并应用更改。这可以通过编辑此文件或通过 ArgoCD UI 更新标签来完成。[**metadata.name**](<http://metadata.name>)
应该与 helm 版本名称完全匹配。否则这将被视为新版本。这里的主要思想是通过 ArgoCD 指定的 helm 值配置应该与helm 安装或升级时指定的配置(值文件)完全匹配。
例如,在 helm 安装期间,如果服务类型是ClusterIP
,ArgoCD 应用程序清单也应该具有该配置。如果您不指定,ArgoCD 将覆盖默认图表值,这将导致停机。
这主要需要处理依赖的第三方图表,例如 MongoDB、Redis 等。
好的。让我们应用我们使用命令创建的清单。
kubectl apply -f nginx-ingress.yaml
#application.argoproj.io/my-ingress-nginx created
要访问 Argo UI,让端口转发 argocd-server 服务并在浏览器中打开:https://localhost:8080
kubectl port-forward service/argocd-server 8080:8080 -n argocd
现在,如果您转到 nginx-ingress 应用程序,它的状态是 OutOfSync。
的具体应用中,对于几乎所有的 Kubernetes 资源,都需要来自 ArgoCD 端的注解。这就是 ArgoCD 跟踪它需要跟踪的资源的方式。您可以在此处的文档中阅读有关此注释的更多信息。
让我们的sync
应用程序将在所有资源上应用该 ArgoCD 注释。
同步后,您可以看到没有资源被删除或重新创建。
kubectl get all -l app.kubernetes.io/name=ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-controller-6f7bd4bcfb-dp57x 1/1 Running 0 21m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller ClusterIP 10.96.156.40 <none> 80/TCP,443/TCP 21m
service/ingress-nginx-controller-admission ClusterIP 10.96.118.65 <none> 443/TCP 21m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 21m
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-6f7bd4bcfb 1 1 1 21m
如果您的 helm chart 未托管在 helm 存储库中,而是存储在 GitHub 或任何其他 SCM 工具(如 GitLab 或 BitBucket)中,则也可以轻松完成该 helm 应用程序的迁移。
分叉示例应用程序存储库:https://github.com/kernelpod/podinfo
克隆存储库并将 values.yaml 中的 replicacount 从 1 更新为 3。
#clone your fork
git clone https://github.com/kernelpod/podinfo && cd podinfo/charts/podinfo
#update replcaCount to 3
sed -i -e '/replicaCount/ s/: .*/: 3/' values.yaml
将此更改推送到您的 GitHub 存储库。
通过 helm 部署 helm 图表。
helm install podinfo-git . -f values.yaml -n default
创建一个 ArgoCD 应用程序清单,它将指向您的存储库和存储 helm chart 的存储库内的路径。
cat <<EOF >> podinfo-app-git.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: podinfo-git
namespace: argocd
spec:
project: default
destination:
namespace: default #update namespace name if you wish
name: in-cluster #update cluster name if its different
source:
repoURL: 'https://github.com/tanmay-bhat/podinfo' #replace with your username
path: charts/podinfo
targetRevision: HEAD
helm:
valueFiles:
- values.yaml #any custom value file you want to apply.
EOF
ArgoCD 会自动检测到在您指定的路径中,应用程序必须作为 Helm 图表而不是通过 Kubernetes 清单文件加载。它通过在您指定的路径中扫描来了解该类型以检测应用程序的种类。在我的例子中是在存储库中。您可以在此处阅读有关自动工具检测的更多信息。Chart.yaml ``chart.yaml``charts/podinfo
将您创建的清单应用到argocd
命名空间中。
kubectl apply -f podinfo-app-git.yaml -n argocd
#application.argoproj.io/podinfo configured
就像之前的迁移一样,这个应用程序也会与注释更改更新不同步。Sync
审查后的申请。App Diff
从上面的快照中可以看出,没有重新创建 pod 和其他资源。
如果你通过 UI查看这个,我们可以看到它已将配置同步到我们的 GitHub 存储库。App Details
checksum/secret
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。