+4

[ArgoCD] Phần 2: Kết nối đến Private Repository

👋👋👋 Hello hello, xin chào tất cả anh em. Anh em nào đã lỡ vào đây rồi thì comment chào nhau một cái nhé cho đông vui nhé!

Mở đầu

Trong Phần 1: Giới thiệu và cài đặt ArgoCD, chúng ta đã tìm hiểu cách thức hoạt động của ArgoCD đồng thời cài đặt nó bằng cách sử dụng Helm. Không giống như FluxCD, ArgoCD cần được cài đặt thủ công bằng tay. Sau đó, người ta sẽ áp dụng App of Apps pattern để ArgoCD bootstrap các thành phần khác của cluster.

Chú ý: Bài viết này sẽ dụng lại ArgoCD được tạo bằng Helm ở phần trước. Do đó, nếu bạn cài đặt ArgoCD bằng cách khác, vui lòng đọc thêm tài liệu trong ArgoCD Document để thực hiện các bước tương tự.

Cái nhìn tổng quan

Trước tiên, chúng ta cần cung cấp credentials cho ArgoCD dùng để xác thực tài khoản (authentication) khi thực hiện pull private repository. Ở đây mình sẽ kết nối đến GitHub, các provider khác cũng làm tương tự. Một số cách thức authentication bao gồm:

  • Sử dụng username/password khi kết nối tới private repository (git, helm) bằng HTTPS
  • Sử dụng Personal Access Token (PAT)
  • Sử dụng SSH Private Key khi kết nối bằng SSH
  • Sử dụng GitHub App

Dù là dùng cách nào thì các thông tin credentials trên đều cần được lưu lại dưới dạng Secret trong K8s. Các bạn có thể dùng CLI hoặc UI, ArgoCD sẽ tạo ra các Secret tương ứng.

Có hai loại Secret chứa thông tin credentials được phân biệt dựa trên label:

  1. "argocd.argoproj.io/secret-type":"repository" -> Repository - Dữ liệu trong này chính là các thông tin để khai báo một private repository luôn, tuy nhiên credential đi kèm sử dụng cho repository đang được khai báo. Repository ở đây có thể là Git hoặc Helm nha mọi người. Khi các bạn vào trong trang Settings > Repositories khai báo Repository thì ArgoCD sẽ tạo ra Secret loại này.
  2. "argocd.argoproj.io/secret-type":"repo-creds" -> Credential Template - Là một cấu hình mẫu, nó kèm luôn cả credentials và được lưu lại để tái sử dụng cho nhiều Repository khác. Nếu mình tạo một Credential Template có chứa Git App credentials và để Repo URL là https://github.com/devsuccess101 thì cấu hình mẫu này sẽ được dùng để xác thực cho tất cả các Repository khớp URL. Cụ thể là tất cả repositories trong organization @devsuccess101. Khi các bạn vào trong trang Settings > Repositories khai báo Repository nhưng lưu lại thành Credential Template thì ArgoCD sẽ tạo ra Secret loại này.

Mẫu Secret của Credential Template sẽ kiểu như này:

apiVersion: v1
kind: Secret
metadata:
  name: argocd-repo-creds-ds101-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repo-creds
type: Opaque
data:
  githubAppID: ZmFrZQo=
  githubAppInstallationID: ZmFrZQo==
  githubAppPrivateKey: ZmFrZQo=
  project: ZmFrZQo=
  type: Z2l0
  url: aHR0cHM6Ly9naXRodWIuY29tL2RldnN1Y2Nlc3MxMDE=

Khai báo Repository và Credential Template bằng UI / CLI

Cả RepositoryCredential Template đều có thể tạo thông qua UI bằng cách:

  1. Vào trang Settings > Repositories.
  2. Nhấn nút +CONNECT REPO.
  3. Điền đầy đủ thông tin xác thực tương ứng.
  4. Sau khi nhập xong, bạn sẽ chọn một trong hai nút:
    • Nhấn CONNECT nếu muốn lưu thành Repository.
    • Nhấn SAVE AS CREDENTIAL TEMPLATE nếu muốn lưu lại thành Credential Template.

Note:

  • Nếu tạo bằng Web UI, bạn cần export các Secret tương ứng thành các file YAML để lưu lại vào GitOps Repository.
  • Nếu tạo bằng CLI, bạn xem câu lệnh trong official doc tại đây.
  • Sau khi khai báo Repositories thành công, các Application cùng repo url sẽ có thể pull Repository về server.

Sau khi tạo Repository, trạng thái của chúng không thể hiện Successful như trong hình thì là thông tin cung cấp chưa đúng. Bạn hãy kiểm tra lại các thông tin credentials của mình nhé.

image.png

Khai báo Private Repository bằng Helm

Thay vì dùng UI như ở trên, mình sẽ cung cấp thông tin credentials trong file values.yaml cho Helm Chart và lưu lại file này trong GitOps Repository.

  1. Tạo mới một file values.yaml.
  2. Thêm trường configs.repositories theo mẫu để khai báo Repository. Ở đây mình khai báo 1 Git Repository (private) và 3 Helm Repository (public). Private Git Repository của mình không có thông tin credentials vì mình cung cấp qua Credential Template ở bước tiếp theo:
configs:
  repositories:
    ds101-cluster:
      url: https://github.com/devsuccess101/ds101-cluster
      type: git
    bitnami:
      type: helm
      url: https://charts.bitnami.com/bitnami
    devspace:
      type: helm
      url: https://charts.devspace.sh
    ory:
      type: helm
      url: https://k8s.ory.sh/helm/charts
  1. Tạo thêm Credential Template để đăng nhập đối với tất cả Git Repository thuộc organization https://github.com/devsuccess101 (trong đó có 1 private git repository devsuccess101/ds101-cluster). Chúng ta thêm trườngconfigs.credentialTemplates vào file values.yaml để khai báo thông tin credentials. Các thông tin này sẽ khác nhau tùy vào phương pháp xác thực, các bạn hãy đọc tiếp ở bên dưới nhé.
  2. Sau khi các bạn điền thông tin credentials phù hợp theo hướng dẫn ở phần tiếp theo. Hãy quay lại đây và chạy command của Helm tương tự như đã làm ở phần 1 nhé:
helm upgrade --install argocd argo/argo-cd \
  -n argocd --create-namespace \
  -f values.yaml

Tạo Credential Templates

Cách 1: Dùng Username / Password

Cách này thì đơn giản rồi, bạn thay username và password vào phần credentialTemplates theo mẫu dưới đây. Nếu tài khoản của bạn sử dụng 2FA, bạn cần phải tạo Personal Access Token thay thế.

configs:
  credentialTemplates:
    https-creds:
      url: https://github.com/devsuccess101
      username: my-username
      password: my-password

Cách 2: Dùng Personal Access Token

  1. Tạo PAT (classic) theo hướng dẫn của GitHub nhưng đừng lưu PAT ngay. Hãy làm tiếp bước số 2.
  2. Ở bước chọn Scopes, hãy tích chọn repo như hình sau đó nhấn tạo PAT:

image.png

  1. Khai báo credentialTemplatesrepositories trong file values.yaml
configs:
  credentialTemplates:
    https-creds:
      url: https://github.com/devsuccess101
      username: my-username
      password: my-personal-access-token

Cách 3: Dùng SSH Private Key

  1. Tạo và thêm SSH Keys vào tài khoản theo hướng dẫn của GitHub. Hãy thử clone private repository bằng SSH Key trước để đảm bảo SSH Key đã được thiết lập đúng đắn.
  2. Khai báo credentialTemplatesrepositories trong file values.yaml:
configs:
  credentialTemplates:
    ssh-creds:
     url: git@github.com:devsuccess101
     sshPrivateKey: |
       -----BEGIN OPENSSH PRIVATE KEY-----
       ...
       -----END OPENSSH PRIVATE KEY-----

Cách 4: Dùng GitHub App

Trong phần này, mình sẽ kết nối đến GitHub Repository bằng sử dụng GitHub App. Sau đó lưu thông tin credential lại thành Credential Template.

Tạo GitHub App

  1. Đăng ký GitHub App theo hướng dẫn của GitHub. Nhưng đừng tạo app ngay mà bạn cần sửa một số thông tin khi đăng ký app theo hướng dẫn phía dưới nữa nhé.
  2. Ở mục Webhook, bỏ tích Active để tắt Webhook. (Có thể sửa lại sau này)
  3. Ở mục Repository permissions, hãy chọn các quyền sau:
    • Commit statuses: Read and write
    • Contents: Read-only
    • Deployments: Read and write
    • Metadata: Read-only
    • Pull requests: Read and write
  4. Kéo xuống cuối cùng, ở mục Where can this GitHub App be installed? (không thể sửa lại), hãy chọn:
    • Only on this account - Nếu chỉ muốn app có thể cài cho tài khoản cá nhân bạn đang đăng nhập.
    • Any account - Nếu muốn bất kỳ user, bất kỳ organization nào cũng có thể dùng.
  5. Nhấn Create GitHub App để tạo GitHub App. Tạo thành công bạn sẽ được điều hướng tới trang chỉnh sửa thông tin của GitHub App vừa tạo.
  6. Ở mục Private keys, nhấn nút Generate a private key. Một file private key sẽ được download về máy bạn. Hãy tạm thời cất giấu nó.

Cài đặt GitHub App

  1. Ở trang chỉnh sửa GitHub app, bạn chuyển sang tab Install ở cột bên trái màn hình.
  2. Trong danh sách tài khoản hiện ra ở bên phải, bạn muốn cài vào tài khoản nào thì nhấn nút Install tương ứng.

image.png

  1. Trong màn hình cài đặt, hãy chọn các repositories được cấp quyền truy cập. Hoặc chọn All repositories.
  2. Nhấn nút Install và tiếp tục để hoàn thành việc cài đặt.

Sửa file values.yaml

Chuẩn bị file values.yaml theo mẫu:

configs:
  credentialTemplates:
    ds101-cluster:
      githubAppID: "924036"
      githubAppInstallationID: "51953849"
      githubAppPrivateKey: |
        -----BEGIN RSA PRIVATE KEY-----
        MIIEogIBAAKCAQEAxQgKIC2tduZ5ag/ANL7/3kfUy6/nIZKngLrAe/nRUT2Ls5Gl
        Gm5jcbIeTQCXqAjkdn4qam7pQIxNLI6qVw5uZgNLDGB/hgPIcdX48njtHS6bW3Ju
        Mwgtcll24vtQr5ciPCew0PbKtpyu2Y6GCwy9zysdVn0yTUfZOTIwPDjMMYyEqU2c
        Q0+3VH51U4688aG7QkL4ArxG9O5/DuaE4ELvgoj2mQQXoB4A62iSYX7dJPa7QQ7T
        tOXbDunU81UYmV3D0AtBiVFINVBigNoQ1ERobuJB3/ddRfryWiShorHik9CM0q7M
        s/lmA2hL8XyVvdiwU3cLZDPzRzKVxUeKshkAJmtrAkFrnODf5WE2G3lIFFL5v/ZJ
        0M7lo56SUIfJLF5A7lkLNmi40igBpKtlbETmRB9S/JYiovwMbFk=
        -----END RSA PRIVATE KEY-----
      project: default
      type: git
      url: https://github.com/devsuccess101

Hãy sửa lại các thông tin credentials cho phù hợp với bạn:

image.png

Truy cập lại trang Dashboards của ArgoCD, nếu đủ các Repository kết nối thành công là OK.

image.png

Tổng kết

  • Mình đã cấu hình thành công để ArgoCD có thể kết nối được đến Private Repository.
  • Các bạn cũng đã hình dung ra được cách thức ArgoCD lưu trữ credentials của repository đó là sử dụng hai loại Secret: Repository và Credential Template.
  • Đến đây mình và các bạn đã sẵn sàng để bootstrap các thành phần khác cho cluster bằng ArgoCD.

Next Steps

  • Tạo Git Repository để chứa tất cả các cấu hình về cài đặt ArgoCD (helm values), Guestbook (YAML manifest, Application).
  • Tạo Application để ArgoCD tự tracking chính nó và toàn bộ các apps khác của cluster.

Mọi người ủng hộ mình bằng cách giúp mình một lượt like và subscribe DevSuccess101 trên nền tảng mà bạn yêu thích phía dưới nhé. Cảm ơn các bạn đã đón đọc.

✴️ Website: https://devsuccess101.com
✴️ Subscribe kênh! https://l.devsuccess101.com/subscribe
✴️ Join our Discord community for help https://l.devsuccess101.com/discord
✴️ Donate: Momo, Paypal

✴️ TikTok: https://l.devsuccess101.com/tiktok
✴️ YouTube: https://l.devsuccess101.com/youtube
✴️ Viblo: https://l.devsuccess101.com/viblo
✴️ Facebook: https://l.devsuccess101.com/facebook
✴️ Discord: https://l.devsuccess101.com/discord


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí