本文发布于Cylon的收藏册,转载请著名原文链接~


GitOps 最初由 Weaveworks (weave cni的组织) 在 2017 年的博客中提出 [1],使用 “Git” 作为 CI/CD 的 “单一事实来源”,将代码的更改集成到每个项目的存储库中,并使用拉取请求来管理 infra 和部署。 在理解上就可以理解为 “是一种基于 git 的操作框架”

Argo CD 是一种 kubernetes 之上的 “声明式” (declarative) 的 gitops CD, 在本文作为了解如何在 Kubernetes 集群中安装和配置 Argo CD。

前提准备

想要安装 Argo CD 首先环境需要具备如下:

  • 已经安装好 kubectl 命令行工具
  • 拥有 kubeconfig 文件
  • 一个可供测试的 Kubernetes 集群,如:kind, minikube, kubeadm, binary 等任意的集群

步骤1 - 选择适配 kubernetes 版本的 Argo

根据官方的解释, Argo CD 在任何给定时刻所支持的版本,这些版本是 N 和 N - 1 次要版本的最新修补版本 (x.x.new)。这些 Argo CD 版本与 Kubernetes 项目官方支持的 Kubernetes 版本相一致,通常是 Kubernetes 的最近发布的 3 个版本。

即可以理解为 Argo N & N-1 支持的 Kubernetes 版本为 N-2

举例来说,如果 Argo CD 的最新次要版本是 2.4.3 和 2.3.5, 那么所支持的 K8S 版本则如下面列表

  • Argo CD 2.4.3 on Kubernetes 1.24
  • Argo CD 2.4.3 on Kubernetes 1.23
  • Argo CD 2.4.3 on Kubernetes 1.22
  • Argo CD 2.3.5 on Kubernetes 1.24
  • Argo CD 2.3.5 on Kubernetes 1.23
  • Argo CD 2.3.5 on Kubernetes 1.22

而在较新版本中,Argo官方给出了 Argo CD 在 K8S 什么版本之上,测试什么版本的 Argo (2.8起),而 Argo 版本又和 K8S 版本较为吻合,例如最新版 Kubernetes 为 1.28 (2023.10),那么 Argo 最新版 (2.8).

假设现在你的 kubernetes 集群版本为 1.19.10, 那么按照这个规律基本上符合的为 1.8/2.0,如果 kubernetes 集群版本为 1.18.10, 那么符合的版本为 1.7/1.8,对于旧版本,尽量选择最符合的,不要按照这个规律,因为规律是 2.3+ 才提出的。

对于每一个版本的部署文件路径,可以通过 argo 仓库 manifest 目录中寻找 github.com/argoproj/argo-cd/tree/version/manifests

步骤2 - 执行安装

在本实例中,安装环境为 kubernetes 1.19.10 ,选择的 Argo CD 版本为 2.0,那么只需要找到其 “资源清单” 文件即可,需要注意的是,版本号要与仓库中 “tag” 保持一致

ARGO_VERSION=v2.0.5
https://raw.githubusercontent.com/argoproj/argo-cd/${ARGO_VERSION}/manifests/install.yaml

使用 kubectl 应用这个文件即可

kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-cd/${ARGO_VERSION}/manifests/install.yaml

如果需要部署在特定的 NS 内,可以使用下面命令

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/${ARGO_VERSION}/manifests/install.yaml

安装就是应用对应资源到 Kubernetes 集群

customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-redis created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-redis created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-secret created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created

步骤3 - 访问argo server

通常在部署好 Kubernetes 中的应用后,需要访问大概有四种方式:

  • 修改清单,将 service 端口改为 NodePort 模式
  • 使用 Ingress
  • 使用端口转发 ( port-forward )

这里选择最简单方式,使用 kubectl 的 port-forward 进行访问,随机端口

kubectl port-forward svc/argocd-server :443 --address='0.0.0.0'

指定本地端口

kubectl port-forward svc/argocd-server 8888:443 --address='0.0.0.0'

还可以指定任意的资源进行映射,比如 deployment, Pod

kubectl port-forward pod/{pod_name} 8888:443 --address='0.0.0.0'

Notes: 使用 port-forwad 需要在 Kubernetes 集群所有 Node 之上安装 socat , 否则会出现下面问题

E1030 23:34:25.973226 36174 portforward.go:400] an error occurred forwarding 8181 -> 8080: error forwarding port 8080 to pod xxxxxxxxx, uid : unable to do port forwarding: socat not found

此时 WEB UI 可以开启了,还需要获得默认的用户才可以登录到集群内,这里 ArgoCD 首次登陆密码被以 secert 形式保存在集群内,使用下面命令可以获取,默认用户名是 ”admin“

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

安装 ArgoCD CLI

安装 ArgoCD CLI 工具有两种主要方法,mac 之上可以通过 brew 安装,其他操作系统需要从 github release 下载安装二进制文件,下载后可以使用 argocd login 登录集群,登录的地址是 argo server 的地址

argocd login localhost:8080

通过 argocd cli 也可以更新密码

argocd account update-password

至此,一个简单的 Argo CD 就部署完了,当然 Argo CD 也有高可用版本,可以参考官方给出的高可用版本的清单进行安装 [2]

Reference

[1] Getting Started with ArgoCD on Kubernetes

[2] Installation

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2023/10/argo-installtion/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。