Hari ini kita akan fokus pada aspek GitOps dari ACM dan memecahnya menggunakan konfigurasi model berikut:
Jadi, kami memiliki tiga klaster OpenShift di sini. ACM menggunakan model "hub-managed" untuk mengelola cluster, di mana hub adalah cluster yang menjalankan ACM dan dikelola adalah cluster yang dikelola ACM. Hub menggunakan perangkat lunak Red Hat berikut:
| OLEH | Versi: kapan |
|---|---|
| Platform Kontainer OpenShift Red Hat | 4.5.7 |
| Manajemen Cluster Lanjutan Red Hat | 2.0 Fix Pack 2.0.2 |
Harap diperhatikan bahwa cluster terkelola memiliki label yang berbeda, kami akan menggunakannya secara aktif saat menempatkan aplikasi di lingkungan yang berbeda.
Seperti yang ditunjukkan pada gambar, kami memiliki cluster pengembangan terkelola yang disebut managed-cluster1-dev yang diterapkan di cloud AWS di wilayah UE. Dan ada juga cluster produksi terkelola yang disebut managed-cluster2-prod, yang juga diterapkan ke AWS, di wilayah AS.
Siklus hidup aplikasi
ACM menawarkan kemampuan ekstensif untuk manajemen siklus hidup aplikasi. Di sini kita akan melihat mereka yang termasuk dalam kategori GitOps dan akan berguna dalam skenario berikut:
- Terapkan aplikasi Anda ke banyak lingkungan.
- Terapkan Biru / Hijau.
- Migrasi aplikasi.
- Pemulihan bencana
Pertama, mari kita tentukan istilah dan konsep yang akan kita operasikan dalam artikel ini.
Saluran
Saluran menunjuk ke lokasi fisik di mana sumber daya yang akan digunakan disimpan. Disini kita akan menggunakan pipa tipe Git, walaupun ada tipe pipa yang lain (Helm, Namespaces, dll.).
Pelajari lebih lanjut Aturan
Penempatan
Dengan membuat dan mengelola aturan penempatan, Anda menentukan tempat untuk menerapkan langganan sumber daya Kubernetes dan rilis Helm. Dengan menerapkan aturan ini, Anda dapat sangat menyederhanakan penerapan sumber daya Kubernetes di berbagai lingkungan.
Pelajari lebih lanjut
Langganan
Langganan adalah sekumpulan definisi untuk memilih sumber daya Kubernetes di saluran menggunakan anotasi, label, dan versi. Sumber daya langganan disiapkan di hub dan didorong ke cluster terkelola. Pengontrol langganan memantau lokasi sumber (saluran) untuk sumber daya baru atau yang diperbarui. Jika ini terjadi, dia dapat mendownload resource yang sesuai langsung dari lokasi sumber (saluran) ke cluster terkelola tanpa terlebih dahulu memeriksa cluster Hub (karena langganan telah dikirim).
Langganan dapat memfilter rilis Helm untuk memilih versi diagram yang benar. Dalam kasus ini, pengontrol langganan melihat parameter versi untuk memahami versi rilis Helm (bagan) mana yang harus diambil untuk penerapan.
Lebih Banyak
Aplikasi
Objek Application dapat dianggap sebagai cara untuk menggabungkan langganan ke dalam grup. Untuk ini, ada alat dan konsol yang sesuai untuk melakukan agregasi dan melihat semua komponen Aplikasi.
Keterangan lebih lanjut
Repositori Git
Aplikasi kami akan diterapkan sesuai dengan template GitOps, dan untuk lingkungan yang berbeda Anda akan memerlukan manifes berbeda yang akan disimpan dalam repositori Git, yang strukturnya ditunjukkan pada tabel di bawah ini:
| Cabang | Deskripsi |
|---|---|
| Config | Menyimpan file dasar untuk aplikasi yang digunakan di semua lingkungan |
| Melecut | Menyimpan file overlay untuk aplikasi yang digunakan dalam lingkungan produksi |
| Tahap | Menyimpan file overlay untuk aplikasi yang digunakan dalam lingkungan pengujian |
Catatan. Red Hat ACM membatasi cara Anda menyusun repositori Git Anda. Ini dapat diatur tidak hanya seperti yang ditunjukkan pada tabel ini, tetapi juga dengan cara lain yang nyaman bagi Anda.
Menerapkan aplikasi ke banyak lingkungan
Sekarang mari kita lihat bagaimana ACM dapat membantu Anda menerapkan aplikasi Anda di berbagai lingkungan menggunakan layanan web sederhana yang membalikkan kata-kata. Layanan ini memiliki dua rilis: tahap (ini adalah versi yang sedang diuji oleh pengembang) dan produksi (ini adalah versi yang digunakan pelanggan).
ACM mendukung Kustomize , yang membuatnya sangat mudah untuk menyesuaikan aplikasi untuk lingkungan penerapan target.
Seperti yang telah disebutkan, di kedua lingkungan kami menggunakan aplikasi yang sama, tetapi hanya dalam rilis yang berbeda.
Untuk menerapkan aplikasi, kita akan menggunakan alat oc dan satu set yaml-manifests dengan konfigurasi yang diperlukan untuk ACM, yang mengatur Channel, Subscription, dan PlacementRule. Semua yang kami lakukan dari baris perintah dapat dilakukan dari konsol web.
Di alat oc, kita akan memiliki tiga konteks yang dikonfigurasi, satu untuk setiap lingkungan:
| Konteks | Deskripsi |
|---|---|
| Pusat | Profil CLI untuk cluster HUB (tempat ACM diterapkan) |
| Dev | Profil CLI untuk cluster pengembangan terkelola (cluster-terkelola1-dev) |
| Pro | Profil CLI untuk cluster produksi terkelola (managed-cluster2-prod) |
Anda dapat membaca lebih lanjut tentang profil CLI di sini .
Sekarang mari kita lihat sumber daya yang akan digunakan dalam contoh kita:
Saluran
apiVersion: apps.open-cluster-management.io/v1
kind: Channel
metadata:
name: acm-app-lifecycle-blog
namespace: open-cluster-management
spec:
type: Git
pathname: https://github.com/RHsyseng/acm-app-lifecycle-blog.git
Kami menyetel Saluran menjadi Saluran Git yang akan digunakan langganan kami untuk mendapatkan sumber daya Kubernetes yang menerapkan aplikasi kami.
Dalam kasus kami, saluran dikonfigurasi untuk menerima sumber daya Kubernetes dari github.com/RHsyseng/acm-app-lifecycle-blog.git repositori Git.
Namespace
apiVersion: v1
kind: Namespace
metadata:
name: reverse-words-stage
Saat kami menggunakan Langganan, namespace yang berisi langganan ini diteruskan ke cluster penyebaran target. Oleh karena itu, di sini kami membuat namespace yang disebut tahap kata-terbalik yang akan diteruskan ke cluster dev kami melalui Langganan ini.
Aturan Penempatan
apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
name: development-clusters
namespace: reverse-words-stage
spec:
clusterConditions:
- type: "ManagedClusterConditionAvailable"
status: "True"
clusterSelector:
matchExpressions: []
matchLabels:
environment: "dev"
Daftar cluster tempat langganan diteruskan diambil dari apa yang dikembalikan PlacementRule. Dengan kata lain, kita perlu memilih cluster tertentu dari lingkungan kita dan mentransfernya ke berbagai langganan, inilah tugas yang diselesaikan PlacementRules. Dalam
contoh kita, PlacementRule bernama development-cluster mengembalikan semua cluster yang ditandai sebagai Tersedia, dan dengan label yang memenuhi kondisi lingkungan. : dev. Artinya, dalam kasus kami, outputnya adalah dev-cluster terkelola bernama managed-cluster1-dev.
Berlangganan
apiVersion: apps.open-cluster-management.io/v1
kind: Subscription
metadata:
name: reversewords-dev-app-subscription
namespace: reverse-words-stage
labels:
app: reversewords-dev-app
annotations:
apps.open-cluster-management.io/git-path: apps/reversewords/
apps.open-cluster-management.io/git-branch: stage
spec:
channel: open-cluster-management/acm-app-lifecycle-blog
placement:
placementRef:
kind: PlacementRule
name: development-clusters
Pada contoh di atas, Subscription bertanggung jawab untuk menerapkan daftar resource Kubernetes (diambil dari Channel) ke cluster dari daftar tersebut (diambil dari PlacementRule). Namun selain itu, Anda juga dapat menentukan di mana tepatnya resource Kubernetes ini berada di repositori Git (channel).
Langganan kami menggunakan Saluran yang kami tentukan di atas dan mengambil sumber daya Kubernetes dari cabang panggung, di mana ia mencarinya di folder apps / reversewords /.
Aplikasi
apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
name: reversewords-dev-app
namespace: reverse-words-stage
spec:
componentKinds:
- group: apps.open-cluster-management.io
kind: Subscription
descriptor: {}
selector:
matchExpressions:
- key: app
operator: In
values:
- reversewords-dev-app
Aplikasi membantu membuat topologi aplikasi kita pada cluster yang dikelola oleh ACM. Untuk melakukan ini, Aplikasi memilih satu atau lebih langganan, yang pada akhirnya membuat sumber daya di berbagai kluster, sehingga kami dapat melacak siapa yang membuat apa dan di mana itu dibuat.
Catatan. Di sini, kami hanya membahas sumber daya yang akan digunakan saat menerapkan aplikasi di lingkungan pengembang. Sumber daya untuk lingkungan lain dapat ditemukan di repositori GitHub dan cukup jelas dan mirip dengan yang telah kami bahas.
Terapkan aplikasi di lingkungan pengembangan
1. Langkah pertama adalah membuat definisi Channel.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/base/00_channel.yaml
2. Selanjutnya, kami membuat Namespace untuk menyimpan manifes aplikasi kami.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/00_namespace.yaml
3. Sekarang kita membuat PlacementRule yang akan memilih dev-cluster yang dikelola.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/01_placement_rule.yaml
Lihat status PlacementRule. Perhatikan bahwa aturan ini memilih cluster-dev cluster1-dev yang dikelola:
oc --context hub -n reverse-words-stage get placementrule development-clusters -o yaml
<OMITTED_OUTPUT>
status:
decisions:
- clusterName: managed-cluster1-dev
clusterNamespace: managed-cluster1-dev
4. Sekarang Anda dapat membuat Langganan dan Aplikasi untuk menargetkan cluster dev menggunakan PlacementRule.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/02_subscription-dev.yaml
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/03_application-dev.yaml
Lihat status Langganan. Perhatikan kata disebarkan, artinya langganan telah dikirim ke cluster target:
oc --context hub -n reverse-words-stage get subscription reversewords-dev-app-subscription -o yaml
<OMITTED_OUTPUT>
status:
message: Active
phase: Propagated
5. Terakhir, kami melihat cluster dev dan melihat bahwa aplikasi telah diterapkan dan berfungsi.
oc --context dev -n reverse-words-stage get deployments,services,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/reverse-words 1/1 1 1 73s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/reverse-words LoadBalancer 172.30.217.208 a84668cb23acf4d109a78b119dfddbef-750551.eu-central-1.elb.amazonaws.com 8080:30053/TCP 73s
NAME READY STATUS RESTARTS AGE
pod/reverse-words-68b9b894dd-jfgpf 1/1 Running 0 73s
Jika kami mencoba menjalankan permintaan ke cluster produksi, kami akan melihat bahwa aplikasi tidak berjalan di sana.
oc --context pro -n reverse-words-stage get deployments,services,pods
No resources found in reverse-words-stage namespace.
6. Sekarang mari jalankan permintaan ke aplikasi kita dan pastikan bahwa kita telah menerapkan rilis yang diperlukan, yaitu staging:
curl http://$(oc --context dev -n reverse-words-stage get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
Reverse Words Release: Stage Release v0.0.3. App version: v0.0.3
Menerapkan aplikasi dalam lingkungan produksi
1. Tidak perlu membuat Channel baru, karena kita akan menggunakan repo Git yang sama sebagai source, tetapi hanya cabang yang berbeda.
2. Buat Namespace untuk menyimpan manifes aplikasi kita.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/00_namespace.yaml
3. Sekarang kita membuat PlacementRule yang memilih cluster produksi:
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/01_placement_rule.yaml
Lihat status PlacementRule. Perhatikan bahwa aturan ini memilih cluster produksi managed-cluster2-prod.
oc --context hub -n reverse-words-prod get placementrule production-clusters -o yaml
<OMITTED_OUTPUT>
status:
decisions:
- clusterName: managed-cluster2-prod
clusterNamespace: managed-cluster2-prod
4. Sekarang Anda dapat membuat Langganan dan Aplikasi untuk menetapkan cluster produksi sebagai target menggunakan PlacementRule.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/02_subscription-pro.yaml
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/03_application-pro.yaml
Lihat status Langganan. Perhatikan kata disebarkan, artinya langganan telah dikirim ke cluster target:
oc --context hub -n reverse-words-prod get subscription reversewords-pro-app-subscription -o yaml
<OMITTED_OUTPUT>
status:
message: Active
phase: Propagated
5. Dan terakhir, kami melihat cluster produksi dan melihat bahwa aplikasi telah diterapkan dan berfungsi.
oc --context pro -n reverse-words-prod get deployments,services,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/reverse-words 1/1 1 1 93s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/reverse-words LoadBalancer 172.30.100.0 a6067d9a2cd904003a1b53b65f9e1cb3-450574743.us-west-2.elb.amazonaws.com 8080:30293/TCP 96s
NAME READY STATUS RESTARTS AGE
pod/reverse-words-7dd94446c-vkzr8 1/1 Running 0 94s
6. Sekarang mari kita jalankan permintaan ke aplikasi kita dan pastikan bahwa kita telah menerapkan rilis yang diperlukan, yaitu produksi:
curl http://$(oc --context pro -n reverse-words-prod get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
Reverse Words Release: Production release v0.0.2. App version: v0.0.2
7. Sekarang kami memiliki versi berbeda dari aplikasi kami untuk lingkungan penerapan yang berbeda:
# Query development environment
curl http://$(oc --context dev -n reverse-words-stage get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
# Query production environment
curl http://$(oc --context pro -n reverse-words-prod get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
# Dev Query
Reverse Words Release: Stage Release v0.0.3. App version: v0.0.3
# Pro Query
Reverse Words Release: Production release v0.0.2. App version: v0.0.2
Dan terakhir, mari kita lihat tampilannya di konsol web:
Tampilan Umum Aplikasi ACM

Tampilan Aplikasi Pengembangan ACM

Bersambung
Di posting berikutnya, kami akan menunjukkan kepada Anda bagaimana menggunakan ACM untuk penyebaran Biru / Hijau, migrasi aplikasi, dan pemulihan bencana.