一、环境准备

  • gitlab
  • k8s
  • traefik
  • dnsmasq
  • harbor
  • argocd

概述

Argo CD 是一款 CD 工具,能轻松的将 Git 仓库中 yaml 资源文件轻松的部署到集群中。一个 Application 可以由多个 yaml 组成。

  1. 拉取仓库中的资源
  2. 部署到集群中

二、gitlab仓库

2.1 准备仓库

  1. 创建一个 argodemo 的仓库

创建一个  的仓库

  1. manifests 目录下创建 svc.yamldeployment.yamlingress.yaml
1
2
mkdir -pv ArgoDemo/manifests
cd ArgoDemo/manifests
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
cat > deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
EOF
cat > svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
type: ClusterIP
selector:
app: myapp
ports:
- port: 80
targetPort: 80
EOF
cat > ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
annotations:
cert-manager.io/cluster-issuer: qx-ca-issuer
spec:
ingressClassName: traefik
tls:
- hosts:
- myapp.qx.lab
secretName: myapp-tls
rules:
- host: myapp.qx.lab
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp
port:
number: 80
EOF

  1. 推送到 gitlab
1
2
3
4
5
6
cd ..
git init --initial-branch=main
git remote add origin git@gitlab.qx.lab:qiaoxiong/argodemo.git
git add .
git commit -m "Initial commit"
git push --set-upstream origin main

2.2 令牌、密钥

git 仓库可以使用 SSH、HTTPS协议进行连接。

  • SSH 协议
    • 用户级别的 SSH 密钥
    • 仓库级别的部署密钥(argocd用私钥,公钥放gitlab)
  • HTTP 协议
    • 用户级别的,用户名、密码(在 http 下默认被禁用)
    • 仓库级别的,部署令牌(会给出用户名,或自定义用户名)
    • 仓库级别的,访问令牌(用户名随便填,需要读取仓库的权限、最低是 Reporter 角色)

三、Argocd配置

3.1 指纹或证书

SSH 连接,需要 argocd 信任 gitlab 的指纹。
HTTPS 连接,需要 argocd 信任 gitlab 的证书。

3.1.1 指纹

  1. 查看指纹
1
ssh-keyscan gitlab.qx.lab | ssh-keygen -lf -
  1. argocd-cli 添加指纹
1
ssh-keyscan gitlab.qx.lab | argocd cert add-ssh --batch
  1. 修改 configmap 添加指纹,一般不会立刻生效,需要重启下 repo-server
1
kubectl edit configmap argocd-ssh-known-hosts-cm -n argocd
1
kubectl rollout restart deployment argocd-repo-server -n argocd
  1. webui 手动添加,一次填写进去就可以。
1
2
alias yy="egrep -v '^$|^#'"
ssh-keyscan gitlab.qx.lab | yy
  1. 22 端口,添加 -p 参数
1
2
alias yy="egrep -v '^$|^#'"
ssh-keyscan -p 22 gitlab.qx.lab | yy

3.1.2 证书

这里可以添加服务端证书,也可以添加根证书,推荐根证书,因为时间长。

  1. argocd-ali 添加证书
1
argocd cert add-tls gitlab.qx.lab --from /path/to/root_ca.crt
  1. webui 添加证书
1
2
3
4
gitlab.qx.lab
-----BEGIN CERTIFICATE-----
MIID...(你的 CA 证书内容)...
-----END CERTIFICATE-----
  1. 编辑 configmap 添加,第二个证书的话,往后添加就好。
1
kubectl edit cm argocd-tls-certs-cm  -n argocd
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-tls-certs-cm
namespace: argocd
labels:
app.kubernetes.io/name: argocd-tls-certs-cm
app.kubernetes.io/part-of: argocd
data:
gitlab.qx.lab: |
-----BEGIN CERTIFICATE-----
MIID...(你的 CA 证书内容)...
-----END CERTIFICATE-----

或者从文件中读取

1
2
3
kubectl create configmap argocd-tls-certs-cm -n argocd \
--from-file=gitlab.qx.lab=/path/to/root_ca.crt \
--dry-run=client -o yaml | kubectl apply -f -

不生效的话,重启一下服务

1
kubectl rollout restart deployment argocd-repo-server -n argocd

3.2 仓库

每个仓库本质上是一个 secrets 资源。

  1. 获取仓库列表
1
2
3
argocd repo list
argocd repo list -owide
argocd repo list -yaml
  1. 添加仓库
1
argocd repo add https://gitlab.qx.lab/qiaoxiong/argodemo.git --username xxx --password <token>
1
argocd repo add git@gitlab.qx.lab:qiaoxiong/argodemo.git --ssh-private-key-path ./deploy_key

四、部署

  1. 创建应用

  1. 创建所需的选项

  1. 部署的集群

  1. 成功部署,并且可以访问

五、更新及回滚

5.1 更新

可以 web 直接操作资源对象,也可以修改 git 仓库,刷新后同步。

web ui 修改

gitlab 修改

因为前面设置了自动同步,所以只需要刷新即可

5.2 回滚

可以 web 操作回滚,也可以修 修改 git 仓库后,刷新,同步(省略)。也可以命令行回滚。

web ui 直接选一个旧版本回顾

命令行回滚又细分为两种,argocd-cli 提供的整个 application 回滚、kubenetes 提供的 deployemnt 回滚。

这里不展开了。