Argo CD部署应用程序
文章目录
一、添加集群
- 可以使用命令来添加集群(本机需要添加hosts解析)
1.1、登录集群
# 登录 Argo CD
[root@master ~]# argocd login grpc.argocd.devops-engineer.com.cn
WARNING: server certificate had error: tls: failed to verify certificate: x509: certificate is valid for ingress.local, not argocd.devops-engineer.com.cn. Proceed insecurely (y/n)? y
WARN[0002] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
Username: admin
Password:
'admin:login' logged in successfully
Context 'argocd.devops-engineer.com.cn' updated
1.2、查看上下文
# 查看 Argo CD 上下文
[root@master ~]# argocd context
CURRENT NAME SERVER
* grpc.argocd.devops-engineer.com.cn grpc.argocd.devops-engineer.com.cn
1.3、列出账户
[root@master ~]# argocd account list
NAME ENABLED CAPABILITIES
admin true login
1.4、添加集群
# 列出默认集群
# 默认集群是有点问题的
[root@master ~]# argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.
# 查看 k8s 集群使用账户
[root@master ~]# kubectl config get-contexts -o name
kubernetes-admin@kubernetes
# 添加集群
[root@master ~]# argocd cluster add kubernetes-admin@kubernetes
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `kubernetes-admin@kubernetes` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0028] ServiceAccount "argocd-manager" created in namespace "kube-system"
INFO[0028] ClusterRole "argocd-manager-role" created
INFO[0028] ClusterRoleBinding "argocd-manager-role-binding" created
INFO[0033] Created bearer token secret for ServiceAccount "argocd-manager"
Cluster 'https://192.168.93.145:6443' added
二、前往UI页面操作
登录后,点击 + New App 按钮,如下所示:
为您的应用程序指定名称 ,使用项目 ,并将同步策略保留为 :
guestbook``default``Manual
guestbook
:应用程序名称default
:项目名称Manual
:同步策略勾选
AUTO-CREATE-NAMESPACE
:如果要创建的目标集群中没有此名称空间,将会自动创建
将 https://github.com/wzhkgc/argocd-demo.git 仓库 url 设置为 github 仓库 url ,将 revision 保留为
HEAD
,并将路径设置为 :guestbook
guestbook
:指的是Kubernetes
资源清单路径,在此目录下
对于Destionation(目标),也就是要把应用程序部署到哪个集群中,可以添加
https://192.168.93.145:6443
,或者默认集群https://kubernetes.default.svc
Namespace:要把应用部署的名称空间(如果在上面的部署中勾选了
AUTO-CREATE-NAMESPACE
则不需要提前手动创建,CD流程会自动帮助我们创建),最后点击CREATE
。
- 通过 CLI 查看项目的状态
- 此时还是为同步状态
[root@master ~]# argocd app get guestbook
Name: argocd/guestbook
Project: default
Server: https://192.168.93.145:6443
Namespace: argocd-demo
URL: https://grpc.argocd.devops-engineer.com.cn/applications/guestbook
Repo: https://github.com/wzhkgc/argocd-demo.git
Target: HEAD
Path: guestbook
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: OutOfSync from HEAD (c6f7e7a)
Health Status: Missing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service argocd-demo guestbook-ui OutOfSync Missing
apps Deployment argocd-demo guestbook-ui OutOfSync Missing
三、通过 UI 同步应用
在 Applications 页面上,单击 guestbook 应用程序的 Sync 按钮
此时可以去查看名称空间知否被自动创建和Pod是否运行
[root@master ~]# kubectl get pod -n argocd-demo
NAME READY STATUS RESTARTS AGE
guestbook-ui-56c646849b-m6jgb 1/1 Running 0 87s
- 当我们在代码仓库进行了更改,比如变更Pod副本数量
# 通过之后即可看到控制器的Pod数量为期望数量
[root@master ~]# kubectl get pod -n argocd-demo
NAME READY STATUS RESTARTS AGE
guestbook-ui-56c646849b-m6jgb 1/1 Running 0 10m
guestbook-ui-56c646849b-zbwn4 1/1 Running 0 65s
# 看到副本变更了,也就是代码库中的期望值了,其实这个操作在 CLI 也支持,大家可以去发掘一下使方法,那么通过 Web UI 创建应用我们讲过了,那么还有一种就是通过 K8S 的 CRD 来创建应用
[root@master ~]# kubectl get crd | grep argoproj
applications.argoproj.io 2024-12-21T00:33:00Z
applicationsets.argoproj.io 2024-12-21T00:33:00Z
appprojects.argoproj.io 2024-12-21T00:33:00Z
# 可以看到,这里有三个 CRD 资源对象,我们可以通过创建 CRD 同步创建应用,其实是和Web UI 一样的,Web UI 创建之后,CRD 也会同步创建一个对象
[root@master ~]# kubectl get applications -n argocd
NAME SYNC STATUS HEALTH STATUS
guestbook Synced Healthy
# 可以看到这里的确是有一个和 Web UI 一样的应用,我们可以通过导出它的 YAML 来看看都是怎么样定义的
[root@master ~]# kubectl get application -n argocd guestbook -o yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
creationTimestamp: "2024-12-21T02:38:22Z"
generation: 28
name: guestbook
namespace: argocd
resourceVersion: "20129"
uid: 69dd8ac2-72e2-418f-bae8-6a33dea32975
spec:
destination:
namespace: argocd-demo
server: https://192.168.93.145:6443
project: default
source:
path: guestbook
repoURL: https://github.com/wzhkgc/argocd-demo.git
targetRevision: HEAD
四、CLI自定义Application
- 因为前面讲过,Argo CD 主要就是负责 CD 方面的操作,所以主要就是将上面的流水线中的Deploy这一步放到 Argo CD中去做,那么其实生成中都知道一个操作,就是我们的 CI/CD 的部署文件其实一般不会和代码存放在一起的,会把代码和部署清单放到两个仓库进行存储。
# 定义 Pod 资源
[root@master argocd-deploy]# cat pod.yaml
apiVersion: "v1"
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
# 定义 service 资源
[root@master argocd-deploy]# cat service.yaml
apiVersion: "v1"
kind: Service
metadata:
name: test
spec:
selector: # 标签选择器
app: nginx # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上
type: ClusterIP # 使用了Ingress,此处的svc的类型写为ClusterIP是一个规范的用法
ports:
- port: 80 # 对外暴露80端口
targetPort: 80 # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上
# 定义 Ingress 资源
[root@master argocd-deploy]# cat service.yaml
apiVersion: "v1"
kind: Service
metadata:
name: test
spec:
selector: # 标签选择器
app: nginx # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上
type: ClusterIP # 使用了Ingress,此处的svc的类型写为ClusterIP是一个规范的用法
ports:
- port: 80 # 对外暴露80端口
targetPort: 80 # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上
[root@master argocd-deploy]# cat ingress.yaml
apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
name: mini-ingress
labels:
app: nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/"
spec:
ingressClassName: nginx
rules:
- host: work.argocd.cn # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: test
port:
number: 80
- 这个仓库其实就是把 cdk-web-service 中的 deploy 下的部署文件分离出来,仅此而已,然后我们去创建一个应用,这个应用就是针对这个代码仓库,我们这次使用 CRD 仓库
[root@master ~]# cat cdk-web-service-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: cdk-web-service
namespace: argocd
spec:
destination:
namespace: default
server: 'https://192.168.93.145:6443'
source:
path: . # 在项目根目录下寻找 K8S 资源清单
repoURL: http://192.168.93.102/root/argocd-deploy.git
targetRevision: HEAD
project: default
syncPolicy:
automated:
# 开启后 Git Repo 中删除资源会自动在环境中删除对应的资源
prune: true
# 自动痊愈,强制以 Git Repo 状态为准,手动在环境中修改不会生效
selfHeal: true
# 查看 Application 状态
[root@master ~]# kubectl get application -n argocd
NAME SYNC STATUS HEALTH STATUS
cdk-web-service Synced Progressing
guestbook Synced Healthy
# 查看之后新创建的 Application 状态是不对劲的,
# 这是因为 Ingress 是在集群内不可访问的,那么需要修改 argocd 的 configmap
[root@master ~]# kubectl edit cm -n argocd argocd-cm
apiVersion: v1
# 添加这些信息
data:
resource.customizations: |
networking.k8s.io/Ingress:
health.lua: |
hs = {}
hs.status = "Healthy"
return hs
# 到这里是结尾
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"argocd-cm","app.kubernetes.io/part-of":"argocd"},"name":"argocd-cm","namespace":"argocd"}}
creationTimestamp: "2024-12-21T00:15:23Z"
labels:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
name: argocd-cm
namespace: argocd
resourceVersion: "22550"
uid: 558d369c-db47-4bd2-b249-6982a427ae11
# 再次查看 Application 创建
[root@master ~]# kubectl get application -n argocd
NAME SYNC STATUS HEALTH STATUS
cdk-web-service Synced Healthy
guestbook Synced Healthy
- Web UI 也会自动生成相应的 Application 页面