GitOps最强工具-2. Argo CD安装

更多请看官方安装https://argoproj.github.io/argo-cd/getting_started/#port-forwarding

1. 下载argocd

​ 创建argocd命名空间

$ kubectl create namespace argocd

​ 下载argocd

$ wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -O argo-cd.yaml

高可用方案安装

https://raw.githubusercontent.com/argoproj/argo-cd/v1.4.1/manifests/ha/install.yaml

2. 修改镜像地址

可以的小伙伴可以略过这步,在国内无法下载argocd 需要替换镜像地址。

​ 替换镜像地址

$ sed -i -e 's?image: argoproj?image: dockerhub.azk8s.cn/argoproj?g'  -e 's?quay.io?quay.azk8s.cn?g' -e 's?k8s.gcr.io?gcr.azk8s.cn/google-containers?g'  argo-cd.yaml

​ 查看是否替换

$ grep image: argo-cd.yaml

3. 安装argocd

$ kubectl apply -n argocd -f argo-cd.yaml

4. 配置访问入口

Argo CD既运行gRPC服务器(由CLI使用),又运行HTTP / HTTPS服务器(由UI使用)。argocd-server服务对象在以下端口上公开了这两种协议:

  • 443-gRPC / HTTPS
  • 80-HTTP(重定向到HTTPS

具体看官方:https://argoproj.github.io/argo-cd/operator-manual/ingress/

选项1:SSL传递

Argo CD在同一端口(443)上提供多种协议(gRPC / HTTPS),这在尝试为argocd-service定义单个nginx入口对象和规则时提出了挑战,因为nginx.ingress.kubernetes.io/backend-protocol 注释 仅接受后端的单个值协议(例如HTTP,HTTPS,GRPC,GRPCS)。

带证书管理器的SSL传递的加密

cat >   argocd-ingress.yaml <<-EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    # If you encounter a redirect loop or are getting a 307 response code 
    # then you need to force the nginx ingress to connect to the backend using HTTPS.
    #
    # nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: argocd.example.com
    http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: https
        path: /
  tls:
  - hosts:
    - argocd.example.com
    secretName: argocd-secret # 请勿更改,这是由Argo CD提供的
EOF

#运行
$ kubectl apply -f argocd-ingress.yaml 

在nginx-ingress-controller增加--enable-ssl-passthrough

$ kubectl edit DaemonSet/nginx-ingress-controller -n ingress-nginx

###
containers:
      - args:
        - /nginx-ingress-controller
        - --configmap=$(POD_NAMESPACE)/nginx-configuration
        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx
        - --annotations-prefix=nginx.ingress.kubernetes.io
        - --enable-ssl-passthrough #在args追加
        env:
        ...

然后直接访问https://argocd.example.com

选项2:多个入口对象和主机

由于ingress-nginx Ingress每个Ingress对象仅支持单个协议,因此另一种方法是定义两个Ingress对象。一个用于HTTP / HTTPS,另一个用于gRPC:

HTTP / HTTPS入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: argocd-server-http-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: http
    host: argocd.example.com
  tls:
  - hosts:
    - argocd.example.com
    secretName: argocd-secret # do not change, this is provided by Argo CD

gRPC入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: argocd-server-grpc-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: https
    host: grpc.argocd.example.com
  tls:
  - hosts:
    - grpc.argocd.example.com
    secretName: argocd-secret # do not change, this is provided by Argo CD

编辑argocd-server deployment以将--insecure标志添加 到argocd-server命令:

spec:
  template:
    spec:
      name: argocd-server
      containers:
      - command:
        - /argocd-server
        - --staticassets
        - /shared/app
        - --repo-server
        - argocd-repo-server:8081
        - --insecure  #追加

更多暴露方式查看官方

以上两种暴露方式都可以

5. 访问UI

https://argocd.example.com

用户名是admin

密码是árgocd-server的pod name

$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
argocd-server-7df76c4c8c-msgpm

6.argocd CIL 安装

从 https://github.com/argoproj/argo-cd/releases/latest下载Argo CD工具

  • liunx安装
$ VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

VERSION下面的命令替换为您要下载的Argo CD的版本:

$curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64

使argocdCLI可执行:

$ chmod +x /usr/local/bin/argocd

现在,您应该可以运行argocd命令了。

  • Mac 安装
$ brew tap argoproj/tap
$ brew install argoproj/tap/argocd

可以参考:https://argoproj.github.io/argo-cd/cli_installation/

7.访问Argo CD API服务器

默认情况下,Argo CD API服务器未使用外部IP公开。要访问API服务器,请选择以下技术之一以公开Argo CD API服务器:

  • 服务类型负载均衡器

将argocd-server服务类型更改为LoadBalancer

$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

​ or

  • 端口转发

    Kubectl端口转发也可以用于连接到API服务器而无需公开服务。

$ kubectl port-forward svc/argocd-server -n argocd --address 0.0.0.0 8080:443

注意:我们上面已经配置ingress 方式暴露Argocd ,我们可以不用这个端口转发的方式用上面配置的ingress也是可以的。

8.使用CLI登录

初始密码将自动生成为Argo CD API服务器的容器名称。可以使用以下命令进行检索:

$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
argocd-server-7df76c4c8c-msgpm

使用上面的用户名admin和密码,登录到Argo CD的IP或主机名:

argocd login 

使用以下命令更改密码:

argocd account update-password		

这里我们直接在端口转发的方式在master节点进行登录

# 端口转发方式登录
$ argocd login localhost:8080
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password: 
'admin' logged in successfully
Context 'localhost:8080' updated
# 修改密码
$ argocd account update-password
*** Enter current password: 
*** Enter new password: 
*** Confirm new password: 
Password updated
Context 'localhost:8080' updated

OR

Ingress 的IP登录

$ argocd login 'Ingress地址'

9. 注册群集以将应用程序部署到(可选)

Argocd可以实现多集群部署管理

如果要在Argo CD群集外部的群集上部署应用程序,则需要使用Argo CD注册应用程序群集的凭据。

此步骤将群集的凭据注册到Argo CD,仅在部署到外部群集时才需要。在内部进行部署(到与Argo CD运行所在的群集)时,应将https://kubernetes.default.svc用作应用程序的K8s API服务器地址。

首先列出当前kubconfig中的所有集群上下文:

$ kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
*         docker-for-desktop              kubernetes   kubernetes-admin

列表中选择一个上下文名称,并将其提供给argocd cluster add CONTEXTNAME。例如,对于docker-for-desktop上下文,运行:

$ argocd cluster add docker-for-desktop

上面的命令将ServiceAccount(argocd-manager)安装到该kubectl上下文的kube-system命名空间中,并将该服务帐户绑定到管理员级别的ClusterRole。Argo CD使用此服务帐户令牌执行其管理任务(即,部署/监视)。

该规则的argocd-manager-role作用可以被修改,使得它只有createupdatepatchdelete特权一组有限的名称空间,组,种。但是get,在群集作用域中listwatch特权需要Argo CD才能运行。

如果有兴趣了解ArgoCD,请继续关注ArgoCD 剩余连载文章,谢谢。

请看下篇Argocd部署应用

你可能感兴趣的:(DevOps)