Menggunakan pencerminan registry untuk membuat cluster

Halaman ini menjelaskan cara membuat cluster menggunakan image yang diambil dari pencerminan registry, bukan dari registry publik, seperti gcr.io.

Duplikasi registry adalah salinan lokal registry publik yang menyalin atau mencerminkan struktur file registry publik. Misalnya, jalur ke pencerminan registry lokal adalah 172.18.0.20:5000. Saat containerd menemukan permintaan untuk mengambil image seperti gcr.io/kubernetes-e2e-test-images/nautilus:1.0, containerd akan mencoba mengambil image tersebut, bukan dari gcr.io, tetapi dari registry lokal Anda di jalur berikut: 172.18.0.20:5000/kubernetes-e2e-test-images/nautilus:1.0. Jika image tidak ada di jalur registry lokal ini, image akan otomatis diambil dari gcr.io registry publik.

Menggunakan pencerminan registry memberikan manfaat berikut:

  • Melindungi Anda dari pemadaman registry publik.
  • Mempercepat pembuatan pod.
  • Memungkinkan Anda melakukan pemindaian kerentanan sendiri.
  • Menghindari batas yang diberlakukan oleh registry publik terkait seberapa sering Anda dapat memberikan perintah kepada registry tersebut.

Sebelum memulai

  • Anda harus menyiapkan server registry container di jaringan Anda.
  • Jika server registry menjalankan sertifikat TLS pribadi, Anda harus memiliki file certificate authority (CA).
  • Jika server registry memerlukan autentikasi, Anda harus memiliki kredensial login atau file konfigurasi Docker yang tepat.
  • Untuk menggunakan pencerminan registry, Anda harus menetapkan runtime container ke containerd.

Download semua image yang diperlukan untuk GKE di Bare Metal

Download versi terbaru alat bmctl dan paket image dari halaman Download.

Mengupload image container ke server registry

Upload image dari paket image ke server registry dengan menjalankan:

[HTTPS_PROXY=http://PROXY_IP:PORT] ./bmctl push images \
    --source=./bmpackages_VERSION.tar.xz \
    --private-registry=REGISTRY_IP:PORT \
    [--cacert=CERT_PATH] \
    [--need-credential=false]

Ganti kode berikut:

  • PROXY_IP:PORT dengan alamat IP dan port proxy jika Anda memerlukan proxy untuk mengupload image dari workstation ke server registry.
  • VERSION dengan versi paket image yang Anda download dari halaman Download.
  • REGISTRY_IP:PORT dengan alamat IP dan port server registry pribadi.
  • CERT_PATH dengan jalur file sertifikat CA jika server registry Anda menggunakan sertifikat TLS pribadi.

Masukkan nama pengguna dan sandi Anda saat diminta, atau pilih file konfigurasi Docker. Jika server registry Anda tidak memerlukan kredensial, tentukan --need-credential=false.

Untuk mengetahui informasi selengkapnya tentang perintah bmctl push images, jalankan:

bmctl push images --help

Gunakan namespace Anda sendiri

Jika Anda ingin menggunakan namespace sendiri di server registry, bukan namespace root, containerd dapat mengambilnya dari namespace ini jika Anda menyediakan endpoint API untuk registry pribadi Anda di registryMirrors.endpoint. Endpoint biasanya dalam format <REGISTRY_IP:PORT>/v2/<NAMESPACE>. Lihat panduan pengguna registry pribadi Anda untuk mengetahui detail yang spesifik.

Misalnya, jika hanya memiliki akses ke 172.18.0.20:5000/test-namespace/, Anda dapat menggunakan perintah berikut untuk mengupload semua gambar pada namespace test-namespace:

./bmctl push images \
    --source=./bmpackages_VERSION.tar.xz \
    --private-registry=172.18.0.20:5000/test-namespace
    --username=<USERNAME>
    --password=<PASSWORD>
    --cacert <path/to/cert.crt>

Kemudian di file konfigurasi cluster, Anda dapat menambahkan kode berikut agar containerd menarik dari namespace:

registryMirrors:
  - endpoint: https://172.18.0.20:5000/v2/test-namespace

Membuat cluster dari duplikasi registry

Contoh file konfigurasi cluster berikut menentukan bahwa gambar akan diambil dari pencerminan registry lokal yang endpoint-nya adalah https://172.18.0.20:5000. Beberapa kolom yang muncul di awal file konfigurasi ini dijelaskan di bagian berikut.

# Sample cluster config with registry mirror:
---
gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json
sshPrivateKeyPath: /root/ssh-key/id_rsa
registryMirrors:
  - endpoint: https://172.18.0.20:5000
    caCertPath: /root/ca.crt
    pullCredentialConfigPath: /root/.docker/config.json
    hosts:
      - somehost.io
      - otherhost.io
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin1
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: admin1
  namespace: cluster-admin1
spec:
  nodeConfig:
    containerRuntime: containerd
...

Kolom hosts

containerd memeriksa bagian hosts dari file konfigurasi cluster untuk menemukan host mana yang dicerminkan secara lokal. Pada contoh file konfigurasi, registry publik yang tercantum di bagian hosts adalah somehost.io dan otherhost.io. Karena registry publik ini muncul di bagian hosts, containerd akan memeriksa pencerminan registry pribadi terlebih dahulu saat menemukan permintaan pull untuk image dari somehost.io atau otherhost.io.

Misalnya, containerd menerima perintah pull ke somehost.io/kubernetes-e2e-test-images/nautilus:1.0. Karena somehost.io tercantum sebagai salah satu host di bagian hosts pada file konfigurasi cluster, containerd akan melihat image kubernetes-e2e-test-images/nautilus:1.0 di cermin registry lokal. Jika somehost.io tidak tercantum di bagian hosts, containerd tidak tahu bahwa cermin lokal somehost.io ada. Dalam hal ini, containerd tidak memeriksa pencerminan untuk image, dan hanya mengambil image dari registry publik somehost.io.

Perlu diingat bahwa secara default, GKE pada Bare Metal otomatis mencerminkan gambar dari gcr.io sehingga Anda tidak perlu mencantumkan gcr.io sebagai host di bagian hosts.

Kolom gcrKeyPath

Jika Anda ingin GKE on Bare Metal menggunakan Container Registry (gcr.io) secara otomatis untuk mengambil image yang tidak muncul di registry lokal, Anda harus menentukan jalur ke kunci akun layanan Container Registry. GKE di Bare Metal tidak memiliki mekanisme untuk menyediakan kunci untuk registry publik lainnya.

Jika Anda tidak ingin menggunakan fitur yang memungkinkan image diambil dari gcr.io saat image tersebut tidak muncul di registry lokal, Anda tidak perlu menambahkan gcrKeyPath ke file konfigurasi cluster.

Kolom caCertPath

Jika registry Anda memerlukan sertifikat private transport layer security (TLS), kolom ini akan membawa jalur ke file sertifikat CA root server. File sertifikat ini harus berada di workstation admin, yaitu mesin yang menjalankan perintah bmctl. Jika registry tidak memerlukan sertifikat TLS pribadi, Anda dapat mengosongkan kolom caCertPath.

Kolom pullCredentialConfigPath

Jika server registry Anda tidak memerlukan file konfigurasi Docker autentikasi, Anda dapat mengosongkan kolom pullCredentialConfigPath. Perhatikan bahwa ini adalah jalur ke file konfigurasi pada mesin yang menjalankan perintah bmctl.

Membuat cluster pengguna dari pencerminan registry

Cluster pengguna tidak otomatis mengambil image dari pencerminan registry jika cluster adminnya telah dikonfigurasi untuk melakukannya. Agar cluster pengguna mengambil dari mirror registry, Anda harus mengonfigurasinya satu per satu seperti yang dijelaskan dalam Membuat cluster dari mirror registry.

Mengupdate endpoint duplikasi registry, sertifikat, dan pull kredensial

Untuk mengupdate endpoint pencerminan registry, sertifikat, atau menarik kredensial:

  1. Pada file konfigurasi cluster, perbarui endpoint, file sertifikat CA, dan tarik jalur file konfigurasi kredensial.

  2. Terapkan perubahan dengan menjalankan:

    bmctl update cluster -c CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
    

    Ganti kode berikut:

    • CLUSTER_NAME dengan nama cluster yang ingin Anda update.
    • ADMIN_KUBECONFIG dengan jalur file konfigurasi cluster adminnya.

Memverifikasi bahwa gambar diambil dari pencerminan registry

Bagian ini menjelaskan dua metode yang dapat Anda gunakan untuk memverifikasi apakah containerd menarik image dari pencerminan registry lokal, bukan dari registry publik.

Metode #1: membandingkan ringkasan repositori

Metode ini melibatkan perbandingan ringkasan repositori untuk menentukan apakah image telah diambil dari mirror registry Anda.

Perlu diingat bahwa registry memiliki ID unik yang disebut ringkasan repositori, dan image memiliki ID unik yang disebut ringkasan image container. Dua gambar yang identik memiliki ringkasan image container yang sama, meskipun gambar tersebut berasal dari registry yang berbeda. Namun, jika image berasal dari registry yang berbeda, image tersebut memiliki ringkasan repositori yang berbeda.

  1. Login ke node cluster menggunakan SSH.

  2. Pilih image yang asalnya ingin Anda verifikasi.

  3. Ambil image dari registry publik yang Anda gunakan dengan menjalankan perintah berikut:

    crictl pull PUBLIC_ENDPOINT
    

    Ganti PUBLIC_ENDPOINT dengan jalur image di registry publik. Contoh: gcr.io/anthos-baremetal-release/kube-rbac-proxy:v0.6.0-gke.0.

  4. Ambil image yang sama dari mirror registry Anda dengan menjalankan perintah berikut:

    crictl pull MIRROR_ENDPOINT
    

    Ganti MIRROR_ENDPOINT dengan jalur image di cermin registry Anda. Contoh: 10.168.15.224:5007/test-namespace/anthos-baremetal-release/kube-rbac-proxy:v0.6.0-gke.0.

  5. Jalankan perintah berikut untuk menampilkan ringkasan repositori dari dua gambar yang Anda tarik di langkah sebelumnya:

    crictl inspecti PUBLIC_OR_MIRROR_ENDPOINT | grep -A 3 repoDigests
    

    Ganti PUBLIC_OR_MIRROR_ENDPOINT dengan endpoint publik gambar atau endpoint pencerminan registry gambar. Salah satunya tidak masalah karena perintah crictl inspecti melihat ringkasan image container dari argumen yang Anda teruskan. Karena image dari registry publik identik dengan image dari mirror registry, keduanya memiliki ringkasan image container yang sama.

    Output dari perintah mungkin terlihat seperti ini:

     "repoDigests": [
       "gcr.io/anthos-baremetal-release/kube-rbac-proxy@sha256:27be66fb9140d83c4af8794a234b998c90e844e3414108ce72db603f4f6ea0b3",
       "10.168.15.224:5007/test-namespace/anthos-baremetal-release/kube-rbac-proxy@sha256:27be66fb9140d83c4af8794a234b998c90e844e3414108ce72db603f4f6ea0b3"
     ],
    
  6. Bandingkan ringkasan repositori yang muncul dalam huruf tebal pada output dari langkah sebelumnya. Jika ringkasannya identik, node dalam cluster Anda akan ditarik dari mirror registry Anda. Jika tidak, node cluster Anda menarik image dari registry publik.

Metode #2: memeriksa file config.toml

Anda dapat menentukan apakah containerd mengambil image dari registry lokal dengan memeriksa konten file config.toml seperti yang ditunjukkan dalam langkah-langkah berikut:

  1. Login ke node dan periksa konten file berikut: /etc/containerd/config.toml

  2. Periksa bagian plugins."io.containerd.grpc.v1.cri".registry.mirrors dalam file config.toml untuk melihat apakah server registry Anda tercantum di kolom endpoint. Berikut adalah kutipan dari file config.toml contoh yang menampilkan kolom endpoint dalam cetak tebal:

version = 2
root = "/var/lib/containerd"
state = "/run/containerd"
...
[plugins."io.containerd.grpc.v1.cri".registry]
  [plugins."io.containerd.grpc.v1.cri".registry.configs]
    [plugins."io.containerd.grpc.v1.cri".registry.configs."gcr.io"]
      [plugins."io.containerd.grpc.v1.cri".registry.configs."privateregistry2.io".tls]
        ca_file = '/etc/containerd/certs.d/privateregistry2.io/ca.crt'
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
      endpoint = ["http://privateregistry.io", "http://privateregistry2.io"]
...

Jika pencerminan registry muncul di kolom endpoint, berarti node menarik image dari mirror registry Anda, bukan dari registry publik.