05. Week5 Jenkins on Kubernetes - chuirang/DevOps GitHub Wiki
Jenkins ๋ฅผ ์ด์ฉํด sampleapp์ kubernetes์ ๋ฐฐํฌํ๊ธฐ
์ ์ฐจ
- ์ฝ๋๋ฅผ GitHub ๋ฆฌํฌ์ ์ ์ฅ
- Jenkins ์์ Credential ์์ฑ
- Jenkins Job ์์ฑ
1. ์ฝ๋๋ฅผ GitHub ๋ฆฌํฌ์ ์ ์ฅ
1.1 ๊ธฐ๋ณธ ์ฝ๋๋ฅผ ์์ฑ
user@u2004-master:~/04_cicd$ tree .
.
โโโ docker
โ โโโ app.py
โ โโโ Dockerfile
โโโ Jenkinsfile
โโโ k8s
โโโ deployment.yaml
โโโ service.yaml
docker ํ์์ app.py, Dockerfile๊ณผ k8s ํ์์ yaml ํ์ผ์ Week 2์ ์ค์ต ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
1.2 Jenkinsfile ์์
์์ค์ฝ๋ ์์น์ Jenkinsfile ๋ณต์ฌํด์ค๊ณ (cp /tmp/Jenkinsfile .
) ์๋์ ๊ฐ์ด ์์ ํ๋ค.
..
// ๊ฐ Credential ID๋ฅผ ์๋ ๋ค์ด๋ฐ๋ฃฐ์ ๋ฐ๋ผ ์์ _ line 46, 47
// ๋ค์ด๋ฐ๋ฃฐ : {username}_kubeconfig, {username}_kubeconfig
environment {
DOCKER_CREDENTIAL_ID = "wonkilee_dockerhub"
K8S_CREDENTIAL_ID = "wonkilee_kubeconfig"
}
..
// ๊ฐ์์ github ID์ repository๋ก ์์ _ line 60
steps {
git branch: 'main', url: 'https://github.com/chuirang/DevOps.git'
}
..
Jenkinsfile์ git์ ์ ์ฅํ๋ ์๋ฏธ:
Jenkins ์ pipeline ์ Jenkins GUI์์ ์์ฑํ ์ ์์ง๋ง, Jenkins pipeline์ ์์ ํ๊ธฐ ์ํ ๊ด๋ฆฌํฌ์ธํธ๊ฐ ์ถ๊ฐ๋๊ณ pipeline์ ๋ณ๊ฒฝํด๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋ก์ผ๋ก ๋จ๊ธธ ์ ์๋ค.
Jenkinsfile๋ก pipeline์ ์ฝ๋๋ก ์ ์ํ๋ฉด, Git์ ํตํ์ฌ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์๊ณ , ์ฝ๋์ ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋กํ ์ ์๋ค. ๋ชจ๋ ์ฝ๋์ ์ค์ ์ ์ฝ๋๋ก ์์ฑ๋๊ณ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค.
1.3 GitHub ๋ฆฌํฌ์งํฐ๋ฆฌ ์์ฑ
์ดํ Jenkins Pipeline์ Checkout ๋จ๊ณ์์ ๊ฐ์ธ github ์ ์ฅ์๋ก ๋ถํฐ ์์ค์ฝ๋๋ฅผ ๋์ด์ค๊ธฐ ์ํด ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
-
GitHub ์ ์ > sign in > ์ข์ธก ์๋จ์ [New] ๋ฅผ ๋๋ฌ Repository ์์ฑ
-
Repository name ์ ๋ ฅ ํ [Create repository] ์ ๋๋ฅธ๋ค
Github ์ ์ฑ ๋ณ๊ฒฝ์ผ๋ก plain username/password ๋ก๋ ๋์ด์ git push ๊ฐ ๋์ง ์๋๋ค. (2021/8/13์ผ ๋ถํฐ)
์๋์ ์ ์ฐจ๋ก Personal access token์ ์์ฑํ๋ค.
-
์ฐ์ธก ์๋จ ๊ฐ์ธํ๋กํ > settings > Developer settings > Personal access tokens > Generate new token
-
์๋์ ๊ฐ์ด ์ค์ ํ [Generate token] ์ ๋๋ฅธ๋ค.
- Note: git_acess_token
- Selet scopes: repo ์ฒดํฌ
- ํ๋ฉด์ ๋ ธ์ถ๋ Token์ ๋ณต์ฌํด ๋๋ค. (์ด ํ๋ฉด์ ๋ค์ ํ์ธ๋ถ๊ฐํ๋ฏ๋ก ๋ฐ๋์ ๋ ธํธํจ๋์ ๋ณต์ฌํด๋ ๊ฒ)
1.4 GitHub ๋ก ์์ค์ฝ๋ ๋๊ธฐํ
์ฝ๋๊ฐ ์๋ ์๋จ ์์น์์ ์๋์ ๊ฐ์ด ๋ช ๋ น์ด ์ํํ๋ค.
git init
git add -A
git commit -m "first commit"
git config --global user.email "[email protected]" // ๊ฐ์์ github mail
git config --global user.name "your name" // ๊ฐ์์ ์ด๋ฆ
git branch -M main
git remote add origin https://github.com/{Github_ID}/{Repo_Name}.git
git push -u origin main
- git push ์์ 1.3์์ ์์ฑํ Personal access token์ ํจ์ค์๋๋ก ์ฌ์ฉํ๋ค.
์์)
user@u2004-master:~/04_sample$ ls
docker Jenkinsfile k8s
user@u2004-master:~/04_sample$ git init
Initialized empty Git repository in /home/user/04_sample/.git/
user@u2004-master:~/04_sample$ git add -A
user@u2004-master:~/04_sample$ git commit -m "first commit"
[master (root-commit) 8106e8d] first commit
5 files changed, 159 insertions(+)
create mode 100644 Jenkinsfile
create mode 100755 docker/Dockerfile
create mode 100755 docker/app.py
create mode 100755 k8s/deployment.yaml
create mode 100755 k8s/service.yaml
# ์ด๋ฏธ ์ค์ ๋์ด ์์ด git config --global ์ ์๋ต
user@u2004-master:~/04_sample$ git config --global -l
[email protected]
user.name=wonki lee
user@u2004-master:~/04_sample$ git branch -M main
user@u2004-master:~/04_sample$ git remote add origin https://github.com/chuirang/Devops_Sample.git
user@u2004-master:~/04_sample$ git push -u origin main
Username for 'https://github.com': user
Password for 'https://[email protected]': (*Personal access token์ ํจ์ค์๋๋ก ์ฌ์ฉ)
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 2.06 KiB | 234.00 KiB/s, done.
Total 9 (delta 0), reused 0 (delta 0)
To https://github.com/user/Devops_Sample.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
user@u2004-master:~/04_sample$
์ ์์ ์ผ๋ก push๊ฐ ๋๋ฉด GitHub ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ์๋ก๊ณ ์นจ ํ์ ๋ ์๋์ ๊ฐ์ด ๋ณด์ธ๋ค.
2. Jenkins ์์ Credential ์์ฑ
2.1 GitHub credential ์ค์ (public repository ์ด๋ฏ๋ก ์๋ต)
2.2 Docker Hub credential ์ค์
Docker ์ด๋ฏธ์ง ๋น๋๊ฐ ๋๋๋ฉด ์ฟ ๋ฒ๋คํฐ์ค์์ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Docker Hub์ ์ ์ฅํด์ผํ๋ค. Docker Hub์ ์ ์ฅํ๊ธฐ ์ํด์ ์ธ์ฆ ์ ๋ณด๊ฐ ํ์ํ๋ฐ, Jenkins์ Credential ๋ก ์ ์ฅํ์ฌ Pipeline์์ ์ฌ์ฉํ๋ค.
์๋์ ์ ์ฐจ๋ก Docker Hub ์ธ์ฆ์ ์ํ credential์ ์์ฑํ๋ค.
- ๋ค์ด๋ฐ๋ฃฐ : {username}_dockerhub
-
Jenkins ์ ์ > ์ข์ธก ์ฐฝ์์ Manage Jenkins ํด๋ฆญ > Manage Credential ํด๋ฆญ > ํ๋จ ํ์์ Jenkins ํด๋ฆญ > Global credentials (unrestricted) ํด๋ฆญ
-
์ข์ธก ์ฐฝ์์ Add Credentials ํด๋ฆญ ํ ์๋์ ๊ฐ์ด ์์ฑ
- Kind: Username with password
- Scope: Global
- Username: (DockerHub ID)
- password: (DockerHub Password)
- ID: ๋ค์ด๋ฐ๋ฃฐ์ ๋ฐ๋ผ ์ ๋ ฅ (ex. wonkilee_dockerhub)
- Description: (Optional)
์์ฑํ Credential ID๊ฐ Pipeline์์ ์ฐธ์กฐํ๋ ๊ฐ์ด๋ค.
2.3 Kubeconfig credential ์ค์ :
Jenkins Pipeline ์ ๋ง์ง๋ง ๋จ๊ณ์์ Deploy๋ฅผ ์ํํ๋๋ฐ, ์ด ๋ API Server ์ ์ธ์ฆํ๊ธฐ ์ํ kubeconfig์ Jenkins ์ credential๋ก ๋ฑ๋กํ๋ค.
์๋์ ์ ์ฐจ๋ก pipeline์ Deploy stage์์ kubectl ์ ์ฌ์ฉํ ๋ ์ฐธ์กฐํ๋ credential์ ์์ฑํ๋ค.
- ๋ค์ด๋ฐ๋ฃฐ : {username}_kubeconfig
-
Jenkins ์ ์ > ใ ์ธก ์ฐฝ์์ Manage Jenkins ํด๋ฆญ > Manage Credential ํด๋ฆญ > ํ๋จ ํ์์ Jenkins ํด๋ฆญ > Global credentials (unrestricted) ํด๋ฆญ
-
์ข์ธก ์ฐฝ์์ Add Credentials ํด๋ฆญ ํ ์๋์ ๊ฐ์ด ์์ฑ
- kind: Kubernetes configuration (kubeconfig)
- Scope: Global
- ID: ๋ค์ด๋ฐ๋ฃฐ์ ๋ฐ๋ผ ์ ๋ ฅ (ex. wonkilee_kubeconfig)
- Description: (Optional)
- kubeconfig: Enter directly ์ ํ > ๋ง์คํฐ ๋
ธ๋์ ์๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณต์ฌํ์ฌ Content์ ์
๋ ฅํ๋ค.
$ cat ~/.kube/config
์์ฑํ Credential ID๊ฐ Pipeline์์ ์ฐธ์กฐํ๋ ๊ฐ์ด๋ค.
3. Jenkins Job ์์ฑ
GitHub ์ repository์์ Jenkinsfile์ ๊ฐ์ ธ์ค๋๋ก Job์ ์์ฑํ๋ค.
-
Jenkins > ์ข์ธก์ New item
-
item name์ Week5_username ์ผ๋ก ์ ๋ ฅํ๊ณ [Pipeline] ์ ์ ํํ๊ณ [OK] ๋ฒํผ์ ๋๋ฅธ๋ค.
-
์๋์ ๊ฐ์ด ์ ๋ ฅ ํ [Save] ๋ฅผ ๋๋ฅธ๋ค.
-
Pipeline
Definition: Pipeline scriptPipeline script from SCM
SCM: Git
Repository URL: ์์ ์์ฑํ github repository ๋ฅผ ์ ๋ ฅ
Branch Specifier: */main
- ์์ฑ์ด ์๋ฃ๋ Job์์ Build Now ๋ฅผ ๋๋ฅด๋ฉด, ํ๋จ์ Build History๊ฐ ํ์ธ๋๋ค.
- ์ ์์ ์ธ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด Stage View๊ฐ ์ฐ์ธกํ๋ฉด ํ์ธ๋๋ค.
- Build History์ Build #1 ์ผ๋ก ์ด๋ํ๊ณ , ์ข์ธก์ Console Output ์ ๋๋ฌ๋ณด๋ฉด pipeline ์คํ๊ณผ์ ์ ํ์ธ ํ ์ ์๋ค.