딥 링크

딥 링크를 사용하면 사용자가 Argo CD 사용자 인터페이스에서 Splunk, Datadog 같은 타사 시스템으로 빠르게 이동할 수 있어요. 운영자는 딥 링크 템플릿을 argocd-cm에 구성해서 타사 시스템 링크를 설정할 수 있답니다.

출처: 문서

본문

Argo CD 관리자는 argocd-cm에 구성된 딥 링크 템플릿을 제공해서 타사 시스템 링크를 설정할 수 있어요. 템플릿은 조건부로 렌더링될 수 있고, 링크가 표시되는 위치와 관련된 다양한 리소스 유형(프로젝트, 애플리케이션, 개별 리소스(파드, 서비스 등))을 참조할 수 있어요.

딥 링크 구성은 argocd-cm<location>.links 필드로 존재하며, <location>은 어디에 표시될지 결정해요. <location>의 가능한 값은 다음과 같아요:

  • project: 이 필드 아래의 모든 링크는 Argo CD UI의 프로젝트 탭에 표시돼요
  • application: 이 필드 아래의 모든 링크는 애플리케이션 요약(summary) 탭에 표시돼요
  • resource: 이 필드 아래의 모든 링크는 리소스(deployments, pods, services 등) 요약 탭에 표시돼요

목록의 각 링크에는 다섯 개의 하위 필드가 있어요:

  1. title: UI에 해당 링크로 표시될 제목/태그
  2. url: 딥 링크가 이동할 실제 URL. 이 필드는 위치에 따라 해당 애플리케이션, 프로젝트, 리소스 객체의 데이터를 사용하도록 템플릿화할 수 있어요. 템플릿화에는 text/template 패키지를 사용해요
  3. description (선택): 딥 링크가 무엇에 대한 것인지 설명
  4. icon.class (선택): 드롭다운 메뉴에 링크를 표시할 때 사용할 font-awesome 아이콘 클래스
  5. if (선택): true 또는 false로 평가되는 조건문으로, url 필드와 같은 데이터에 접근할 수 있어요. 조건이 true로 평가되면 딥 링크가 표시되고, 그렇지 않으면 숨겨져요. 필드를 생략하면 기본적으로 딥 링크가 표시돼요. 조건 평가에는 expr-lang/expr을 사용해요

[!NOTE] Secret 종류의 리소스는 데이터 필드가 redact 되지만 다른 필드는 딥 링크 템플릿에 접근할 수 있어요.

[!WARNING] 데이터 유출이나 악성 링크 생성을 막기 위해 url 템플릿과 입력값을 검증하세요.

앞서 언급했듯이 링크와 조건은 리소스의 데이터를 사용하도록 템플릿화할 수 있으며, 각 링크 카테고리는 해당 리소스에 연결된 서로 다른 유형의 데이터에 접근할 수 있어요. 시스템에서 템플릿화에 사용할 수 있는 리소스는 총 4가지예요:

  • app 또는 application: 애플리케이션 리소스 데이터에 접근하는 데 사용되는 키예요
  • resource: 실제 k8s 리소스의 값에 접근하는 데 사용되는 키예요
  • cluster: name, server, namespaces 등 관련 대상 클러스터 데이터에 접근하는 데 사용되는 키예요
  • project: 프로젝트 리소스 데이터에 접근하는 데 사용되는 키예요

위 리소스는 특정 링크 카테고리에서 접근할 수 있으며, 각 카테고리에서 사용 가능한 리소스 목록은 다음과 같아요:

  • resource.links: resource, application, cluster, project
  • application.links: app/application, cluster
  • project.links: project

딥 링크와 그 변형이 포함된 argocd-cm.yaml 파일 예시:

  # sample project level links
  project.links: |
    - url: https://myaudit-system.com?project={{.project.metadata.name}}
      title: Audit
      description: system audit logs
      icon.class: "fa-book"
  # sample application level links
  application.links: |
    # pkg.go.dev/text/template is used for evaluating url templates
    - url: https://mycompany.splunk.com?search={{.app.spec.destination.namespace}}&env={{.project.metadata.labels.env}}
      title: Splunk
    # conditionally show link e.g. for specific project
    # github.com/expr-lang/expr is used for evaluation of conditions
    - url: https://mycompany.splunk.com?search={{.app.spec.destination.namespace}}
      title: Splunk
      if: application.spec.project == "default"
    - url: https://{{.app.metadata.annotations.splunkhost}}?search={{.app.spec.destination.namespace}}
      title: Splunk
      if: app.metadata.annotations.splunkhost != ""
  # sample resource level links
  resource.links: |
    - url: https://mycompany.splunk.com?search={{.resource.metadata.name}}&env={{.project.metadata.labels.env}}
      title: Splunk
      if: resource.kind == "Pod" || resource.kind == "Deployment"

    # sample checking a tag exists that contains - or / and how to alternatively access it
    - url: https://mycompany.splunk.com?tag={{ index .resource.metadata.labels "some.specific.kubernetes.like/tag" }}
      title: Tag Service
      if: resource.metadata.labels["some.specific.kubernetes.like/tag"] != nil && resource.metadata.labels["some.specific.kubernetes.like/tag"] != ""

더 알아보기 (Learn more)