Dalam artikel terjemahan baru kami, kami memahami KinD dengan contoh praktis.
Membangun cluster Kubernetes semakin mudah dari waktu ke waktu. Ada beberapa solusi siap pakai yang tersedia di pasar, dan sekarang tidak ada yang memilih jalan yang sulit!
Perlu dicatat bahwa Minikube adalah salah satu cluster utama yang digunakan developer untuk mengembangkan dan menguji container dengan cepat. Meskipun Minikube saat ini mendukung pengelompokan multisite secara eksperimental, Minikube belum tersedia di Ketersediaan Umum (GA).
Akibatnya, ini membatasi kemampuan untuk mengintegrasikan dan menguji komponen, itulah sebabnya sebagian besar organisasi menggunakan layanan cloud yang dikelola Kubernetes untuk ini.
Untuk mengintegrasikan Kubernetes ke pipeline CI / CD (integrasi dan penerapan berkelanjutan) dan melakukan pengujian, Anda memerlukan fitur berikut: Terraform, bergantung pada penyedia cloud, dan tentu saja, fitur CI / CD seperti Jenkins, GitLab, atau GitHub.
Untuk perusahaan besar dengan anggaran yang cukup, ini adalah opsi yang bagus, tetapi pengembang sering kali mencari sesuatu untuk membantu mereka memulai dengan cepat. Menerapkan cluster Kubernetes di cloud juga membutuhkan waktu (~ 10 menit), yang dapat menjadi kendala bagi CI di mana rakitan perlu diaktifkan dengan cepat.
Kubernetes di Docker atau KinD merupakan implementasi dari pendekatan Docker-in-Docker (DinD) untuk Kubernetes. Alat ini membuat container yang berfungsi sebagai host Kubernetes dan Anda hanya perlu menginstal Docker di komputer Anda.
Ini memungkinkan Anda untuk menerapkan cluster multi-node dalam beberapa menit tanpa bergantung pada alat atau penyedia cloud lain. Ini membuatnya berguna tidak hanya untuk pengembangan lokal, tetapi juga untuk CI / CD.
Arsitektur KinD
Kubernetes di Docker menggunakan pendekatan Docker-in-Docker (DinD) untuk menjalankan cluster Kubernetes. Ini menjalankan beberapa kontainer Docker yang berfungsi sebagai host Kubernetes. Container Docker memasang volume docker.sock di Docker yang dijalankan di komputer Anda untuk berkomunikasi dengan runtime container yang mendasarinya.
KinD telah diuji kepatuhannya dan memperoleh sertifikasi CNCF. Ia menggunakan Kubeadm untuk mem-bootstrap cluster, dan juga menghasilkan file konfigurasi Kube untuk pengguna yang Anda gunakan untuk mengelola cluster Anda, memungkinkan Anda menggunakan kubectl untuk berinteraksi dengan cluster. Komponen Kubernetes lainnya seperti Helm dan Istio juga berfungsi dengan baik pada cluster KinD.
Kelemahan KinD adalah tidak berfungsi dengan layanan LoadBalancer , jadi Anda harus menggunakan NodePort untuk meneruskan layanan Anda secara eksternal.
Selain itu, DinD saat ini bukanlah solusi yang paling aman, jadi gunakan kluster KinD hanya pada mesin pengembangan lokal dan pipeline CI / CD. Jangan pernah menggunakan KinD di lingkungan produksi!
Menginstal KinD
KinD terdiri dari utilitas baris perintah sederhana yang dapat Anda unduh dan letakkan di jalur Anda. Kemudian Anda dapat berinteraksi dengan KinD menggunakan perintah kind :
sudo curl -sL https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64 -o /usr/local/bin/kind
sudo chmod +x /usr/local/bin//kind
Kemudian Anda dapat membuat cluster Anda menggunakan perintah berikut:
kind create cluster --wait 10m
Perintah ini akan membuat cluster node tunggal. Tetapi jika Anda ingin mendefinisikan cluster multi-node, Anda dapat menggunakan file konfigurasi cluster yang mirip dengan yang di bawah ini:
# three node (two workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
Kemudian buat cluster dengan file konfigurasi menggunakan perintah berikut:
kind create cluster --wait 10m --config kind-config.yaml
Anda juga dapat membuat cluster dengan beberapa level manajemen dengan menentukan beberapa peran di bagian node.
Karena KinD secara otomatis menghasilkan file konfigurasi Kube, Anda dapat menggunakan perintah kubectl seperti pada kluster lainnya.
Menghapus cluster KinD juga mudah. Jalankan perintah berikut:
kind delete cluster
Mulai
Tanpa basa-basi lagi, mari kita cari tahu dalam praktik bagaimana pipeline CI / CD menggunakan KinD. Kami akan menggunakan GitHub Actions sebagai alat CI / CD kami karena mudah digunakan, tidak memerlukan infrastruktur tambahan, dan dapat dijalankan oleh siapa saja dengan laptop dan koneksi internet.
Mari buat aplikasi NGINX sederhana berlabel "Hello World".
Kami melakukan tindakan berikut:
- Kami membuat aplikasi versi dev.
- Kami mulai menguji komponen di cluster KinD.
- Jika pengujian berhasil, kami menerjemahkan image ke dalam rilis dan mendorongnya ke Docker Hub.
Kondisi yang diperlukan
- Akun GitHub
- Akun Docker Hub
Panduan Memulai Cepat
- Garpu repositori ini, repositori ini .
- Buka repositori dan buat dua rahasia : DOCKER_USER dan DOCKER_PW . Mereka harus berisi nama pengguna Docker Hub dan kata sandi akun Anda.
- Buka Tindakan GitHub dan jalankan kembali tugas. Alternatifnya, Anda dapat memodifikasi file README.md dan menjalankannya untuk memicu tindakan.
Versi panjang
Mari kita lihat file build-pipeline.yml di GitHub Actions untuk memahami cara kerjanya:
name: Docker Image CI
on: [push]
# Environment variables available to all jobs and steps in this workflow
env: # Or as an environment variable
docker_username: ${{ secrets.DOCKER_USER }}
docker_password: ${{ secrets.DOCKER_PW }}
jobs:
build-docker-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Build the Docker image
run: docker build -t $docker_username/nginx:dev .
- name: Login to Docker
run: echo "$docker_password" | docker login -u "$docker_username" --password-stdin
- name: Push the docker image
run: docker push $docker_username/nginx:dev
kubernetes-component-test:
runs-on: ubuntu-latest
needs: build-docker-image
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Run KIND Test
run: sudo sh build-test.sh $docker_username
promote-and-push-docker-image:
runs-on: ubuntu-latest
needs: kubernetes-component-test
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Pull the Docker image
run: docker pull $docker_username/nginx:dev
- name: Tag the Docker image
run: docker tag $docker_username/nginx:dev $docker_username/nginx:release
- name: Login to Docker
run: echo "$docker_password" | docker login -u "$docker_username" --password-stdin
- name: Push the docker image
run: docker push $docker_username/nginx:release
Pipa perakitan menjalankan tiga tugas secara berurutan:
- Tugas build-docker-image membangun image Docker untuk pengembangan dan mendorongnya ke Docker Hub pada build yang berhasil. Dalam tugas ini, Anda dapat menjalankan pengujian unit Anda.
- Tugas kubernetes-component-test menyiapkan kluster KinD dan menjalankan pengujian komponen untuk aplikasi.
- Tugas promot-and-push-docker-image menarik image pengembangan, menandainya untuk rilis, dan mendorong rilis ke Docker Hub.
Mari kita lihat Dockerfile untuk memahami apa yang dibuatnya:
FROM nginx
RUN echo 'Hello World' > /usr/share/nginx/html/index.html
Langkah kedua adalah kuncinya, ini menjalankan skrip build-test.sh . Sekarang mari kita lihat skripnya:
#! /bin/bash
docker_username=$1
set -xe
curl -sL https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64 -o /usr/local/bin/kind
chmod 755 /usr/local/bin//kind
curl -sL https://storage.googleapis.com/kubernetes-release/release/v1.17.4/bin/linux/amd64/kubectl -o
chmod 755 /usr/local/bin//kubectl
curl -LO https://get.helm.sh/helm-v3.1.2-linux-amd64.tar.gz
tar -xzf helm-v3.1.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
rm -rf helm-v3.1.2-linux-amd64.tar.gz
kind version
kubectl version --client=true
helm version
kind create cluster --wait 10m --config kind-config.yaml
kubectl get nodes
docker build -t $docker_username/nginx:dev .
kind load docker-image $docker_username/nginx:dev
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
NODE_IP=$(kubectl get node -o wide|tail -1|awk {'print $6'})
NODE_PORT=$(kubectl get svc nginx-service -o go-template='{{range.spec.ports}}{{if .nodePort}}{{.node
sleep 60
SUCCESS=$(curl $NODE_IP:$NODE_PORT)
if [[ "${SUCCESS}" != "Hello World" ]];
then
kind -q delete cluster
exit 1;
else
kind -q delete cluster
echo "Component test succesful"
fi
Apa yang dilakukan skrip:
- Mengunduh dan menginstal utilitas kind , kubectl dan helm di CI server.
- Membuat cluster multi-node menggunakan file kind-config.yaml .
- Docker docker build.
- Docker KinD. KinD, Docker Hub.
- deployment NodePort NodePortservice.
- IP- , , «Hello World».
- , KinD, «Component test successful» ( ) . , KinD .
Saat kami mulai bekerja dengan pipeline, GitHub Actions secara otomatis memulai seluruh pipeline: Tidak
diragukan lagi ini merupakan peningkatan dan cara mudah untuk melakukan integrasi dan penerapan berkelanjutan menggunakan Docker dan Kubernetes. Kubernetes di Docker tidak hanya menyederhanakan pengembangan lokal, tetapi juga merupakan alat yang hebat untuk CI / CD.
Terima kasih telah membaca artikelnya! Saya harap Anda menikmatinya!