Vagrantfile 새로 작성

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant.configure("2") do |config|
 
  #Jenkins
  config.vm.define "jenkins" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "jenkins"
      vb.cpus = 2
      vb.memory = 2048
    end
    config.vm.hostname = "jenkins"
    config.vm.network "private_network", ip: "192.168.56.101", nic_type: "virtio"
  end
 
  #Tomcat
  config.vm.define "tomcat" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "tomcat"
      vb.cpus = 2
      vb.memory = 2048
    end
    config.vm.hostname = "tomcat"
    config.vm.network "private_network", ip: "192.168.56.102", nic_type: "virtio"
  end
 
  #Docker
  config.vm.define "docker" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "docker"
      vb.cpus = 2
      vb.memory = 2048
    end
    config.vm.hostname = "docker"
    config.vm.network "private_network", ip: "192.168.56.103", nic_type: "virtio"
  end
 
  #Ansible
  config.vm.define "ansible" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "ansible"
      vb.cpus = 2
      vb.memory = 2048
    end
    config.vm.hostname = "ansible"
    config.vm.network "private_network", ip: "192.168.56.104", nic_type: "virtio"
  end
 
  #Kubernetes
  config.vm.define "k8s" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.provider "virtualbox" do |vb|
      vb.name = "k8s"
      vb.cpus = 2
      vb.memory = 4096
    end
    config.vm.hostname = "k8s"
    config.vm.network "private_network", ip: "192.168.56.105", nic_type: "virtio"
  end
 
  # Enable SSH Password Authentication
  config.vm.provision "shell", inline: <<-SHELL
    sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
    sed -i 's/archive.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
    sed -i 's/security.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
    systemctl reload ssh
  SHELL
end

 

 

 

Jenkins vm에 jenkins 설치

참고) https://www.jenkins.io/doc/book/installing/linux

 

1) java jdk

     sudo apt update

     sudo apt -y install openjdk-11-jdk

2) java 설치 확인

     java --version

3) java 환경변수 변경 및 적용

     vi ~/.bashrc

(맨 아래부분에 추가)
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
PATH=$PATH:$JAVA_HOME

     exec bash

     echo $JAVA_HOME

     echo $PATH

4) jenkins 설치

     wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

     sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

     sudo apt-get update

     sudo apt-get -y install jenkins

     systemctl status jenkins.service

5) jenkins Web UI 접속 : http://192.168.56.101:8080

6) 초기 jenkins Unlock 암호 입력 (파일 위치는 웹페이지에 출력)

     sudo cat /var/lib/jenkins/secrets/initialAdminPassword

7) 플러그인 설치 선택: Select Plugin to install 선택 => 다음단계로 진행 (설치)

8) 계정 생성 : ID/PW/이름/이메일

9) 접근할 주소 : 기본값 (http://192.168.56.101:8080)

10) 관리 콘솔 메인화면 표시 확인 후 JDK 설정

     Jenkins 관리

   Global Tool Configuration

   JDK

     이름: JAVA_HOME

     위치: /usr/lib/jvm/java-11-openjdk-amd64

 

 

 

 

jenkins 동작 테스트

 

샘플 프로젝트 생성

1. 프로젝트 생성

     새로운 Item

   이름: My-First-Project

   타입: Freestyle Project

     Buid

   Execute Shell

   echo Hello

2. 프로젝트 빌드

 build now 실행

 

 

 

Git, Maven 설치 및 구성

1. Git

     기본적으로 git 설치되어 있는 경우 설치 필요하지 않음

     설치되어 있지 않을 경우 별도로 설치

   sudo apt install git

     jenkins 에서 git 연결 설정

   Jenkins 관리

   Global Tool Configuration

     Git

   이름: Git

   위치: git

2. Maven

     Jenkins에서 빌드를 담당할 도구

     설치

   sudo apt install maven

     PATH등 환경설정

   vi ~/.bashrc

(맨 아래부분에 추가 및 기존 내용 수정)
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
M2_HOME=/usr/share/maven
PATH=$PATH:$JAVA_HOME:$M2_HOME

   exec bash

   echo $M2_HOME

   echo $PATH

     확인: mvn --version

     jenkins 에서 maven 연결 설정

   Jenkins 관리

   Global Tool Configuration

     Maven (맨 아래 있는 항목)

   이름: Maven_Home

   위치: /usr/share/maven

     플러그인 설치

   Jenkins 관리

   Plugin 관리

     설치 가능 (검색창을 통해 검색 가능)

   Maven Integration

   Maven Invoker

     참고) Maven 동작 라이프사이클

   clean : 빌드 관련된 내용 정리

   compile : 소스코드 컴파일

   test : 컴파일된 코드 테스트

   package : 컴파일 된 코드를 JAR/WAR 생성

   verify : 통합 테스트

   install : 로컬 저장소에 패키지 배포

   deploy : 원격 저장소에 패키지 배포

 

 

Jenkins, Maven을 사용한 애플리케이션 빌드 테스트

1. maven build 테스트

     샘플 코드 git 주소: https://github.com/c1t1d0s7/source-java-maven-hello-world.git

   git clone https://github.com/c1t1d0s7/source-java-maven-hello-world.git

   cd source-java-maven-hello-world

     mvn install

   빌드 후 war 파일 생성 확인 : webapp/target/webapp.war

     테스트 완료 후 빌드에 사용된 디렉토리 삭제

   rm -rf ~/source-java-maven-hello-world

2. build에 사용할 소스를 github에 업로드

     테스트용 샘플코드 다시 clone

   git clone https://github.com/c1t1d0s7/source-java-maven-hello-world.git

   cd source-java-maven-hello-world

     기존 clone으로 복사된 git 설정 삭제

   rm -rf .git

     git 초기화설정

   git init

     git 기본설정

   git config

   git config user.name <github 사용자명>

   git config user.email <github계정 이메일>

   git add

   git add .          // 현재 디렉토리를 git대상으로 등록

   git commit

   git commit -m '설명'             // 현재 git 대상 파일 등록

   git branch

   git branch -M 'master'         // master 이름의 branch 사용

   git remote

   git remote add origin <github repository 주소>
   // origin 이름의 원격 저장소 주소 설정

   git push

   git push origin master
   // master 브랜치를 origin 주소로 push
   // 인증이 필요함: Token 발급

3. Jenkins에서 maven을 사용한 빌드 생성

     새로운 item

   이름: My-First-Maven-Project

   타입: Maven Project

   소스코드 관리

     git

   repository: 자신의 github repository주소

   branch: 사용한 branch

     Build

   root POM : pom.xml

   Goals and options: clean install

4. 프로젝트 build

     프로젝트 화면에서 Build Now 실행

   프로젝트 빌드 콘솔화면 확인 가능

     프로젝트 빌드 결과물 위치

   /var/lib/jenkins/workspace/<프로젝트명>

 

 

 

참고) github Access Token 발급

     계정설정

   Developer Setting

   Personal Access Token

     Generate Token

   Repo 항목 체크

   Expiration 기간 설정

 

참고) gitgub 계정 설정 저장

     git config credential.helper

   git config credential.helper store                     // 설정에 인증정보 저장

   git config credential.helper cache
  // 캐시에 인증정보 저장 (유효기간 있음. 기본값 1시간)

 

 

Jenkins를 사용한 빌드 및 Tomcat 서버에 어플리케이션 배포

 

1. Tomcat VM 구동

     vagrant up tomcat

 

2. Tomcat 서버 설정

1) java jdk

     sudo apt update

     sudo apt -y install openjdk-11-jdk

2) java 설치 확인

     java --version

3) java 환경변수 변경 및 적용

     vi ~/.bashrc

(맨 아래부분에 추가)
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
PATH=$PATH:$JAVA_HOME

     exec bash

     echo $JAVA_HOME

     echo $PATH

4) Tomcat 설치 및 확인

     sudo apt -y install tomcat9 tomcat9-admin

     sudo systemctl status tomcat9

5) Tomcat 서버 설정 확인 및 수정, 설정 반영

     sudo vi /etc/tomcat9/tomcat-users.xml

<tomcat-users>
...
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <user username="admin" password="admin" roles="manager-gui, manager-script, manager-jmx, manager-status"/>
  <user username="deployer" password="deployer" roles="manager-script"/>
  <user username="tomcat" password="tomcat" roles="manager-gui"/>
</tomcat-users>

     서비스 재시작: sudo systemctl restart tomcat9.service

     웹 UI 연결 및 tomcat-admin manager 연결 확인 (http://192.168.56.102:8080)

5) Jenkins 플러그인 추가

     Jenkins 관리

   Plugin 관리

   설치 가능 (검색창을 통해 검색 가능)

     Deploy to Container

6) Jenkins에서 빌드 및 배포 수행하는 프로젝트를 생성

     이전 단계와 동일한 부분 : git 및 maven 설정

     빌드 후 조치 부분 추가

   Deploy war/ear to a container

   WAR/EAR files: **/*.war (빌드 workspace 내 war 파일 경로)

   Container: Tomcat 9.x remote

     Credential

   add

   Username: deployer

   Password: deployer

   ID: tomcat_deployer_id

   tomcat_deployer_id 선택

     Tomcat URL: http://192.168.56.102:8080

     설정 완료 후 저장

7) 프로젝트 빌드

     빌드 후 확인

   http://192.168.56.102:8080/webapp               // 빌드된 앱 접속

   http://192.168.56.102:8080/manager            // 빌드 설정 확인

 

 

Jenkins와 Docker를 사용한 배포

 

1.Docker VM 구동

     vagrant up docker

 

2. docker 서버 설정 (docker vm에서)

1) Docker 설치를 위한 Repository 설정

     sudo apt update

     sudo apt -y install apt-transport-https ca-certificates curl gnupg lsb-release

     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

     echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2) Docker 설치

     sudo apt update

     sudo apt install docker-ce docker-ce-cli containerd.io

3) 사용자 docker 그룹 설정

     sudo usermod -aG docker vagrant

4) 로그아웃 후 다시 로그인

5) docker 동작 확인

     systemctl status docker.service

     docker ps

     docker run --rm hello-world

6) 빌드된 파일을 사용하기 위한 Tomcat 이미지 정보 확인

     https://hub.docker.com/_/tomcat

     docker run -d --name tomcat -p 8080:8080 tomcat:9-jre11

7) jenkins를 통해 빌드된 파일을 배포될 시스템으로 옮기기 위한 플러그인 설치

     Jenkins 관리

   Plugin 관리

   설치 가능 (검색창을 통해 검색 가능)

     Publish over SSH

8) SSH 로 파일 복사를 하기 위한 설정

     Jenkins 관리

   시스템 설정

   Publish over SSH

     SSH 서버 추가 (맨 밑에)

   Name: docker-host      // 현재 설정 이름

   Hostname: 192.168.56.103

   Username: vagrant

   Use password authentication, or use a different key 체크    // 아래 '고급' 버튼 클릭하여 생성

   Passphrase / Password: vagrant

   Test Configuration : 연결 테스트

   설정 완료 후 저장

9) Jenkins에서 빌드 및 파일 복사를 수행하는 프로젝트를 생성

     이름: Deploy-to-docker-with-Artifact

     타입: Maven 프로젝트

     이전 단계와 동일한 부분 : git 및 maven 설정

     빌드 후 조치 부분 추가

   Send build artifact over SSH

   SSH Server: docker-host                // 이전에 생성한 SSH 연결 설정

   Source file: webapp/target/webapp.war     // 복사할 파일

   Remove Prefix: webapp/target
   // 파일 복사시 경로에서 제거할 부분

   Remote Directory: hello-world
   // 복사할 대상에서 지정할 경로.
   // 기본 위치인 홈 디렉토리부터 상대경로

     저장 및 빌드 실행

     결과확인: docker vm의 /home/vagrant 홈디렉토리에 hello-world 디렉토리 및 파일

 

 

 

Docker에서 전달받은 파일을 CI에 통합하는 과정

1) Dockerfile을 사용한 전달받은 빌드를 포함한 이미지 생성(docker vm에서)

     docker vm의 ~/Dockerfile

FROM    tomcat:9-jre11
COPY    ./webapp.war /usr/local/tomcat/webapps

     docker build -t my-hello-world .

     테스트: docker run -d --name mytomcat -p 8080:8080 my-hello-world:latest

2) 빌드에 필요한 Dockerfile을 통합 (jenkins vm에서)

     기존 git으로 관리하던 경로로 이동

   cd ~/source-java-maven-hello-world

     Dockerfile을 저장할 경로 및 파일 생성

   mkdir docker

   vi docker/Dockerfile

FROM    tomcat:9-jre11
COPY    ./webapp.war /usr/local/tomcat/webapps

     추가된 내용을 github repository에 반영

   git add .

   git commit -m 'add Dockerfile'

   git push origin master

3)  Jenkins에서 빌드 및 파일 복사, 생성된 이미지를 사용하는 컨테이너 배포 프로젝트

     이름: Deploy-to-docker-with-container

     타입: Maven 프로젝트

     이전 단계와 동일한 부분 : git 및 maven 설정

     빌드 후 조치 부분 추가

   Send build artifact over SSH

   기존 war 파일을 복사하는 부분 동일하게 설정

   새로운 항목 추가 (Add Transfer Set)

     Source file: docker/Dockerfile

     Remove Prefix: docker

     Remote Directory: hello-world

     Exec Command

docker build -t my-hello-world ~/hello-world
docker run -d --name my-hello-world-container -p 8080:8080 my-hello-world

4) 프로젝트 생성 완료 후 빌드 실행 및 확인

     http://192.168.56.103:8080

     (docker vm에서)

   docker images

   docker ps

5) 어플리케이션 컨텐츠 변경 후 재 빌드 테스트 (jenkins vm에서)

      vi webapp/src/main/webapp/index.jsp                // 페이지 수정

     github 반영

   git add .

   git commit -m 'Modify index.jsp'

   git push origin master

6) 재 빌드 실행 후 오류 발생 확인

     빌드 과정 화면(콘솔)에서 오류 확인 가능

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [125]]
Build step 'Send build artifacts over SSH' changed build result to UNSTABLE
Finished: UNSTABLE

     오류 원인: 이전 프로젝트 빌드를 통해 생성된 컨테이너와 같은 이름의 컨테이너 생성

 

 

Ansble을 사용하여 배포에 유연함을 더해주기

 

1. ansible 설치

1) ansible vm에서 ansible 기능 설치

     sudo apt update

     sudo apt -y install ansible

2) ansible을 사용한 ssh 연결 설정

     SSH 키 생성 : ssh-keygen

     SSH 키 복사 : ssh-copy-id vagrant@192.168.56.104
// 자기자신에게 ansible로 작업을 보내기 위해

3) ansible 기본 환경설정

     사용자 기본 환경설정 ~/.ansible.cfg

[defaults]
inventory = ./inventory.ini

     사용자 기본 인벤토리 ~/inventory.ini

[ansible_host]
192.168.56.104           ansible_connection=local

     테스트: ansible -m ping all

4) yaml 파일 편집용 설정 추가 (옵션)

     vi ~/.vimrc

syntax on
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 ai et

 

2.  docker 설치 (ansible vm에서)

1) Docker 설치를 위한 Repository 설정

     sudo apt update

     sudo apt -y install apt-transport-https ca-certificates curl gnupg lsb-release

     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

     echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2) Docker 설치

     sudo apt update

     sudo apt -y install docker-ce docker-ce-cli containerd.io

3) 사용자 docker 그룹 설정

     sudo usermod -aG docker vagrant

4) 로그아웃 후 다시 로그인

5) docker 동작 확인

     systemctl status docker.service

     docker ps

     docker run --rm hello-world

 

 

3. 배포작업을 위한 플레이북 작성

     미리 배포작업에 필요한 webapp.war 파일 및 Dockerfile을 ~/hello-world로 복사

     vi ~/hello-world/test.yaml

---
- name: Jenkins CI/CD Test Playbook
  hosts: ansible_host
  tasks:
  - name: build docker image with war file
    command: docker build -t my-hello-world .
    args:
      chdir: /home/vagrant/hello-world
  - name: run container with my image
    command: docker run -d --name my-hello-world-container -p 8080:8080 my-hello-world

     vi ~/hello-world/repeatable.yaml

---
- name: Jenkins CI/CD Test Playbook (Repeatable)
  hosts: ansible_host
  tasks:
  - name: clean docker image and container
    block:
    - name: stop container
      command: docker stop my-hello-world-container
    - name: remove container
      command: docker rm my-hello-world-container
    - name: remove image
      command: docker rmi my-hello-world
    ignore_errors: true
  - name: build docker image with war file
    command: docker build -t my-hello-world .
    args:
      chdir: /home/vagrant/hello-world
  - name: run container with my image
    command: docker run -d --name my-hello-world-container -p 8080:8080 my-hello-world

 

4. Jenkins에 Playbook을 사용하는 작업을 포함한 프로젝트 생성

1) playbook 추가

     cd ~/source-java-maven-hello-world

     mkdir playbook

     vi playbook/docker.yaml

---
- name: Jenkins CI/CD Test Playbook (Repeatable)
  hosts: ansible_host
  tasks:
  - name: clean docker image and container
    block:
    - name: stop container
      command: docker stop my-hello-world-container
    - name: remove container
      command: docker rm my-hello-world-container
    - name: remove image
      command: docker rmi my-hello-world
    ignore_errors: true
  - name: build docker image with war file
    command: docker build -t my-hello-world .
    args:
      chdir: /home/vagrant/hello-world
  - name: run container with my image
    command: docker run -d --name my-hello-world-container -p 8080:8080 my-hello-world

     github에 반영

   git add .

   git commit -m 'add playbook'

   git push origin master

2) SSH 로 파일 복사를 하기 위한 설정

     Jenkins 관리

   시스템 설정

   Publish over SSH

     SSH 서버 추가 (맨 밑에)

   Name: ansible-host     // 현재 설정 이름

   Hostname: 192.168.56.104

   Username: vagrant

   Use password authentication, or use a different key 체크    // 아래 '고급' 버튼 클릭하여 생성

   Passphrase / Password: vagrant

   Test Configuration : 연결 테스트

   설정 완료 후 저장

3)  Jenkins에서 빌드 및 파일 복사, 배포 시 playbook을 사용하는 프로젝트 생성

     이름: Deploy-to-ansible-with-Playbook

     타입: Maven 프로젝트

     이전 단계와 동일한 부분 : git 및 maven 설정

     빌드 후 조치 부분 추가

   Send build artifact over SSH

   Playbook 실행결과를 상세히 보고 싶을 경우, 상단 고급 클릭 후 Verbose Output 옵션 체크

   SSH Server: ansible-host

   기존 war 파일을 복사하는 부분 동일하게 설정

     기존 exec command 부분은 빼고

   새로운 항목 추가 (Add Transfer Set)

     Source file: playbook/docker.yaml

     Remove Prefix: playbook

     Remote Directory: hello-world

     Exec Command

ansible-playbook ~/hello-world/docker.yaml

     프로젝트 빌드 후 결과 확인

 

4) 어플리케이션 소스 업데이트에 따른 빌드 반영여부 확인 (jenkins vm에서)

     cd ~/source-java-maven-hello-world

     vi webapp/src/main/webapp/index.jsp       // 내용 수정

     github 반영

   git add .

   git commit -m 'modify index.jsp (ansible)'

   git push origin master

     프로젝트 빌드 재실행 (Web UI)

CI/CD 구성에 Kubernetes 포함

 

클러스터 된 Kubernetes 환경에서 이미지를 로드하기 위한 방법

     외부 저장소(Private Registry) 등을 사용한 이미지 배포

     Docker Hub, ECR(Elastic Continer Registry) 등

 

구성

     jenkins : CI/CD 구성을 담당

     ansible : ansible 기능을 추가. docker image 빌드, docker hub 푸시

     kubernetes : 파드 구동

 

Docker Hub 계정 준비

     docker push <Dockerhub계정>/my-hello-world:tagname

 

Docker Hub로 빌드된 이미지를 Push 하는 ansible playbook 작성

---
- name: build image and push to docker hub play
  hosts: ansible_host
  tasks:
  - name: remove image
    command: docker rmi <Dockerhub계정>/my-hello-world
    ignore_errors: true
  - name: build image
    command: docker build -t <Dockerhub계정>/my-hello-world ~/hello-world
  #- name: docker login
  #  command: docker login -u <ID> -p <PW>   // 계정정보 취급주의!
  - name: push image
    command: docker push <Dockerhub계정>/my-hello-world

 

Kubernetes 실습환경구성 (k8s vm에서)

1) kubernetes 클러스터 구성 (k8s 단일노드 구성, control 통합)

     설치

   sudo apt update

   sudo apt install -y python3 python3-pip git

   git clone --single-branch --branch release-2.16 https://github.com/kubernetes-sigs/kubespray.git

   cd ~/kubespray

   sudo pip3 install -r requirements.txt

   cp -rfp inventory/sample inventory/mycluster

   vi inventory/mycluster/inventory.ini

[all]
k8s      ansible_host=192.168.56.105 ip=192.168.56.105
 
[kube_control_plane]
k8s
 
[etcd]
k8s
 
[kube_node]
k8s
 
[calico_rr]
 
[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

     ssh 키 기반 인증 설정 (ansible로 kubespray 설치를 진행하기 때문에 필요함)

   ssh-keygen

   ssh-copy-id vagrant@192.168.56.105

     연결 테스트 및 설치

   ansible all -i inventory/mycluster/inventory.ini -m ping

   ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml --become
  // 이 작업은 시간 좀 걸림

     설치 완료 후 권한 설정 (k8s VM에서)

   mkdir ~/.kube

   sudo cp /etc/kubernetes/admin.conf ~/.kube/config

   sudo chown $USER:$USER ~/.kube/config

     쿠버네티스 클러스터 구성 확인

   kubectl get nodes

   kubectl cluster-info

     kubectl 명령 bash-completion 설정

   kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl

   exec bash

 

참고) yaml 편집 시 vi에서 간편 설정하는 법

:set ts=2 sts=2 sw=2 ai et

 

kubernetes에서 준비된 이미지를 사용하는 리소스 오브젝트 파일 생성 및 테스트

     디플로이먼트 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-hello-world-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-hello-world
  template:
    metadata:
      labels:
        app: my-hello-world
    spec:
      containers:
      - name: my-hello-world-container
        image: deyiho2401/my-hello-world
        ports:
        - containerPort: 8080
          protocol: TCP

     서비스 service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-hello-world-service
spec:
  type: NodePort
  selector:
    app: my-hello-world
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30880

     생성한 오브젝트 파일을 사용하여 리소스 생성 테스트

 

 

 

Jenkins를 사용한 이미지 업로드용 CI 프로젝트 생성

     CI 및 CD 작업 구성에 필요한 파일들을 git 저장소로 복사

   playbook/push.yaml

   manifest/deployment.yaml

   manifest/service.yaml

     어플리케이션 컨텐츠 수정 (변경 확인을 위해)

    vi webapp/src/main/webapp/index.jsp

     github 저장소 변경 반영

   git add .

   git commit -m 'CI config'

   git push origin master

     기존 Docker Container 배포 내용과 거의 동일

   프로젝트 이름: Push_image_to_Dockerhub_CI

   대부분의 설정은 이전 프로젝트와 동일

   최종 실행되는 플레이북을 push.yaml 로 적용

---
- name: build image and push to docker hub play
  hosts: ansible_host
  tasks:
  - name: remove image
    command: docker rmi deyiho2401/my-hello-world
    ignore_errors: true
  - name: build image
    command: docker build -t deyiho2401/my-hello-world ~/hello-world
  #- name: docker login
  #  command: docker login -u <ID> -p <PW>
  - name: push image
    command: docker push deyiho2401/my-hello-world

 

Jenkins를 사용한 이미지 배포용 CD 프로젝트 생성

     SSH 파일 배포를 위한 설정

   Jenkins 관리 - 시스템 설정 - Publish over SSH

   SSH 서버 추가 (맨 밑에)

     Name: k8s-host

     Hostname: 192.168.56.105

     Username: vagrant

     Use password authentication, or use a different key 체크       // 아래 '고급' 버튼 클릭하여 생성

   Passphrase / Password: vagrant

     CD작업에 필요한 파일 배포 및 리소스 생성 프로젝트 생성

   프로젝트 이름: Deploy_to_k8s_CD

   git repository 설정

   빌드 유발

   Build after other projects are built

     CI 빌드 작업의 이름 입력 (Push_image_to_Dockerhub_CI)

     Trigger only if build is stable

   빌드 후 조치

   SSH-Server : k8s-host

   Transfer

     Source Files: manifest/*.yaml

     Remove Prefix: 빈칸

     Remote Directory: 빈칸

     Exec Command

kubectl apply -f ~/manifest

     빌드 테스트 후 어플리케이션 컨텐츠 업데이트 하여 CI에 이어지는 CD 배포 확인

   jenkins vm의 git 저장소에서

   vi webapp/src/main/webapp/index.jsp

   github 변경 반영

   git add .

   git commit -m 'CI/CD complete'

   git push origin master

     현재 상태에서 CD 빌드 재수행 시 어플리케이션에 변화가 없음

   CD 빌드가 수행되었으나, k8s 리소스에는 변화가 없음

   디플로이먼트 리소스에 대해 변경된 이미지로 다시 로드하기 위해서는

   kubectl rollout restart deployment <Deployment 이름>

   위 명령을 CD 배포의 exec command 아래에 추가

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기