|
| 1 | +--- |
| 2 | +title: Image |
| 3 | +content_template: templates/concept |
| 4 | +weight: 10 |
| 5 | +--- |
| 6 | + |
| 7 | +{{% capture overview %}} |
| 8 | + |
| 9 | +Kamu membuat Docker _image_ dan mengunduhnya ke sebuah registri sebelum digunakan di dalam Kubernetes Pod. |
| 10 | + |
| 11 | +Properti `image` dari sebuah Container mendukung sintaksis yang sama seperti perintah `docker`, termasuk registri privat dan _tag_. |
| 12 | + |
| 13 | +{{% /capture %}} |
| 14 | + |
| 15 | + |
| 16 | +{{% capture body %}} |
| 17 | + |
| 18 | +## Memperbarui Image |
| 19 | + |
| 20 | +Kebijakan _pull default_ adalah `IfNotPresent` yang membuat Kubelet tidak |
| 21 | +lagi mengunduh (_pull_) sebuah image jika sudah ada terlebih dahulu. Jika kamu ingin agar |
| 22 | +selalu diunduh, kamu bisa melakukan salah satu dari berikut: |
| 23 | + |
| 24 | +- mengatur `imagePullPolicy` dari Container menjadi `Always`. |
| 25 | +- buang `imagePullPolicy` dan gunakan `:latest` _tag_ untuk _image_ yang digunakan. |
| 26 | +- buang `imagePullPolicy` dan juga _tag_ untuk _image_. |
| 27 | +- aktifkan [AlwaysPullImages](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages) _admission controller_. |
| 28 | + |
| 29 | +Harap diingat kamu sebaiknya hindari penggunaan _tag_ `:latest`, lihat [panduan konfigurasi](/docs/concepts/configuration/overview/#container-images) untuk informasi lebih lanjut. |
| 30 | + |
| 31 | +## Membuat Image Multi-arsitektur dengan Manifest |
| 32 | + |
| 33 | +Docker CLI saat ini mendukung perintah `docker manifest` dengan anak perintah `create`, `annotate`, dan `push`. Perintah-perintah ini dapat digunakan |
| 34 | +untuk membuat (_build_) dan mengunggah (_push_) manifes. Kamu dapat menggunakan perintah `docker manifest inspect` untuk membaca manifes. |
| 35 | + |
| 36 | +Lihat dokumentasi docker di sini: |
| 37 | +https://docs.docker.com/edge/engine/reference/commandline/manifest/ |
| 38 | + |
| 39 | +Lihat contoh-contoh bagaimana kami menggunakan ini untuk proses _build harness_: |
| 40 | +https://cs.k8s.io/?q=docker%20manifest%20(create%7Cpush%7Cannotate)&i=nope&files=&repos= |
| 41 | + |
| 42 | +Perintah-perintah ini bergantung pada Docker CLI, dan diimplementasi hanya di sisi CLI. Kamu harus mengubah `$HOME/.docker/config.json` dan mengatur _key_ `experimental` untuk mengaktifkan |
| 43 | +atau cukup dengan mengatur `DOCKER_CLI_EXPERIMENTAL` variabel _environment_ menjadi `enabled` ketika memanggil perintah-perintah CLI. |
| 44 | + |
| 45 | +{{< note >}} |
| 46 | +Gunakan Docker *18.06 ke atas*, versi-versi di bawahnya memiliki _bug_ ataupun tidak mendukung perintah eksperimental. Contohnya https://github.com/docker/cli/issues/1135 yang menyebabkan masalah di bawah containerd. |
| 47 | +{{< /note >}} |
| 48 | + |
| 49 | +Kalau kamu terkena masalah ketika mengunggah manifes-manifes yang rusak, cukup bersihkan manifes-manifes yang lama di `$HOME/.docker/manifests` untuk memulai dari awal. |
| 50 | + |
| 51 | +Untuk Kubernetes, kami biasanya menggunakan _image-image_ dengan sufiks `-$(ARCH)`. Untuk kompatibilitas (_backward compatibility_), lakukan _generate image-image_ yang lama dengan sufiks. Idenya adalah men-_generate_, misalnya `pause` image yang memiliki manifes untuk semua arsitektur dan misalnya `pause-amd64` yang punya kompatibilitas terhadap konfigurasi-konfigurasi lama atau berkas-berkas YAML yang bisa saja punya _image-image_ bersufiks yang di-_hardcode_. |
| 52 | + |
| 53 | +## Menggunakan Registri Privat (_Private Registry_) {#menggunakan-registri-privat} |
| 54 | + |
| 55 | +Biasanya kita memerlukan _key_ untuk membaca _image-image_ yang tersedia pada suatu registri privat. |
| 56 | +Kredensial ini dapat disediakan melalui beberapa cara: |
| 57 | + |
| 58 | + - Menggunakan Google Container Registry |
| 59 | + - per-klaster |
| 60 | + - konfigurasi secara otomatis pada Google Compute Engine atau Google Kubernetes Engine |
| 61 | + - semua Pod dapat membaca registri privat yang ada di dalam proyek |
| 62 | + - Menggunakan Amazon Elastic Container Registry (ECR) |
| 63 | + - menggunakan IAM _role_ dan _policy_ untuk mengontrol akses ke repositori ECR |
| 64 | + - secara otomatis _refresh_ kredensial login ECR |
| 65 | + - Menggunakan Oracle Cloud Infrastructure Registry (OCIR) |
| 66 | + - menggunakan IAM _role_ dan _policy_ untuk mengontrol akses ke repositori OCIR |
| 67 | + - Menggunakan Azure Container Registry (ACR) |
| 68 | + - Menggunakan IBM Cloud Container Registry |
| 69 | + - menggunakan IAM _role_ dan _policy_ untuk memberikan akses ke IBM Cloud Container Registry |
| 70 | + - Konfigurasi Node untuk otentikasi registri privat |
| 71 | + - semua Pod dapat membaca registri privat manapun |
| 72 | + - memerlukan konfigurasi Node oleh admin klaster |
| 73 | + - Pra-unduh _image_ |
| 74 | + - semua Pod dapat menggunakan _image_ apapun yang di-_cached_ di dalam sebuah Node |
| 75 | + - memerlukan akses root ke dalam semua Node untuk pengaturannya |
| 76 | + - Mengatur ImagePullSecrets dalam sebuah Pod |
| 77 | + - hanya Pod-Pod yang menyediakan _key_ sendiri yang dapat mengakses registri privat |
| 78 | + |
| 79 | +Masing-masing opsi dijelaskan lebih lanjut di bawah ini. |
| 80 | + |
| 81 | +### Menggunakan Google Container Registry |
| 82 | + |
| 83 | +Kubernetes memiliki dukungan _native_ untuk [Google Container |
| 84 | +Registry (GCR)](https://cloud.google.com/tools/container-registry/), ketika dijalankan pada |
| 85 | +Google Compute Engine (GCE). Jika kamu menjalankan klaster pada GCE atau Google Kubernetes Engine, |
| 86 | +cukup gunakan nama panjang _image_ (misalnya gcr.io/my_project/image:tag). |
| 87 | + |
| 88 | +Semua Pod di dalam klaster akan memiliki akses baca _image_ di registri ini. |
| 89 | + |
| 90 | +Kubelet akan melakukan otentikasi GCR menggunakan _service account_ yang dimiliki |
| 91 | +_instance_ Google. _Service acccount_ pada _instance_ akan memiliki sebuah `https://www.googleapis.com/auth/devstorage.read_only`, |
| 92 | +sehingga dapat mengunduh dari GCR di proyek yang sama, tapi tidak untuk unggah. |
| 93 | + |
| 94 | +### Menggunakan Amazon Elastic Container Registry |
| 95 | + |
| 96 | +Kubernetes memiliki dukungan _native_ untuk [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/), ketika Node adalah |
| 97 | +AWS EC2 _instance_. |
| 98 | + |
| 99 | +Cukup gunakan nama panjang _image_ (misalnya `ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag`) di dalam definisi Pod. |
| 100 | + |
| 101 | +Semua pengguna klaster yang dapat membuat Pod akan bisa menjalankan Pod yang dapat menggunakan |
| 102 | +_image-image_ di dalam registri ECR. |
| 103 | + |
| 104 | +Kubelet akan mengambil dan secara periodik memperbarui kredensial ECR, yang memerlukan _permission_ sebagai berikut: |
| 105 | + |
| 106 | +- `ecr:GetAuthorizationToken` |
| 107 | +- `ecr:BatchCheckLayerAvailability` |
| 108 | +- `ecr:GetDownloadUrlForLayer` |
| 109 | +- `ecr:GetRepositoryPolicy` |
| 110 | +- `ecr:DescribeRepositories` |
| 111 | +- `ecr:ListImages` |
| 112 | +- `ecr:BatchGetImage` |
| 113 | + |
| 114 | +Persyaratan: |
| 115 | + |
| 116 | +- Kamu harus menggunakan versi kubelet `v1.2.0` atau lebih (misal jalankan `/usr/bin/kubelet --version=true`). |
| 117 | +- Jika Node yang kamu miliki ada di region A dan registri kamu ada di region yang berbeda misalnya B, kamu perlu versi `v1.3.0` atau lebih. |
| 118 | +- ECR harus tersedia di region kamu. |
| 119 | + |
| 120 | +Cara _troubleshoot_: |
| 121 | + |
| 122 | +- Verifikasi semua persyaratan di atas. |
| 123 | +- Dapatkan kredensial $REGION (misalnya `us-west-2`) pada _workstation_ kamu. Lakukan SSH ke dalam _host_ dan jalankan Docker secara manual menggunakan kredensial tersebut. Apakah berhasil? |
| 124 | +- Tambahkan verbositas level _log_ kubelet paling tidak 3 dan periksa _log_ kubelet (misal `journalctl -u kubelet`) di baris-baris yang seperti ini: |
| 125 | + - `aws_credentials.go:109] unable to get ECR credentials from cache, checking ECR API` |
| 126 | + - `aws_credentials.go:116] Got ECR credentials from ECR API for <AWS account ID for ECR>.dkr.ecr.<AWS region>.amazonaws.com` |
| 127 | + |
| 128 | +### Menggunakan Azure Container Registry (ACR) |
| 129 | +Ketika menggunakan [Azure Container Registry](https://azure.microsoft.com/en-us/services/container-registry/) |
| 130 | +kamu dapat melakukan otentikasi menggunakan pengguna admin maupun sebuah _service principal_. |
| 131 | +Untuk keduanya, otentikasi dilakukan melalui proses otentikasi Docker standar. Instruksi-instruksi ini |
| 132 | +menggunakan perangkat [azure-cli](https://github.com/azure/azure-cli). |
| 133 | + |
| 134 | +Kamu pertama perlu membuat sebuah registri dan men-_generate_ kredensial, dokumentasi yang lengkap tentang hal ini |
| 135 | +dapat dilihat pada [dokumentasi Azure container registry](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-azure-cli). |
| 136 | + |
| 137 | +Setelah kamu membuat registri, kamu akan menggunakan kredensial berikut untuk login: |
| 138 | + |
| 139 | + * `DOCKER_USER` : _service principal_, atau pengguna admin |
| 140 | + * `DOCKER_PASSWORD`: kata sandi dari _service principal_, atau kata sandi dari pengguna admin |
| 141 | + * `DOCKER_REGISTRY_SERVER`: `${some-registry-name}.azurecr.io` |
| 142 | + * `DOCKER_EMAIL`: `${some-email-address}` |
| 143 | + |
| 144 | +Ketika kamu sudah memiliki variabel-variabel di atas, kamu dapat |
| 145 | +[mengkonfigurasi sebuah Kubernetes Secret dan menggunakannya untuk _deploy_ sebuah Pod](/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod). |
| 146 | + |
| 147 | +### Menggunakan IBM Cloud Container Registry |
| 148 | +IBM Cloud Container Registry menyediakan sebuah registri _image_ privat yang _multi-tenant_, dapat kamu gunakan untuk menyimpan dan membagikan _image-image_ secara aman. Secara _default_, _image-image_ di dalam registri privat kamu akan dipindai (_scan_) oleh Vulnerability Advisor terintegrasi untuk deteksi isu |
| 149 | +keamanan dan kerentanan (_vulnerability_) yang berpotensi. Para pengguna di dalam akun IBM Cloud kamu dapat mengakses _image_, atau kamu dapat menggunakan IAM |
| 150 | +_role_ dan _policy_ untuk memberikan akses ke _namespace_ di IBM Cloud Container Registry. |
| 151 | + |
| 152 | +Untuk instalasi _plugin_ CLI di IBM Cloud Containerr Registry dan membuat sebuah _namespace_ untuk _image-image_ kamu, lihat [Mulai dengan IBM Cloud Container Registry](https://cloud.ibm.com/docs/Registry?topic=registry-getting-started). |
| 153 | + |
| 154 | +Jika kamu menggunakan akun dan wilayah (_region_) yang sama, kamu dapat melakukan _deploy image-image_ yang disimpan di dalam IBM Cloud Container Registry |
| 155 | +ke dalam _namespace default_ dari klaster IBM Cloud Kubernetes Service yang kamu miliki tanpa konfigurasi tambahan, lihat [Membuat kontainer dari _image_](https://cloud.ibm.com/docs/containers?topic=containers-images). Untuk opsi konfigurasi lainnya, lihat [Bagaimana cara mengotorasi klaster untuk mengunduh _image_ dari sebuah registri](https://cloud.ibm.com/docs/containers?topic=containers-registry#cluster_registry_auth). |
| 156 | + |
| 157 | +### Konfigurasi Node untuk Otentikasi ke sebuah Registri Privat |
| 158 | + |
| 159 | +{{< note >}} |
| 160 | +Jika kamu jalan di Google Kubernetes Engine, akan ada `.dockercfg` pada setiap Node dengan kredensial untuk Google Container Registry. Kamu tidak bisa menggunakan cara ini. |
| 161 | +{{< /note >}} |
| 162 | + |
| 163 | +{{< note >}} |
| 164 | +Jika kamu jalan di AWS EC2 dan menggunakan EC2 Container Registry (ECR), kubelet pada setiap Node akan dapat |
| 165 | +mengatur dan memperbarui kredensial login ECR. Kamu tidak bisa menggunakan cara ini. |
| 166 | +{{< /note >}} |
| 167 | + |
| 168 | +{{< note >}} |
| 169 | +Cara ini cocok jika kamu dapat mengontrol konfigurasi Node. Cara ini tidak akan bekerja dengan baik pada GCE, |
| 170 | +dan penyedia layanan cloud lainnya yang tidak melakukan penggantian Node secara otomatis. |
| 171 | +{{< /note >}} |
| 172 | + |
| 173 | +{{< note >}} |
| 174 | +Kubernetes pada saat ini hanya mendukung bagian `auths` dan `HttpHeaders` dari konfigurasi docker. Hal ini berarti bantuan kredensial (`credHelpers` atau `credsStore`) tidak didukung. |
| 175 | +{{< /note >}} |
| 176 | + |
| 177 | + |
| 178 | +Docker menyimpan _key_ untuk registri privat pada `$HOME/.dockercfg` atau berkas `$HOME/.docker/config.json`. Jika kamu menempatkan berkas yang sama |
| 179 | +pada daftar jalur pencarian (_search path_) berikut, kubelet menggunakannya sebagai penyedia kredensial saat mengunduh _image_. |
| 180 | + |
| 181 | +* `{--root-dir:-/var/lib/kubelet}/config.json` |
| 182 | +* `{cwd of kubelet}/config.json` |
| 183 | +* `${HOME}/.docker/config.json` |
| 184 | +* `/.docker/config.json` |
| 185 | +* `{--root-dir:-/var/lib/kubelet}/.dockercfg` |
| 186 | +* `{cwd of kubelet}/.dockercfg` |
| 187 | +* `${HOME}/.dockercfg` |
| 188 | +* `/.dockercfg` |
| 189 | + |
| 190 | +{{< note >}} |
| 191 | +Kamu mungkin harus mengatur `HOME=/root` secara eksplisit pada berkas _environment_ kamu untuk kubelet. |
| 192 | +{{< /note >}} |
| 193 | + |
| 194 | +Berikut langkah-langkah yang direkomendasikan untuk mengkonfigurasi Node kamu supaya bisa menggunakan registri privat. |
| 195 | +Pada contoh ini, coba jalankan pada _desktop/laptop_ kamu: |
| 196 | + |
| 197 | + 1. Jalankan `docker login [server]` untuk setiap set kredensial yang ingin kamu gunakan. Ini akan memperbarui `$HOME/.docker/config.json`. |
| 198 | + 1. Lihat `$HOME/.docker/config.json` menggunakan _editor_ untuk memastikan sudah berisi kredensial yang ingin kamu gunakan. |
| 199 | + 1. Dapatkan daftar Node, contohnya: |
| 200 | + - jika kamu ingin mendapatkan nama: `nodes=$(kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}')` |
| 201 | + - jika kamu ingin mendapatkan IP: `nodes=$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}')` |
| 202 | + 1. Salin `.docker/config.json` yang ada di lokal kamu pada salah satu jalur pencarian di atas. |
| 203 | + - contohnya: `for n in $nodes; do scp ~/.docker/config.json root@$n:/var/lib/kubelet/config.json; done` |
| 204 | + |
| 205 | +Verifikasi dengana membuat sebuah Pod yanag menggunakan _image_ privat, contohnya: |
| 206 | + |
| 207 | +```shell |
| 208 | +kubectl apply -f - <<EOF |
| 209 | +apiVersion: v1 |
| 210 | +kind: Pod |
| 211 | +metadata: |
| 212 | + name: private-image-test-1 |
| 213 | +spec: |
| 214 | + containers: |
| 215 | + - name: uses-private-image |
| 216 | + image: $PRIVATE_IMAGE_NAME |
| 217 | + imagePullPolicy: Always |
| 218 | + command: [ "echo", "SUCCESS" ] |
| 219 | +EOF |
| 220 | +``` |
| 221 | +``` |
| 222 | +pod/private-image-test-1 created |
| 223 | +``` |
| 224 | + |
| 225 | +Jika semuanya berjalan dengan baik, maka setelah beberapa lama, kamu dapat menjalankan: |
| 226 | + |
| 227 | +```shell |
| 228 | +kubectl logs private-image-test-1 |
| 229 | +``` |
| 230 | +dan lihat pada keluaran perintah: |
| 231 | +``` |
| 232 | +SUCCESS |
| 233 | +``` |
| 234 | + |
| 235 | +Jika kamu mencurigai ada perintah yang gagal, kamu dapat menjalankan: |
| 236 | +```shell |
| 237 | +kubectl describe pods/private-image-test-1 | grep 'Failed' |
| 238 | +``` |
| 239 | +Pada kasus gagal, keluarannya mirip seperti: |
| 240 | +``` |
| 241 | + Fri, 26 Jun 2015 15:36:13 -0700 Fri, 26 Jun 2015 15:39:13 -0700 19 {kubelet node-i2hq} spec.containers{uses-private-image} failed Failed to pull image "user/privaterepo:v1": Error: image user/privaterepo:v1 not found |
| 242 | +``` |
| 243 | + |
| 244 | + |
| 245 | +Kamu harus memastikan semua Node di dalam klaster memiliki `.docker/config.json` yang sama. Jika tidak, Pod-Pod |
| 246 | +akan jalan pada beberapa Node saja dan gagal di Node lainnya. Contohnya, jika kamu menggunakan Node _autoscaling_, maka |
| 247 | +setiap templat _instance_ perlu untuk mempunyai `.docker/config.json` atau _mount_ sebuah penyimpanan yang berisi berkas tersebut. |
| 248 | + |
| 249 | +Semua Pod memiliki akses baca (_read_) untuk _image-image_ di registri privat manapun ketika |
| 250 | +_key_ registri privat ditambahkan pada `.docker/config.json`. |
| 251 | + |
| 252 | +### _Image_ Pra-unduh |
| 253 | + |
| 254 | +{{< note >}} |
| 255 | +Jika kamu jalan di Google Kubernetes Engine, maka akan ada `.dockercfg` pada setiap Node dengan kredensial untuk Google Container Registry. Kamu dapat menggunakan cara ini. |
| 256 | +{{< /note >}} |
| 257 | + |
| 258 | +{{< note >}} |
| 259 | +Cara ini cocok jika kamu dapat mengontrol konfigurasi Node. Cara ini tidak akan |
| 260 | +bisa berjalan dengan baik pada GCE, dan penyedia cloud lainnya yang tidak menggantikan |
| 261 | +Node secara otomatis. |
| 262 | +{{< /note >}} |
| 263 | + |
| 264 | +Secara _default_, kubelet akan mencoba untuk mengunduh setiap _image_ dari registri yang dispesifikasikan. |
| 265 | +Hanya saja, jika properti `imagePullPolicy` diatur menjadi `IfNotPresent` atau `Never`, maka |
| 266 | +sebuah _image_ lokal digunakan. |
| 267 | + |
| 268 | +Jika kamu ingin memanfaatkan _image_ pra-unduh sebagai pengganti untuk otentikasi registri, |
| 269 | +kamu harus memastikan semua Node di dalam klaster memiliki _image_ pra-unduh yang sama. |
| 270 | + |
| 271 | +Cara ini bisa digunakan untuk memuat _image_ tertentu untuk kecepatan atau sebagai alternatif untuk otentikasi untuk sebuah registri privat. |
| 272 | + |
| 273 | +Semua Pod akan mendapatkan akses baca ke _image_ pra-unduh manapun. |
| 274 | + |
| 275 | +### Tentukan ImagePullSecrets pada sebuah Pod |
| 276 | + |
| 277 | +{{< note >}} |
| 278 | +Cara ini merupakan cara yang direkomendasikan saat ini untuk Google Kubernetes Engine, GCE, dan penyedia cloud lainnya yang |
| 279 | +secara otomatis dapat membuat Node. |
| 280 | +{{< /note >}} |
| 281 | + |
| 282 | +Kubernetes mendukung penentuan _key_ registri pada sebuah Pod. |
| 283 | + |
| 284 | +#### Membuat sebuah Secret dengan Docker Config |
| 285 | + |
| 286 | +Jalankan perintah berikut, ganti nilai huruf besar dengan yang tepat: |
| 287 | + |
| 288 | +```shell |
| 289 | +kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL |
| 290 | +``` |
| 291 | + |
| 292 | +Jika kamu sudah memiliki berkas kredensial Docker, daripada menggunakan perintah di atas, |
| 293 | +kamu dapat mengimpor berkas kredensial sebagai Kubernetes Secret. |
| 294 | +[Membuat sebuah Secret berbasiskan pada kredensial Docker yang sudah ada](/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials) menjelaskan bagaimana mengatur ini. |
| 295 | +Cara ini berguna khususnya jika kamu menggunakan beberapa registri kontainer privat, |
| 296 | +perintah `kubectl create secret docker-registry` akan membuat sebuah Secret yang akan |
| 297 | +hanya bekerja menggunakan satu registri privat. |
| 298 | + |
| 299 | +{{< note >}} |
| 300 | +Pod-Pod hanya dapat mengacu pada imagePullSecrets di dalam _namespace_, |
| 301 | +sehingga proses ini perlu untuk diselesaikan satu kali setiap _namespace_. |
| 302 | +{{< /note >}} |
| 303 | + |
| 304 | +#### Mengacu pada imagePullSecrets di dalam sebuah Pod |
| 305 | + |
| 306 | +Sekarang, kamu dapat membuat Pod yang mengacu pada Secret dengan menambahkan bagian `imagePullSecrets` |
| 307 | +untuk sebuah definisi Pod. |
| 308 | + |
| 309 | +```shell |
| 310 | +cat <<EOF > pod.yaml |
| 311 | +apiVersion: v1 |
| 312 | +kind: Pod |
| 313 | +metadata: |
| 314 | + name: foo |
| 315 | + namespace: awesomeapps |
| 316 | +spec: |
| 317 | + containers: |
| 318 | + - name: foo |
| 319 | + image: janedoe/awesomeapp:v1 |
| 320 | + imagePullSecrets: |
| 321 | + - name: myregistrykey |
| 322 | +EOF |
| 323 | + |
| 324 | +cat <<EOF >> ./kustomization.yaml |
| 325 | +resources: |
| 326 | +- pod.yaml |
| 327 | +EOF |
| 328 | +``` |
| 329 | + |
| 330 | +Cara ini perlu untuk diselesaikan untuk setiap Pod yang mengguunakan registri privat. |
| 331 | + |
| 332 | +Hanya saja, mengatur _field_ ini dapat diotomasi dengan mengatur imagePullSecrets di dalam |
| 333 | +sumber daya [serviceAccount](/docs/user-guide/service-accounts). |
| 334 | +Periksa [Tambahan ImagePullSecrets untuk sebuah Service Account](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account) untuk instruksi yang lebih detail. |
| 335 | + |
| 336 | +Kamu dapat menggunakan cara ini bersama `.docker/config.json` pada setiap Node. Kredensial-kredensial |
| 337 | +akan dapat di-_merged_. Cara ini akan dapat bekerja pada Google Kubernetes Engine. |
| 338 | + |
| 339 | +### Kasus-Kasus Penggunaan (_Use Case_) |
| 340 | + |
| 341 | +Ada beberapa solusi untuk konfigurasi registri privat. Berikut beberapa kasus penggunaan |
| 342 | +dan solusi yang disarankan. |
| 343 | + |
| 344 | +1. Klaster yang hanya menjalankan _image non-proprietary_ (misalnya open-source). Tidak perlu unutuk menyembunyikan _image_. |
| 345 | + - Gunakan _image_ publik pada Docker hub. |
| 346 | + - Tidak ada konfigurasi yang diperlukan. |
| 347 | + - Pada GCE/Google Kubernetes Engine, sebuah _mirror_ lokal digunakan secara otomatis untuk meningkatkan kecepatan dan ketersediaan. |
| 348 | +1. Klaster yang menjalankan _image proprietary_ yang seharusnya disembunyikan dari luar perusahaan, tetapi bisa terlihat oleh pengguna klaster. |
| 349 | + - Gunakan sebuah privat [registri Docker](https://docs.docker.com/registry/) yang _hosted_. |
| 350 | + - Bisa saja di-_host_ pada [Docker Hub](https://hub.docker.com/signup), atau lainnya. |
| 351 | + - Konfigurasi `.docker/config.json` secara manual pada setiap Node seperti dijelaskan di atas. |
| 352 | + - Atau, jalankan sebuah registri privat internal di belakang _firewall_ kamu dengan akses baca terbuka. |
| 353 | + - Tidak ada konfigurasi Kubernetes yang diperlukan. |
| 354 | + - Atau, ketika pada GCE/Google Kubernetes Engine, menggunakan Google Container Registry yang ada di proyek. |
| 355 | + - Hal ini bisa bekerja baik dengan _autoscaling_ klaster dibandingkan konfigurasi Node manual. |
| 356 | + - Atau, pada sebuah klaster dimana mengubah konfigurasi Node tidak nyaman, gunakan `imagePullSecrets`. |
| 357 | +1. Klaster dengan _image proprietary_, beberapa memerlukan akses kontrol yang lebih ketat. |
| 358 | + - Pastikan [AlwaysPullImages _admission controller_](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages) aktif. Sebaliknya, semua Pod berpotensi memiliki akses ke semua _image_. |
| 359 | + - Pindahkan data sensitif pada sumber daya "Secret", daripada mengemasnya menjadi sebuah _image_. |
| 360 | +1. Sebuah klaster _multi-tenant_ dimana setiap _tenant_ memerlukan registri privatnya masing-masing. |
| 361 | + - Pastikan [AlwaysPullImages _admission controller_](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages) aktif. Sebaliknya, semua Pod dari semua tenant berpotensi memiliki akses pada semua _image_. |
| 362 | + - Jalankan sebuah registri privat dimana otorisasi diperlukan. |
| 363 | + - Men-_generate_ kredensial registri uuntuk setiap _tenant_, masukkan ke dalam _secret_ uuntuk setiap _namespace tenant_. |
| 364 | + - _Tenant_ menambahkan _secret_ pada imagePullSecrets uuntuk setiap _namespace_. |
| 365 | + |
| 366 | + |
| 367 | +Jika kamu memiliki akses pada beberapa registri, kamu dapat membuat satu _secret_ untuk setiap registri. |
| 368 | +Kubelet akan melakukan _merge_ `imagePullSecrets` manapun menjadi sebuah virtual `.docker/config.json`. |
| 369 | + |
| 370 | +{{% /capture %}} |
0 commit comments