Docker(KinD)のKubernetesでCI / CDパイプラインを高速化

新しい翻訳記事では、KinDを実際の例で扱います。


Kubernetesクラスターの構築は 時間の経過とともに簡単になっています。市場にはいくつかのターンキーソリューションがありますが、今では誰も難しい道を選ぶことはありません。 Minikubeは、開発者がコンテナを迅速に開発およびテストするために使用した主要なクラスターの1つであった







ことは注目に値し ます。 Minikubeは現在、実験的にマルチサイトクラスタリングをサポートしていますが、General Access(GA)ではまだ利用できません。



その結果、これによりコンポーネントを統合およびテストする機能が制限されます。そのため、ほとんどの組織はこれにKubernetesマネージドクラウドサービスを使用しています。

KubernetesをCI / CDパイプラインに統合して(継続的な統合と展開)、テストを実行するには、次のツールが必要です。クラウドプロバイダーに応じてTerraform、そしてもちろん、Jenkins、GitLab、GitHubなどのCI / CDツール。



十分な予算のある大企業にとって、これらは適切なオプションですが、開発者は多くの場合、迅速に開始するのに役立つ何かを探しています。 Kubernetesクラスターをクラウドにデプロイするのにも時間がかかります(約10分)。これは、アセンブリを迅速に取得する必要があるCIにとって障害となる可能性があります。

DockerまたはKinDのKubernetesは、Kubernetes のDocker-in-Docker(DinD)アプローチの実装です。このツールは、Kubernetesホストとして機能するコンテナを作成し、Dockerをマシンにインストールするだけで済みます。



他のツールやクラウドプロバイダーに依存することなく、数分でマルチノードクラスターを展開できます。これにより、ローカル開発だけでなく、CI / CDにも役立ちます。



KinDアーキテクチャ



DockerのKubernetesは、Docker-in-Docker(DinD)アプローチを使用してKubernetesクラスターを実行します。 Kubernetesホストとして機能するいくつかのDockerコンテナを実行します。 Dockerコンテナは、マシンで実行されているDockerにdocker.sockボリュームマウント して、基盤となるコンテナランタイムと通信します。







KinDはコンプライアンステストに合格し、CNCF証明書を受け取りました。 Kubeadmを使用してクラスターをブートストラップし、クラスターの管理に使用するユーザーのKube構成ファイルを生成して、kubectl使用してクラスターと対話できるようにします 。 HelmやIstioなどの他のKubernetesコンポーネントも、KinDクラスターでうまく機能します。



種類の欠点は、それが動作しませんということであるロードバランササービス は、使用する必要がありますので、 NodePortを外部にあなたのサービスを転送します。



また、DinDは現在最も安全なソリューションではないため、KinDクラスターはローカル開発マシンとCI / CDパイプラインでのみ使用してください。KinDを実稼働環境で使用しないでください。



KinDのインストール



KinDは、ダウンロードしてパスに配置できるシンプルなコマンドラインユーティリティで構成されています。次に、kindコマンドを使用して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
      
      





次に、次のコマンドを使用してクラスターを作成できます。



kind create cluster --wait 10m
      
      







このコマンドは、単一ノードクラスターを作成します。ただし、マルチノードクラスターを定義する場合は、次のようなクラスター構成ファイルを使用できます。



# three node (two workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
      
      





次に、次のコマンドを使用して、構成ファイルを使用してクラスターを作成します。



kind create cluster --wait 10m --config kind-config.yaml
      
      





ノードセクションで複数の役割を指定することにより、複数の管理レベルを持つクラスターを作成することもできます。



KinDはKube構成ファイルを自動的に生成するため、他のクラスターと同じようにkubectlコマンドを使用できます



KinDクラスターの削除も簡単です。次のコマンドを実行します。



kind delete cluster
      
      





入門



さらに面倒なことはせずに、CI / CDパイプラインがKinDをどのように使用するかを実際に理解しましょう。GitHub ActionsをCI / CDツールとして採用します。これは、使いやすく、追加のインフラストラクチャを必要とせず、ラップトップとインターネット接続があれば誰でも実行できるためです。 HelloWorld」というラベルの付い



た簡単なNGINXアプリケーションを作成しましょう



次のアクションを実行します。



  1. アプリケーションの開発バージョンを作成します。
  2. KinDクラスター内のコンポーネントのテストを開始します。
  3. テストが成功した場合、イメージをリリースに変換し、DockerHubにプッシュします。


必要な条件



  • GitHubアカウント
  • DockerHubアカウント


クイックスタートガイド



  1. このリポジトリにフォークこのリポジトリを。
  2. リポジトリに移動し、DOCKER_USERDOCKER_PWの2つのシークレットを作成しますDockerHubのユーザー名とアカウントのパスワードがそれぞれ含まれている必要があります。
  3. GitHubアクションに移動し、タスクを再実行します。または、README.mdファイル変更して実行し、アクションをトリガーすることもできます


ロングバージョン



GitHub Actionsのbuild-pipeline.ymlファイル見て、それがどのように機能するかを理解しましょう



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
      
      





アセンブリパイプラインは、次の3つのタスクを順番に実行します。



  1. build-docker-imageタスクは、開発用のDockerイメージをビルドし、ビルドが成功すると、それをDockerハブにプッシュします。このタスクでは、ユニットテストを実行できます。
  2. kubernetes-component-testタスク、KinDクラスターをセットアップし、アプリケーションのコンポーネントテストを実行します。
  3. Promote-and-push-docker-imageタスクは、開発イメージをプルし、リリースするようにマークを付け、リリースをDockerHubにプッシュします。


Dockerfileを見て、何が作成されるかを理解しましょう。



FROM nginx
RUN echo 'Hello World' > /usr/share/nginx/html/index.html
      
      





2番目のステップは重要です。build-test.shスクリプトを実行します それでは、スクリプトを見てみましょう。



#! /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
      
      





スクリプトの機能:



  1. 種類kubectlhelmユーティリティをCIサーバーにダウンロードしてインストールします。
  2. kind-config.yamlファイルを使用してマルチノードクラスターを作成します
  3. Docker docker build.
  4. Docker KinD. KinD, Docker Hub.
  5. deployment NodePort NodePortservice.
  6. IP- , , «Hello World».
  7. , KinD, «Component test successful» ( ) . , KinD .




パイプラインの操作を開始すると、GitHub Actions







パイプライン全体を自動的に起動します。 これは間違いなく改善であり、DockerとKubernetesを使用して継続的な統合と展開を実行するための便利な方法です。DockerのKubernetesは、ローカル開発を簡素化するだけでなく、CI / CDの優れたツールでもあります。



記事を読んでくれてありがとう!楽しんでいただけたでしょうか!



All Articles