k8s/archive_2

CICD-SERVER構築/検証

YOOANT 2026. 4. 19. 00:36
Path : 2121/build/docker

* UTM バージョン および Rocky Linux イメージはk8s環境構築と同じ。

 

k8s環境構築(MacOS)

1. Rocky Linux ISO ダウンロード (9.2 arm64 バージョン)- Download : https://dl.rockylinux.org/vault/rocky/9.2/isos/aarch64/Rocky-9.2-aarch64-minimal.iso- Site : https://rockylinux.org 2-1. UTM (4.6.5)- Downlaod : https://github.com/utmapp/UTM/rel

tokyoant.tistory.com

1.インストール

1.1 VMの初期設定 - 「Create a New Virtual Machine」を選択

- Start : Virtualize
- Operating System : Linux
- Linux : Boot ISO Image [Browse..] -> Rocky ISO 파일 선택
- Hardware : Memory : 2048 MB, CPU Cores : 2
- Size : 32 GB
- Shared Directory : 설정 안함
- Summary : Name : cicd-server

 

▶ Network

- Network > [V] Show Advanced Settings > Guest Network : 192.168.56.0/24 入力

 

1.2 作成したVMを起動後、Rocky Linuxの初期設定

-UTM画面 > cicd-serverを選択 > 実行(▶)ボタンをクリック > Rocky Linux 9.2 をインストール

1.言語:韓国語(大韓民国)
2.ユーザー設定
 - rootパスワード(R):各自のrootパスワードを入力
 - rootアカウントをロック:チェックを外す
 - rootがパスワードでSSHログインできるようにする:チェック
3.インストール先(D)
 - ストレージ構成:自動設定(A)[チェック]を確認後、[完了(D)]をクリック
4.ネットワークおよびホスト名
 - ホスト名(H):cicd-server と入力後、[適用(A)]をクリック
 - イーサネット(enp0s1):[設定(C)…]をクリック
   1)[IPv4設定]タブをクリック
   2)Method:手動
   3)アドレス:[Add]をクリック後 → アドレス(192.168.56.20)、ネットマスク(255.255.255.0)、ゲートウェイ(192.168.56.1)を入力
  -[完了(D)]をクリック
5.[インストール開始(B)]をクリック
6.インストール完了メッセージを確認後、[再起動]をクリック

 

1.3 Rocky Linuxの起動

  1. UTM画面の最下部にあるCD/DVDをクリックし、「Clear」をクリック(選択されているISOイメージが削除されます)
  2. 「Install Rocky Linux 9.2」の待機画面上部で[電源ボタン]を押してシャットダウンし、
    [▶]ボタンを押してVMを起動する
  3. UTMで提供されるコンソール画面は最小化する(コピー&ペーストがうまくできないため)

1.4 CI/CDサーバに接続 (Mac terminal)

$ ssh root@192.168.56.20

The authenticity of host '192.168.56.20 (192.168.56.20)' can't be established.
ED25519 key fingerprint is SHA256:+grKMOsgQHDF0lTTZTD65khFhnk5Q56wvNSFV4+NsnA.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
[root@192.168.56.20's password: (パスワード)

 

1.5 CI/CD Server インストール (arm64)

echo '======== [1] Rocky Linux 基本設定 ========'
echo '======== [1-1] パッケージ更新 ========'
# 講義と同一の実習環境を維持するため、Linuxのアップデートは行わないでください!
# yum -y update # (x)

echo '======== [1-2] タイムゾーン設定 ========'
timedatectl set-timezone Asia/Seoul

echo '======== [1-3] ファイアウォール無効化 ========'
systemctl stop firewalld && systemctl disable firewalld


echo '======== [2] Kubectl インストール ========'
echo '======== [2-1] リポジトリ設定 ========'
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

echo '======== [2-2] Kubectl インストール ========'
yum install -y kubectl-1.27.2-150500.1.1.aarch64 --disableexcludes=kubernetes


echo '======== [3] Docker インストール ========'
# https://download.docker.com/linux/centos/8/x86_64/stable/Packages/ リポジトリパス
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce-3:23.0.6-1.el9.aarch64 docker-ce-cli-1:23.0.6-1.el9.aarch64 containerd.io-1.6.21-3.1.el9.aarch64
systemctl daemon-reload
systemctl enable --now docker

echo '======== [4] OpenJDK インストール ========'
yum install -y java-17-openjdk

echo '======== [5] Gradle インストール ========'
yum -y install wget unzip
wget https://services.gradle.org/distributions/gradle-7.6.1-bin.zip -P ~/
unzip -d /opt/gradle ~/gradle-*.zip
cat <<EOF | tee /etc/profile.d/gradle.sh
export GRADLE_HOME=/opt/gradle/gradle-7.6.1
export PATH=/opt/gradle/gradle-7.6.1/bin:${PATH}
EOF
chmod +x /etc/profile.d/gradle.sh
source /etc/profile.d/gradle.sh

echo '======== [6] Git インストール ========'
# 従来は git-2.43.0-1.el8 バージョンを固定していましたが、リポジトリに最新バージョンのみが登録されているため修正
yum install -y git

echo '======== [7] Jenkins インストール ========'
wget https://archives.jenkins.io/redhat-stable/jenkins-2.479.3-1.1.noarch.rpm
rpm -ivh jenkins-2.479.3-1.1.noarch.rpm
systemctl enable jenkins
systemctl start jenkins

# Jenkins インストール後、OpenSSL を最新バージョンへアップデート
yum update -y openssh-server openssh-clients openssl openssl-libs
systemctl restart sshd

2.Jenkins初期設定

-2.1 CI/CD サーバで初期パスワードを確認

# cat /var/lib/jenkins/secrets/initialAdminPassword

 

- 2.2 Jenkins DashBoardに接続し、パスワード入力

# http://192.168.56.20:8080/login

- 2.3 pluginインストール

※エラー発生

  • 事象: プラグインのインストール失敗(依存関係およびバージョン不整合)
  • 原因: Jenkins本体のバージョンに対し、プラグインの要求バージョンが新しすぎたため
  • 対応: Jenkins本体を最新プラグインと互換性のあるLTSバージョン(2.492.1等)へアップグレード
  • 結果: インストールおよび依存関係の問題が正常に解決

 

- 2.4 Adminユーザー作成

 

 

- 3.4 [Save and Finish] -> [Start using Jenkins]

 


3.グローバル設

Jenkinsのビルドで使用するOpenJDKおよびGradleの設定。

- 3.1 [Dashboard] > [Jenkins 管理] クリック

- 3.2 JDK設定

// JDK17 パス確認
# find / -name java | grep java-17-openjdk

※ 必ず /bin/java の部分は除外してコピーすること。

 JAVA_HOMEに入力

# Name : jdk-17
# JAVA_HOME :上記の結果

- 3.3 Gradle 設定

# Name : gradle-7.6.1
# GRADLE_HOME : /opt/gradle/gradle-7.6.1

- 3.4 [Save]


4.Docker使用設定

# JenkinsにDocker使用権限を付与
[root@cicd-server ~]# chmod 666 /var/run/docker.sock
[root@cicd-server ~]# usermod -aG docker jenkins

# Jenkinsユーザーに切り替え
[root@cicd-server ~]# su - jenkins -s /bin/bash

# 自身のDocker Hubへログイン
[jenkins@cicd-server ~]$ docker login
Username: 
Password:

JenkinsのDocker操作権限付与

1. このコマンドを実行すべき理由

Linuxシステムにおいて、/var/run/docker.sock ファイルはデフォルトで root ユーザーまたは docker グループに属するユーザーのみがアクセスできる。Jenkinsは通常 jenkins という専用の一般ユーザーアカウントで実行されるため、権한設定を行わないとDockerエンジンにコマンドを送信できず、「Permission Denied」 エラーが発生する。


2. コマンドごとの動作原理

chmod 666 /var/run/docker.sock

  • 原理: Dockerデーモンと通信するためのUnixドメインソケットファイルの権限を、**「誰でも読み書き可能(666)」**に開放する。
  • 結果: Jenkinsユーザーだけでなく、システム内の全ユーザーがDockerを操作できるようになる。
  • リスク: セキュリティ上、非常に脆弱である。外部の攻撃者にアカウントを一つでも乗っ取られた場合、サーバー全体のルート権限を奪取されるのと同等である。

usermod -aG docker jenkins

  • 原理: jenkins ユーザーを docker という名前のユーザーグループに追加(-aG)する。
  • 結果: /var/run/docker.sock ファイルはデフォルトで docker グループに所有権があるため、Jenkinsがグループの一員として正当な権限を付与される。
  • 推奨事項: 実무においては、666で全開放するよりも、この方法を使用する方が遥かに安全である。

3. 動作プロセス(Workflow)

  1. コマンド送信: Jenkinsパイプラインから docker build コマンドを実行する。
  2. ソケットへのアクセス: Dockerクライアントが /var/run/docker.sock を通じてDockerデーモン(サーバー)にコマンドを転送しようとする。
  3. 権限確認: カーネルが、当該ユーザーにソケットファイルを読み書きする権限があるかを確認する。(この際、上記のコマンドが効果を発揮する。)
  4. 実行: 権限が確認されると、Dockerデーモンがリクエストを受け入れ、コンテナの生成・ビルドを行う。

5.マスターノードから証明書をコピー

4-1.CI/CDサーバーでSCPコマンドを使用し、証明書を取得する

  • 該当作業を行う前に、マスターノードが正常に稼働しているか確認すること。
  • rootユーザーではなく、Jenkinsユーザーの状態で作業を行うこと。
# ディレクトリ作成
[jenkins@cicd-server ~]$ mkdir ~/.kube

# マスターノードから認証情報を取得
[jenkins@cicd-server ~]$ scp root@192.168.56.30:/root/.kube/config ~/.kube/

 

▶ 証明書の取得実行後、[fingerprint] には「yes」と入力し、[password] には自身のパスワードを入力すること。

 

▶ 動作確認


5.ビルド・デプロイパイプラインのためのスクリプト作成および実行

- 5.1 Build- gradle

5.1.1 project生成

item name : 2121-source-build

5.1.2 Dashboard > 2121-source-build > Configuration > General > GitHub project 選択

Project url : https://github.com/k8s-1pro/kubernetes-anotherclass-api-tester/

5.1.3 ソースコード管理

Repository URL : https://github.com/k8s-1pro/kubernetes-anotherclass-api-tester.git
Branch Specifier : */main

5.1.4 Build Steps > Invoke Gradle script

Gradle Version : gradle-7.6.1
Tasks : clean build

5.1.5 [保存]

 

5.1.6 Dashboard > 2121-source-build > Buildおよびログ確認

 

9.1.7 Jarファイル確認

[jenkins@cicd-server ~]$ ll /var/lib/jenkins/workspace/2121-source-build/build/libs


- 5.2 コンテナbuild - docker

5.2.1 project生成

item name : 2121-container-build

5.2.2 Dashboard > 2121-container-build > Configuration > General > GitHub project 選択

Project url : https://github.com/<Github-Uesrname>/kubernetes-anotherclass-sprint2/

5.2.3 ソースコード管理

Repository URL : https://github.com/<Github-Uesrname>/kubernetes-anotherclass-sprint2.git
Branch Specifier : */main

5.2.3 ソースコード管理> Additional Behavioures > Sparse Checkout paths

Path : 2121/build/docker

5.2.4 Build Steps > Execute shell

# jar ファイルコピー
cp /var/lib/jenkins/workspace/2121-source-build/build/libs/app-0.0.1-SNAPSHOT.jar ./2121/build/docker/app-0.0.1-SNAPSHOT.jar

# docker build
docker build -t <DockerHub_Username>/api-tester:v1.0.0 ./2121/build/docker
docker push <DockerHub_Username>/api-tester:v1.0.0

5.2.5 [保存]

5.2.6 Dashboard > 2121-container-build > Buildおよびログ確認

* Dockerfile 内容確認

cat /var/lib/jenkins/workspace/2121-container-build/2121/build/docker/Dockerfile

 

- 5.3 配布 - kubectl

 

5.3.1 Project生成(既存Projectコピー)

item name : 2121-deploy
Copy from : 2121-container-build
 

5.3.2 ソースコード管理 > Additional Behavioures > Sparse Checkout paths

Path : 2121/deploy/k8s

5.3.3 Build Steps > Execute shell

kubectl apply -f ./2121/deploy/k8s/namespace.yaml
kubectl apply -f ./2121/deploy/k8s/pv.yaml
kubectl apply -f ./2121/deploy/k8s/pvc.yaml
kubectl apply -f ./2121/deploy/k8s/configmap.yaml
kubectl apply -f ./2121/deploy/k8s/secret.yaml
kubectl apply -f ./2121/deploy/k8s/service.yaml
kubectl apply -f ./2121/deploy/k8s/hpa.yaml
kubectl apply -f ./2121/deploy/k8s/deployment.yaml

 

5.3.4 [保存]

5.3.5 Dashboard > 2121-deploy > Buildおよびログ確認


5.4 Dashboard確認

現象 デプロイ自体は正常に完了したが、コンテナが起動しない問題が発生。

 

原因 Podのイベントログを確認した結果、マウントパス用のボリュームが存在しないため。

 

対応

マウントパス用のディレクトリを作成後、デプロイを再起動。

'k8s > archive_2' 카테고리의 다른 글

Jenkins Pipeline(Blue Green)構築  (0) 2026.04.21
デプロイの前に必ず確認すべきこと  (0) 2026.04.20
Probe,Service,Secret,HPA  (0) 2026.04.18
PV/PVC、Deployment、Service  (0) 2026.04.16
Configmap、Secret  (0) 2026.04.15

日本語