1、简介

Argo CD 是一个为 Kubernetes 而生的,遵循声明式 GitOps 理念的持续部署(CD)工具,支持多种配置管理/模板工具(例如 Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)。

Argo CD 被实现为一个 Kubernetes 控制器,它持续监控正在运行的应用程序并将当前的实时状态与所需的目标状态(例如 Git 仓库中的配置文件)进行比较,在 Git 仓库更改时自动同步和部署应用程序。

2、部署

环境准备:
1、一套k8s集群(部署教程可以看k8s专栏,亲测无坑)
2、git仓库(此处为了方便演示cd过程,所以使用gitee作为演示)

部署:

# 创建命名空间
kubectl create namespace argocd 

# 下载yaml文件
wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

#修改argo-server的service的tpye为NodePort
vim install.yaml
...
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/name: argocd-server
    app.kubernetes.io/part-of: argocd
  name: argocd-server
spec:
  type: NodePort   #对外暴露端口
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    port: 443
    protocol: TCP
    targetPort: 8080
  selector:
    app.kubernetes.io/name: argocd-server
...

#部署(需要等待几分钟,拉取镜像的过程比较慢)
kubectl apply -n argocd -f install.yaml

#查看服务情况
kubectl get svc,deploy -n argocd

浏览器访问 ip:port

默认账号admin

密码获取方式:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=“{.data.password}” | base64 -d

3、持续部署至k8s

1、环境准备

在gitee上创建一个仓库argocd ,创建一个名为test的文件夹下面放yaml配置文件。配置文件如下:

# myapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v1
        name: myapp
        ports:
        - containerPort: 80
 
# myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32060
  type: NodePort
  selector:
    app: myapp

实验所需的镜像已经在阿里云的镜像仓库中准备好了,大家可以直接使用

在这里插入图片描述

2、argo配置

1、配置仓库认证
在这里插入图片描述
配置过程省略

2、创建项目

#创建k8s名称空间,本次项目部署在该处
kubectl create namespace devops

在这里插入图片描述

在这里插入图片描述
创建成功会看到这个
在这里插入图片描述
访问 ip+port

3、更新与回滚

更新
修改gitee上deploy的版本为v2
在这里插入图片描述
观察argo,自动更新
在这里插入图片描述
访问 ip+port

2、回退
在这里插入图片描述
在这里插入图片描述

访问 ip+port

4、argo rollout 灰度发布(金丝雀)

Argo Rollouts 是一个 Kubernetes Operator 实现,它为 Kubernetes 提供更加高级的部署能力,如蓝绿、金丝雀、金丝雀分析、实验和渐进式交付功能,为云原生应用和服务实现自动化、基于 GitOps 的逐步交付。

支持特性如下:

  • 蓝绿色更新策略
  • 金丝雀更新策略
  • 细粒度,加权流量转移
  • 自动回rollback和promotion
  • 手动判断
  • 可定制的指标查询和业务KPI分析
  • 入口控制器集成:NGINX,ALB
  • 服务网格集成:Istio,Linkerd,SMI
  • Metric provider集成:Prometheus,Wavefront,Kayenta,Web,Kubernetes Jobs
  • Argo原理和Deployment差不多,只是加强rollout的策略和流量控制。当spec.template发送变化时,Argo-Rollout就会根据spec.strategy进行rollout,通常会产生一个新的ReplicaSet,逐步scale down之前的ReplicaSet的pod数量。

1、部署

~ kubectl create namespace argo-rollouts
~ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.0.2/install.yaml
~ kubectl get all -n argo-rollouts


~ curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.0.2/kubectl-argo-rollouts-darwin-amd64
~ chmod +x ./kubectl-argo-rollouts-darwin-amd64
~ sudo mv ./kubectl-argo-rollouts-darwin-amd64 /usr/local/bin/kubectl-argo-rollouts


2、发布

在gitee仓库中准备配置文件

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: myapp2
spec:
  replicas: 5  # 定义5个副本
  strategy:  # 定义升级策略
    canary:   # 金丝雀发布
      steps:  # 发布的节奏
      - setWeight: 20
      - pause: {}  # 会一直暂停
      - setWeight: 40
      - pause: {duration: 10}
      - setWeight: 60
      - pause: {duration: 10}
      - setWeight: 80
      - pause: {duration: 10}
  revisionHistoryLimit: 2  # 下面部分其实是和 Deployment 兼容的
  selector:
    matchLabels:
      app: myapp2
  template:
    metadata:
      labels:
        app: myapp2
    spec:
      containers:
      - name: rollouts-demo
        image: registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v1
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 5m
 
---
# basic-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp2
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32070
  selector:
    app: myapp2
#发布
kubectl apply -f rollout-demo.yaml
#查看发布情况
➜  ~ kubectl argo rollouts get rollout myapp2 --watch

#更新
➜  ~ kubectl argo rollouts set image myapp2 \
  rollouts-demo=registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v2

#暂停时,切换下一步
# 经过上面的更新后,Rollout 现在处于暂停状态,当一个 Rollout 到达一个没有持续时间的暂停步骤时,它将一直保持在暂停状态,直到它被恢复/提升。要手动将 Rollout 切换到下一个步骤,请运行插件的 promotion 命令
➜  ~ kubectl argo rollouts promote rollouts-demo
➜  ~ kubectl argo rollouts get rollout myapp2 --watch

#中断更新
#恢复到stable版本
➜  ~ kubectl argo rollouts abort myapp2

#回退
➜  ~ kubectl-argo-rollouts undo  myapp2 --to-revision=1

3、可视化界面

kubectl argo rollouts dashboard

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐