Akemi

argoCD介绍,部署与对接代码仓库

2024/12/09

argoCD的优势

1.只根据git的更新作为部署与更新的依据,能够清晰对比与现有部署的区别

2.只要通过修改git,就可以快速进行多环境的回滚

3.只需要通过对git项目做控制,不再需要对k8s做复杂的RBAC

4.从网络上来说,适用于公有云gitlab无法访问私有云k8s的场景

argoCD的组件与工作过程

1.Repository Server——检索阶段

检索阶段会克隆应用声明式配置清单所在的 Git 仓库,将其读取到本地存储

可以支持k8s的yaml文件,helm的chart以及kustomize配置清单

2.Application Controller ——核对阶段

将检索阶段获得的资源清单文件与当前状态的清单文件对比

如果发现处于不同步状态,就会自动进行修正

3.API Server

提供Web GUI,同时对外提供应用程序的信息

argoCD管理的相关概念

Argo CD Application应用程序

定义了 Kubernetes 资源的来源(Source)和目标(Destination)。来源指的是 Git 仓库中 Kubernetes 资源配置清单所在的位置,而目标是指资源在 Kubernetes 集群中的部署位置。来源可以是原生的 Kubernetes 配置清单,也可以是 Helm Chart 或者 Kustomize 部署清单。

Argo CD Project项目

通过Project对不同Application进行分组,每个项目都可以单独限制Git仓库,限制namespace,限制部署资源类型

argoCD本体部署

我使用的是快速开始的部署方式,不提供高可用功能,几个控制器都只有单个副本

部署文件

标准:https://github.com/argoproj/argo-cd/blob/master/manifests/install.yaml

高可用:ha/install.yaml: https://github.com/argoproj/argo-cd/blob/master/manifests/ha/install.yaml

精简:https://github.com/argoproj/argo-cd/blob/master/manifests/core-install.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

准备镜像:
quay.io/argoproj/argocd:v2.13.1
ghcr.io/dexidp/dex:v2.41.1
redis:7.0.15-alpine

镜像自行准备,或者配docker或者containerd的镜像加速
docker pull quay.io/argoproj/argocd:v2.13.1
docker save quay.io/argoproj/argocd:v2.13.1 -o argo-v2.13.1.tar.gz
scp argo-v2.13.1.tar.gz ws-k8s-node1:/root/ && ssh ws-k8s-node1 "ctr -n k8s image import /root/argo-v2.13.1.tar.gz"
scp argo-v2.13.1.tar.gz ws-k8s-node2:/root/ && ssh ws-k8s-node2 "ctr -n k8s image import /root/argo-v2.13.1.tar.gz"
scp argo-v2.13.1.tar.gz ws-k8s-node3:/root/ && ssh ws-k8s-node3 "ctr -n k8s image import /root/argo-v2.13.1.tar.gz"

可能需要的污点——允许部署在master节点上
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"

完成后
kubectl get pods
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 5m23s
argocd-applicationset-controller-5ccbf46fd8-w558t 1/1 Running 0 5m24s
argocd-dex-server-655cb47bfb-r8xns 1/1 Running 0 5m23s
argocd-notifications-controller-5b9566d4c7-gkbd7 1/1 Running 0 5m23s
argocd-redis-5c84885b88-g9wwv 1/1 Running 0 5m23s
argocd-repo-server-78579d98cb-vxx9z 1/1 Running 0 5m23s
argocd-server-6fb86547dd-k6gr4 1/1 Running 0 5m23s

暴露在外部端口
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'

默认用户admin
初始密码
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d

argoCLI部署与交互

二进制安装

这命令行文件170M,下载下半天,真的抽象

1
2
3
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64

使用CLI登录argoCD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
argocd admin initial-password -n argocd
#F5Fc4oXYJf8k05Eo

登录
argocd login 192.168.10.200:30779
WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 192.168.10.200 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '192.168.10.200:30779' updated

更改密码
argocd account update-password
*** Enter password of currently logged in user (admin):
*** Enter new password for user admin:
*** Confirm new password for user admin:
Password updated
Context '192.168.10.200:30779' updated

使用CLI部署资源

可以使用Web UI创建资源,或通过CLI进行部署

回想上面讲的,argoCD Application指定了k8s的来源和目的,在CLI中能明显体现出来

1
2
3
4
5
6
7
例:
kubectl config set-context --current --namespace=argocd

argocd app create guestbook \
--repo https://github.com/argoproj/argocd-example-apps.git \
--path guestbook --dest-server https://kubernetes.default.svc \
--dest-namespace default

同步策略

Automated Sync 自动同步
Manual Sync 手动同步
Prune (修剪):把多的资源删除
Sync Wave:一种分批同步的策略,用于控制应用程序的同步速率。通过将应用程序分为多个同步波,可以逐步同步应用程序的不同部分,以减轻集群的负载和避免突发的大规模同步操作。
Sync Options (同步选项): SYNC POLICY 还可以与 SYNC OPTIONS 结合使用,以进一步细化同步行为。SYNC OPTIONS 允许您配置诸如跳过模式验证、自动创建命名空间、最后修剪、仅应用不同步的资源等选项,以满足特定的同步需求。

argoCD对接

对接k8s说明

对于内部k8s,在argoCD部署时,就已经默认设置好了它的RBAC,所以只需要将其集群URL指定为https://kubernetes.default.svc即可

对于外部k8s,如果需要对接需要通过argo CLI进行集群的添加,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#先对argoCLI进行配置——登录
sudo argocd login 127.0.0.1:32198
WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '127.0.0.1:32198' updated

#设置外部k8s
如果没有默认kubeconfig可以使用--kubeconfig参数进行指定
sudo argocd cluster add --kubeconfig config_compute local

'WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `local` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0001] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0001] ClusterRole "argocd-manager-role" updated
INFO[0001] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://10.175.208.16:6443' added

对接公有仓库与部署

这里使用的是官方提供的demo的github,是公开仓库,所以不涉及凭证管理

https://github.com/argoproj/argocd-example-apps.git

如果选择的是helm部署,下面就会自动跳出helm的选项

方便做进一步确认或修改,我为了方便验证,在这里使用NodePort


验证业务

对接私有仓库与部署

对接私有仓库的几种认证方式

1.账号密码登录

HTTPS可以直接使用账号密码进行登录

而HTTP需要使用token进行登录

这点和jenkins不同,jenkins是可以允许HTTP的git链接直接使用账号密码的

2.通过TLS证书认证

不是哥们,我有你这个证书我直接用账号密码不好么

3.SSH密钥对登录

注:从argoCD 2.4开始使用的是openSSH 8.9,不支持使用SHA-1哈希算法的私钥

反正我是没成功过

4.Github App登录

5.谷歌仓库登录

使用token登录

准备一个gitlab项目,http://gitlab.wangsheng.com/group02/argocd-lab.git

这个项目里我放了helm的部署文件

生成gitlabtoken

用管理员登录,进入xx仓库-设置-仓库-部署令牌

输入完成后点击部署,就可以获得一个令牌

gitlab+deploy-token-2

gldt-ikPz4TV3QjuEseECmo5V




部署helm项目

CATALOG
  1. 1. argoCD的优势
  2. 2. argoCD的组件与工作过程
  3. 3. argoCD管理的相关概念
  4. 4. argoCD本体部署
  5. 5. argoCLI部署与交互
  6. 6. argoCD对接
    1. 6.1. 对接k8s说明
    2. 6.2. 对接公有仓库与部署
    3. 6.3. 对接私有仓库与部署
      1. 6.3.1. 对接私有仓库的几种认证方式
      2. 6.3.2. 使用token登录
      3. 6.3.3. 部署helm项目