KubernetesベースのJenkinsサービスもDockerに移行可能

KubernetesベースのJenkinsサービスもDockerに移行可能

[[383773]]

この記事はWeChatの公開アカウント「Ask Qi」から転載したもので、著者はChen Shaowenです。記事を転載する場合は公式アカウントまでご連絡ください。

1. Docker への移行は CICD に新たな課題をもたらす

CICD シナリオでは、パイプラインでイメージをビルドしてプッシュする必要があることがよくあります。

以前のドキュメント「Kubernetes上でJenkinsスレーブを動的に作成する」[1]では、/var/run/docker.sockファイルをマウントして、DockerベースのKubernetesクラスターでイメージをビルドおよびプッシュできるようにする方法について説明しました。 DockerのDockerの使い方[2]という文書では、これについてさらに詳しく説明しています。原則としては、ホスト Docker デーモンを共有することです。

バージョン 1.20 以降、Kubernetes コミュニティは Docker のサポートを放棄し、その後他のコミュニティが引き継いだため、Docker に影が落ちました。このような状況の中で、私たちは非Docker環境でCICDを実践する方法を検討し始めました。

非 Docker 環境では、/var/run/docker.sock をマウントする以前の方法は無効であり、新しい解決策を見つける必要があります。

2. クラスタ環境をテストする

2.1 Kubernetes - 1.17.9

Kubernetes のバージョンを表示するには、次のコマンドを実行します。

  1. kubectl バージョン
  2.  
  3. クライアント バージョン: version.Info{メジャー: "1" 、マイナー: "17" 、GitVersion: "v1.17.9" ​​、GitCommit: "4fb7ed12476d57b8437ada90b4f93b17ffaeed99" 、GitTreeState: "clean" 、BuildDate: "2020-07-15T16:18:16Z" 、GoVersion: "go1.13.9" 、コンパイラ: "gc" 、プラットフォーム: "linux/amd64" }
  4. サーバー バージョン: version.Info{メジャー: "1" 、マイナー: "17" 、GitVersion: "v1.17.9" ​​、GitCommit: "4fb7ed12476d57b8437ada90b4f93b17ffaeed99" 、GitTreeState: "clean" 、BuildDate: "2020-07-15T16:10:45Z" 、GoVersion: "go1.13.9" 、コンパイラ: "gc" 、プラットフォーム: "linux/amd64" }

2.2 コンテナ - 1.4.3

containerd のバージョンを表示するには、次のコマンドを実行します。

  1. コンテナバージョン 
  2.  
  3. コンテナd github.com/containerd/containerd v1.4.3 269548fa27e0089a8b8278fc4fc781d7f65a939b

3. 画像管理ツールPodman

Containerd は Docker API をサポートしていないため、docker build や docker push などの一般的なコマンドは Containerd 環境では使用できません。そのため、Docker に依存しない OCI 標準に基づいたイメージを構築およびプッシュするためのツールが必要です。

3.1 Podmanの紹介

Podman は、OCI 標準を実装するコンテナおよびイメージ管理ツールです。また、デーモンレスであり、デーモン プロセスを必要とせず、特権のないユーザーによる使用をサポートします。 Podman は Docker CLI と同様の機能を提供します。ほとんどの場合、 alias docker=podman を実行すると、問題なく Docker を Podman に置き換えることができます。

3.2 ポッドマンのインストール

  • Podmanコマンドラインツールをインストールする

インストール手順についてはPodmanのインストールガイド[3]を参照してください。ここでは CentOS 7 を例に挙げます。

  1. curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_7/devel:kubic:libcontainers:stable.repo
  2. yum -y ポッドマンをインストールします
  • Podmanのバージョンを確認する
  1. podman --バージョン 
  2.  
  3. ポッドマン バージョン 3.0.1
  • コマンドパラメータの表示

簡単に参照できるように、完全なヘルプ ドキュメントがここに掲載されています。

  1. ポッドマン--ヘルプ 
  2. ポッドイメージを管理する
  3.  
  4. 使用法:
  5. ポッドマン [フラグ]
  6. podman [コマンド]
  7.  
  8. 使用可能なコマンド:
  9. 実行中のコンテナアタッチする
  10. ビルドContainerfiles指示に従ってイメージをビルドする
  11. 専念      変更されたコンテナ基づいて新しいイメージを作成する
  12. コンテナ コンテナの管理
  13. cpコンテナローカルファイルシステムファイル/フォルダをコピーする
  14. 作成する      コンテナを作成するが起動しない
  15. diffコンテナのファイルシステム変更を検査する
  16. イベント podman イベントを表示
  17. exec実行中のコンテナ内でプロセスを実行する
  18. エクスポート コンテナのファイルシステムの内容をtar アーカイブとしてエクスポートします。
  19. 生成された構造化データ
  20. ヘルスチェック ヘルスチェックの管理
  21. ヘルプコマンドに関するヘルプ
  22. 履歴指定した画像履歴を表示する
  23. 画像 画像を管理する
  24. 画像 画像一覧表示する ローカルストレージ
  25. import tarballをインポートする ファイルシステムイメージを作成する
  26. info podman システム情報を表示する
  27. init 1以上のコンテナを初期化する
  28. コンテナまたはイメージ構成を表示する
  29. kill特定のシグナル実行中のコンテナを1つ以上強制終了します
  30. 負荷        コンテナアーカイブからイメージをロードする
  31. ログインコンテナレジストリログイン
  32. ログアウトコンテナレジストリからログアウトする
  33. コンテナログを取得する
  34. マウント 作業コンテナのルートファイルシステムをマウントする
  35. ネットワーク ネットワークの管理
  36. 1つまたは複数のコンテナ内のすべてのプロセスを一時停止します
  37. ポッドを再生する
  38. ポッド ポッドを管理する
  39. portコンテナポートマッピングまたは特定のマッピングを一覧表示します
  40. ps コンテナを一覧表示する
  41. pullレジストリからイメージをプルする
  42. プッシュ指定された宛先イメージをプッシュする
  43. 再起動 1つ以上のコンテナを再起動する
  44. rm 1つまたは複数のコンテナを削除する
  45. rmi 1つまたは複数の画像削除します ローカルストレージ
  46. 実行新しいコンテナコマンドを実行する
  47. 保存 画像をアーカイブ保存する
  48. レジストリ画像を検索
  49. 開始 1つ以上のコンテナを起動する
  50. 統計コンテナリソースの使用統計ライブストリームを表示します 
  51. 1つ以上のコンテナを停止する
  52. システム管理 podman
  53. タグ追加の名前を追加する ローカルイメージ
  54. コンテナ実行中のプロセスを表示する
  55. umount 作業コンテナのルートファイルシステムをアンマウントします
  56. 一時停止解除1以上のコンテナ内のプロセスの一時停止を解除します
  57. unshare変更されたユーザー名前空間コマンドを実行する
  58. varlink varlinkインターフェースを実行する
  59. version Podmanのバージョン情報を表示する
  60. ボリュームを管理する
  61. 1つ以上のコンテナブロックを待機する
  62.  
  63. フラグ:
  64. --cgroup-manager 文字列 使用する cgroup マネージャー (cgroupfs または systemd) (デフォルトは "systemd")  
  65. --cni-config-dir string CNIネットワークの設定ディレクトリのパス 
  66. --config string コンテナサーバーの構成オプションを詳述する libpod 構成ファイルのパス 
  67. --conmon 文字列 conmon バイナリのパス 
  68. --cpu-profile string CPUプロファイリング結果のパス 
  69. --events-backend string 使用するイベントバックエンド 
  70. --help podman のヘルプ 
  71. --hooks-dir 文字列 OCI フックのディレクトリ パスを設定します (複数回設定できます)  
  72. --log-level 文字列 指定されたレベル以上のメッセージをログに記録します: debug、info、warn、error、fatal、panic (デフォルトは "error")  
  73. --namespace string システム上のコンテナとポッドの個別のビューを作成するために使用される libpod 名前空間を設定します 
  74. --network-cmd-path 文字列 ネットワークを構成するためのコマンドへのパス 
  75. --root 文字列 画像を含むデータが保存されるルートディレクトリへのパス 
  76. --runroot 文字列 すべての状態情報が保存される「実行ディレクトリ」へのパス 
  77. --runtime string コンテナを実行するために使用される OCI 互換バイナリへのパス。デフォルトは /usr/bin/runc です。  
  78. --storage-driver string イメージとコンテナのストレージを管理するために使用するストレージ ドライバーを選択します (デフォルトはオーバーレイ)  
  79. --storage-opt stringArray ストレージドライバーにオプションを渡すために使用します 
  80. --syslog ログ情報をsyslogとコンソールに出力します 
  81. --tmpdir string tmpディレクトリへのパス 
  82. --trace OpenTracing出力を有効にする 
  83. -v, --version ポッドマンのバージョン 
  84.  
  85. 「podman [コマンド] --help」を使用します コマンドの詳細については、こちらをご覧ください

Podman は Docker コマンドをカバーし、Pod 操作のサポートを追加します。

3.3 ホスト上でコンパイルをテストし、イメージをプッシュする

docker コマンドを podman に直接置き換えることができます。

  • イメージをコンパイルする
  1. echo -e 'FROMbusybox\nRUN echo "hello world"' | podman ビルド -t docker.io/shaowenchen/myimage:latest -
  2.  
  3. ステップ1:ビジーボックスから
  4. 画像ソース署名の取得
  5. ブロブ 5c4213be9af9 のコピーが完了しました
  6. 設定 491198851f のコピーが完了しました
  7. マニフェストをイメージの保存先書き込む
  8. 署名の保存
  9. ステップ 2: echo "hello world"を実行します。  
  10. こんにちは世界
  11. ステップ3:コミット 
  12. 4c8794086d9de80f71d182457b6d2cb18b9d61975b98bcd4cb167bdcabae5b2c
  13. 4c8794086d9de80f71d182457b6d2cb18b9d61975b98bcd4cb167bdcabae5b2c
  • コンパイルされた画像を表示する
  1. ポッドマン イメージ |grep シャオウェンチェン
  2. docker.io/shaowenchen/myimage 最新 4c8794086d9d 4 分前 1.46 MB
  • DockerHubにログイン
  1. ポッドマン ログイン docker.io -u シャオウェンチェン
  2.  
  3. パスワード:
  4. ログインに成功しました!
  • プッシュ画像
  1. ポッドマンプッシュ docker.io/shaowenchen/myimage:latest
  2.  
  3. 画像ソース署名の取得
  4.  
  5. BLOB 2893437c336c のコピーが完了しました
  6. BLOB 84009204da3f のコピーが完了しました
  7. 設定 4c8794086d のコピーが完了しました
  8. マニフェストをイメージの保存先書き込む
  9. 署名の保存

4. Podmanを使用してJenknsでイメージを構築する

4.1 キー設定

  • hostPathを使用してホストに/var/lib/containersをマウントします

PVC を使用することもできますが、PVC には追加のパラメータが必要になる場合があります。以下を参照してください。

そうでない場合は、次のエラーが発生します。

  1. エラー: 'オーバーレイ'    overlayfs ではサポートされていないため、mount_program必要です。このグラフ ドライバーでは、バックアップ ファイル システムサポートされていません
  • 特権 特権モード

そうでない場合は、次のエラーが発生します。

  1. エラー: カーネルはオーバーレイ fs: 'overlay'をサポートしていません   extfsではサポートされてません  "/var/lib/containers/storage/overlay" :このグラフ ドライバーでは、バックアップ ファイル システムはサポートされてません
  • Podman パラメータ --cgroup-manager=cgroupfs

PVC をストレージ ディレクトリとして使用する場合は、この構成を考慮する必要があります。カーネルは、Cgroup ドライバーを通じてリソースのグループを分離します。オプションのパラメータは cgroupfs と systemd であり、これらは同じカーネルを共有するため、クラスタ環境と一貫性を保つ必要があります。私のテスト環境では cgroupfs を使用しています。

そうでない場合は、次のエラーが発生します。

  1. システムイベントを書き込めません: "write unixgram @0011c->/run/systemd/journal/socket: sendmsg:そのようなファイルまたはディレクトリはありません
  • Podman パラメータ --events-backend=file

この構成は通常、実行プロセスをブロックしませんが、ログをよりクリーンな状態に保ちたい場合に追加できます。

そうでない場合は、次のエラーが発生します。

  1. システムイベントを書き込めません: "write unixgram @0011c->/run/systemd/journal/socket: sendmsg:そのようなファイルまたはディレクトリはありません

4.2 例1: JenkinsfileでYAMLテンプレートを明示的に使用する

ここで、コンテナ /var/lib/containers はホストの /var/lib/containers ディレクトリにマウントされます。ホストの /tmp ディレクトリにマウントすることもできます。必須要件はありません。ホスト ディレクトリは、単にデータを保存する場所を提供します。

  1. パイプライン
  2. エージェント
  3. Kubernetes {
  4. yaml "" "
  5. APIバージョン: v1
  6. 種類: ポッド
  7. 仕様:
  8. コンテナ:
  9. -名前: centos
  10. 画像: centos:7
  11. 指示:
  12. - 猫
  13. 端末: 
  14. セキュリティコンテキスト:
  15. 特権: true  
  16. ボリュームマウント:
  17. -名前: ストレージ
  18. マウントパス: /var/lib/containers
  19. ボリューム:
  20. -名前: ストレージ
  21. ホストパス:
  22. パス: /var/lib/containers
  23. 「」 「
  24. }}
  25. ステージ {
  26. ステージ( 'こんにちは' ){
  27. 手順 {
  28. コンテナ( 'centos' ) {
  29. sh '' '
  30. curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/devel:kubic:libcontainers:stable.repo
  31. yum -y ポッドマンをインストールします
  32. echo -e 'FROMbusybox\nRUN echo "hello world"' | podman --events-backend=file ビルド -t docker.io/shaowenchen1/myimage:latest -  
  33. podman --events-backend=ファイルイメージ |grep shaowenchen1  
  34. '' '
  35. }
  36. }
  37. }
  38. }
  39. }

Jenkins 実行ログ:

  1. ···
  2. 依存関係が更新されました:
  3. systemd.x86_64 0:219-78.el7_9.3 システムd-libs.x86_64 0:219-78.el7_9.3
  4.  
  5. 完了!
  6. + podman --events-backend=ファイルビルド -t docker.io/shaowenchen1/myimage:latest -  
  7. + echo -e 'ビジーボックスから
  8. 実行エコー「hello world」 '
  9. ステップ1:ビジーボックスから
  10. ステップ 2: echo "hello world"を実行します。  
  11. --> キャッシュ 4c8794086d9de80f71d182457b6d2cb18b9d61975b98bcd4cb167bdcabae5b2c を使用 
  12. ステップ3: docker.io/shaowenchen1/myimage:latestをコミットする
  13. --> 4c8794086d9  
  14. 4c8794086d9de80f71d182457b6d2cb18b9d61975b98bcd4cb167bdcabae5b2c
  15. + podman --events-backend=ファイルイメージ 
  16. + grep shaowenchen1
  17. docker.io/shaowenchen1/myimage 最新 4c8794086d9d 19 時間前 1.46 MB

4.3 例2: PVCを使用して/var/lib/containersディレクトリをマウントする

PVC を使用して Podman データを保存する場合は、事前にクラスター ストレージを準備する必要があります。

  • クラスターにデフォルトのStorageClassがあるかどうかを確認する
  1. kubectl 取得 sc
  2.  
  3. 名前プロビジョナー RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
  4. openebs-device openebs.io/ローカル                                            WaitForFirstConsumerを削除false 19d
  5. openebs-hostpath (デフォルト) openebs.io/ local                                             WaitForFirstConsumerを削除false 19d
  6. openebs-jiva-デフォルトopenebs.io/provisioner-iscsi即時削除false 19d
  7. openebs-snapshot-promoter volumesnapshot.external-storage.k8s.io/snapshot-promoter即時削除false 19d
  • Podman 用の PVC を作成する

ここでの名前空間は、Jenkins の動的エージェントが配置されている名前空間と一致している必要があります。

  1. 猫 <<EOF | kubectl を適用 -f -
  2. APIバージョン: v1
  3. 種類: PersistentVolumeClaim
  4. メタデータ:
  5. 名前: ストレージ
  6. 名前空間:デフォルト 
  7. 仕様:
  8. アクセスモード:
  9. -一度だけ読み書き可能
  10. リソース:
  11. リクエスト:
  12. ストレージ: 30Gi
  13. 終了
  • 作成されたPVCを表示する
  1. kubectl -nデフォルトでPVCを取得する
  2.  
  3. 名前ステータス ボリューム 容量 アクセス モード
  4. ストレージ保留中 openebs-hostpath 11s

WaitForFirstConsumer モードが使用されるため、Pod が PVC を使用するまで PV はバインドされません。

  • Jenkinsパイプライン実行を作成する
  1. パイプライン
  2. エージェント
  3. Kubernetes {
  4. yaml "" "
  5. APIバージョン: v1
  6. 種類: ポッド
  7. 仕様:
  8. コンテナ:
  9. -名前: centos
  10. 画像: centos:7
  11. 指示:
  12. - 猫
  13. 端末: 
  14. セキュリティコンテキスト:
  15. 特権: true  
  16. ボリュームマウント:
  17. -名前: ストレージ
  18. マウントパス: /var/lib/containers
  19. ボリューム:
  20. -名前: ストレージ
  21. 永続ボリュームクレーム:
  22. クレーム名: ストレージ
  23. 「」 「
  24. }}
  25. ステージ {
  26. ステージ( 'こんにちは' ){
  27. 手順 {
  28. コンテナ( 'centos' ) {
  29. sh '' '
  30. curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/devel:kubic:libcontainers:stable.repo
  31. yum -y ポッドマンをインストールします
  32. echo -e 'FROMbusybox\nRUN echo "hello world"' | podman --events-backend=file ビルド -t docker.io/shaowenchen2/myimage:latest -  
  33. podman --events-backend=ファイルイメージ |grep shaowenchen2  
  34. '' '
  35. }
  36. }
  37. }
  38. }
  39. }

Jenkins 実行ログ:

  1. ···
  2. 依存関係が更新されました:
  3. systemd.x86_64 0:219-78.el7_9.3 システムd-libs.x86_64 0:219-78.el7_9.3
  4.  
  5. 完了!
  6. + echo -e 'ビジーボックスから
  7. 実行エコー「hello world」 '
  8. + podman --events-backend=ファイルビルド -t docker.io/shaowenchen2/myimage:latest -  
  9. ステップ1:ビジーボックスから
  10. ステップ 2: echo "hello world"を実行します。  
  11. --> キャッシュ f4676f5b5e47a78970f2d97f4a5b77423f381e9742faae06d8c1a2d93bdb27c2 を使用 
  12. ステップ 3: docker.io/shaowenchen2/myimage:latestをコミットします。
  13. --> f4676f5b5e4  
  14. f4676f5b5e47a78970f2d97f4a5b77423f381e9742faae06d8c1a2d93bdb27c2
  15. + podman --events-backend=ファイルイメージ 
  16. + grep shaowenchen2
  17. docker.io/shaowenchen2/myimage 最新 f4676f5b5e47 2 時間前 1.46 MB

5. 結論

この記事では主に、Docker の代わりに Podman を使用して、非 Docker 駆動の Kubernetes クラスターで CICD イメージを構築するアイデアを提供します。 Podman を選択した理由は、その使用方法が Docker に近いためです。一方、Buildah では buildah bud を使用するため、ユーザーはイメージのコンパイル手順を変更する必要があります。

実際の運用では、Podman コマンドを CI エージェントのベース イメージにパッケージ化する必要があります。 Docker コマンドに基づいてパイプラインを置き換えるには、エイリアス docker=podman を使用します。

Podman を使用する際の重要なポイントを簡単にまとめると次のようになります。

  • キャッシュをサポートします。 /var/lib/containers ディレクトリをマウントすることで、イメージをキャッシュし、業務に応じて異なるディレクトリに分割することができます。
  • Docker のシームレスな代替品。フックがあれば、ユーザーは気づかれずに切り替えができます。
  • より多用途に。これは OCI 標準に従って実装されており、特定のコンポーネントに依存しません。
  • 特権モード。コンテナ内で Podman を実行するには特権モードが必要です。入れ子人形がこの動作モードから抜け出すのは困難です。

6. 参考文献

https://github.com/kubernetes-sigs/cri-tools

http://docs.podman.io/en/latest/

参考文献

[1] 「Kubernetes上でJenkinsスレーブを動的に作成する」:https://www.chenshaowen.com/blog/creating-jenkins-slave-dynamically-on-kubernetes.html

[2] DockerでDockerを使用する方法: https://www.chenshaowen.com/blog/how-to-use-docker-in-docker.html

[3] Podmanのインストール手順: https://podman.io/getting-started/installation

<<:  RocketMQ プロデューサーにこれほど多くの用途があることをなぜ知らなかったのでしょうか?

>>:  ファーウェイのチェ・ハイピン氏:ネットワークの自律性に焦点を当て、業界の変革を加速

推薦する

パフォーマンス重視の大規模ウェブサイト向けSEOの核となる考え方と実践

結果重視SEO の最終的な目標は環境によって異なる場合があります。ほとんどの場合、トラフィックは S...

ゲーマーはTencentの広告とToutiaoの広告についてどう思っているのでしょうか?

Alibaba や Baidu とは異なり、Tencent Advertising と Toutia...

Baidu SEOの焦点とSEO業界の発展の見通しについての簡単な議論

最近、Baiduは以前よりも頻繁にストアを更新しており、基本的に毎日大きな変動があります。とても困惑...

李佳琦は1日で10億を売り上げた?その背後にある論理!

李佳琦のライブ放送を待っていましたか?もしそうなら、何かを買いたいという衝動を抑えられなかったと思い...

ウェブサイトのランキングを素早く向上させる方法 - オンサイト最適化

ウェブサイトの最適化には通常、次の側面が含まれます。ウェブサイト全体の構造を最適化(列計画とURL計...

Java仮想マシンの基本原理とプロセスを理解すれば、JVMの60%をマスターできます。

Java ユーザーとしては、JVM のアーキテクチャを習得することも必要です。 [[323342]]...

組織のマルチクラウド データ アーキテクチャ戦略を長期的な成功に向けて軌道に乗せる方法

[[395571]]多くの組織は、データセンター インフラストラクチャを近代化しながら、デジタル変革...

Web ページの構造化プロセスは、貴重な情報を保持するプロセスです。

ウェブページ構造化の目的を紹介しました。構造化のプロセスは、ウェブサイトに貴重な情報を保持するプロセ...

WeChatのパブリックアカウントは草の根ウェブマスターには適していません

社会科学の分野では、完璧さや理想を体現するが閉鎖性も併せ持つ「左派」と、平壌やニューヨークのように、...

ウェディングフォトグラフィーがユーザーのニーズをどのように捉えられるかについての実践的な分析

以前、ウェディング写真撮影がユーザー エクスペリエンスを向上させる方法についての記事「ケース分析: ...

ウェブサイトが罰せられた場合、ウェブマスターは冷静に理由を分析する必要があります。

ウェブサイトのサービスを提供し続けているうちに、ウェブサイトがペナルティを受けるケースに遭遇すること...

「銅鑼戦馬超」のフォーラムSEOモチベーション管理より

前回、私がマネジメントに関する記事(「諸葛亮が涙を流して馬蘇を処刑」から学ぶSEOマネジメント)を書...

無料の分類情報サイト運営体験

最近、会社のSEO推進担当者の外部プロモーション評価を整理し、外部リンクが削除されたかどうかをプログ...

草の根講堂の最初のゲスト、朱衛坤氏が、個人ウェブマスターの将来について語ります。

みなさんこんにちは。私は朱偉坤です。今日は Arui さんに招待されて、皆さんとシェアすることができ...

テンセントが電子商取引企業に10億ドルを投資、マーティン・ラウ氏が会長に就任

テンセントが先週、6つの主要事業グループとテンセント電子商取引ホールディングス社を設立する組織再編を...