CI/CD 그대로 따라하기 5편

강재민·2022년 6월 9일
0

이번에는 도커 컨테이너가 아니라 쿠버네티스에 pod로 배포하는것 까지 합니다. 이번 편이 마지막이 되겠습니다 ~


Github에 각종 yaml파일 push하기

jenkins 가상머신의 github과 연동된 디렉토리로 오셔서..

아래 내용을 순서대로 다 편집해주시면 됩니다 ~

cd playbook
vi docker_build_and_push.yaml
### 내용 다 지우고 붙여넣어주시면 됩니다.
### repush는 본인 docker 계정 이름으로 교체하시면 됩니다.
### 혹시 docker 리포지토리 다르게 하셨으면 그것도 체크하셔야해요 !!
### repush/cicdprojent 는 저만 사용하는 계정과 리포지토리입니다 !!

- name: Docker Image Build and Push
  hosts: ansible_host
  gather_facts: false

  tasks:
    - command: docker image build -t repush/cicdproject:"{{ lookup('env', 'BUILD_NUMBER') }}" java-hello-world/
    - command: docker login -u repush -p "{{ lookup('env', 'TOKEN') }}"
    - command: docker push repush/cicdproject:"{{ lookup('env', 'BUILD_NUMBER') }}"
    - command: docker logout
vi kube_deploy.yaml
### 아래내용도
### 위처럼
### 본인 docker 계정으로 바꾸는거 아시겠죠??

- hosts: ansible_host
  gather_facts: no

  tasks:
    #- command: kubectl apply -f java-hello-world/kube_manifest/
    - name: Create Deployment
      k8s:
        state: present
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: java-hello
            namespace: default
          spec:
            replicas: 5
            selector:
              matchLabels:
                app: java-hello
            template:
              metadata:
                labels:
                  app: java-hello
              spec:
                containers:
                  - name: java-hello
                    image: "repush/cicdproject:{{ lookup('env', 'BUILD_NUMBER') }}"
                    imagePullPolicy: Always
                    ports:
                      - containerPort: 8080 
    - name: Create Service
      k8s:
        state: present
        definition:
          apiVersion: v1
          kind: Service
          metadata:
            name: java-hello-svc
            namespace: default
          spec:
            type: NodePort
            selector:
              app: java-hello
            ports:
              - port: 80
                targetPort: 8080
                nodePort: 31313
git add .
git commit -m 'Add k8s'
cat ~/.ssh/token
git push

본인 git 리포지토리에 잘 추가되었는지 확인해주세요


Jenkins 프로젝트 작성하기

jenkins 홈페이지로 오셔서.. 새로운 Item 클릭

build-image-and-deploy-to-kubernetes-with-ansible라는 이름으로 Maven project클릭하시고 OK클릭

이 빌드는 매개변수가 있습니다 왼쪽 체크박스 활성화

매개변수 추가 클릭

Password Parameter클릭

매개변수명은 TOKEN
Default Value는 jenkins 터미널가셔서 cat ~/.ssh/token-for-docker 값 집어넣으시면 됩니다.

Git 오른쪽 체크박스 활성화

본인 Git 계정 리포지토리 주소 받아오시면 됩니다.

mastermain으로 바꿔주시면 됩니다.

clean package 붙여넣어주시고..

빌드 후 조치 추가 클릭

Send build artifacts over SSH 클릭해주세요

아래 사진 내용 확인

그 다음 내려가셔서 아래 사진과 표를 참고해서 작성해주세요

항목설정값
Source fileswebapp/target/webapp.war
Remove prefixwebapp/target/
Remote directoryjava-hello-world

Add Transfer Set클릭

아래 사진과 표를 참고해서 작성해주세요

항목설정값
Source filesdocker/Dockerfile
Remove prefixdocker/
Remote directoryjava-hello-world

Add Transfer Set클릭

아래 사진과 표를 참고해서 작성해주세요

항목설정값
Source filesplaybook/*.yaml
Remove prefixplaybook/
Remote directoryjava-hello-world

Exec command

TOKEN=`echo $TOKEN` BUILD_NUMBER=`echo $BUILD_NUMBER` ansible-playbook java-hello-world/docker_build_and_push.yaml
BUILD_NUMBER=`echo $BUILD_NUMBER` ansible-playbook java-hello-world/kube_deploy.yaml

Apply하고 저장클릭


ansible에 k8s명령어 모듈 설치하기

ansible 가상머신 터미널로 오셔서..

sudo apt update
sudo apt install -y ansible
sudo apt install -y python3-pip
sudo pip install openshift==0.11


docker 가상머신에 k8s 설치하기

docker 가상머신 터미널로 오셔서..

sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y
sudo apt-mark hold kubelet kubeadm kubectl
sudo vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
sudo systemctl restart docker
docker info | grep 'Cgroup Driver'
sudo systemctl daemon-reload && sudo systemctl restart kubelet
sudo kubeadm init --control-plane-endpoint 192.168.59.12 --pod-network-cidr 172.16.0.0/16 --apiserver-advertise-address 192.168.59.12
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

### 결과
NAME     STATUS     ROLES                  AGE   VERSION
docker   NotReady   control-plane,master   14m   v1.22.8


### CNI가 준비되지 않아서 NotReady라고 뜬다.
kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
curl https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml -O
vi custom-resources.yaml
...
      cidr: 172.16.0.0/16
...
kubectl create -f custom-resources.yaml
watch -n1 kubectl get pods -A

### 모두 Running상태가 되면 ctrl + c로 나와서
kubectl taint node docker node-role.kubernetes.io/master-
kubectl get nodes

아래 사진처럼 나오면 성공

해당 내용이 궁금하시다면 아래 링크에 좀 더 자세하게 되어있다..
https://prod.velog.io/@repush/Kubernetes%EB%A5%BC-adm%EC%9C%BC%EB%A1%9C-%EC%84%A4%EC%B9%98


ansible 인벤토리 구성

ansible 가상머신 터미널로 오셔서..

vi ~/hosts.ini

아래 내용처럼 편집해준다.

[ansible_host]
192.168.59.13

[docker_host]
192.168.59.12

[kubernetes_cluster]
192.168.59.12
ansible kubernetes_cluster -m ping

아래 사진처럼 나오면 성공


ansible 가상머신에 kubectl 명령어 설치 및 인증정보 붙여넣기

ansible 가상머신 터미널로 오셔서..

mkdir .kube
scp 192.168.59.12:~/.kube/config .kube/config
curl -LO https://dl.k8s.io/release/v1.22.8/bin/linux/amd64/kubectl
sudo install kubectl /usr/local/bin/
kubectl get nodes

아래 사진처럼 나오면 성공


어플리케이션 실행하기

드디어 실행할 때가 왔습니다..
jenkins 웹 페이지로 오셔서 최근에 만드신 프로젝트 클릭하셔서 아래 화면으로 와주세요

Build with Parameters클릭

빌드하기 클릭


결과 확인하기

docker 가상머신 터미널로 오셔서..

watch -n1 kubectl get deploy,rs,po,svc,ep

아래와 같은 내용이 뜨면 일단 성공 하신거구

curl localhost:31313/webapp/

했을 때 아래 사진처럼 나오면 성공 하신겁니다.


자동으로 변경사항 적용시키기

jenkins의 본인 프로젝트로 가셔서 구성 해주세요

빌드 유발에 Poll SCM왼쪽에 체크박스 활성화 해주세요

아래 사진처럼 나올텐데

Schedule에 * * * * *입력하시면 됩니다. (띄어쓰기 중간에 있어야합니다.)

Apply누르시고 저장


Github에 새로운 내용 push 해보기

docker 가상머신 터미널에서..

watch -n1 kubectl get deploy,rs,po,svc,ep

이렇게 해놓으신 상태에서 이곳 변화를 관찰하시면 됩니다.

지금 Pod가 5개있죠

jenkins 가상머신 터미널로 오셔서..
git repository 관리하는 디렉토리로 오셔서..

두 가지 바꿔보실 수 있는데요
1. pod 개수 줄여보기

cd playbook
vi kube_deploy.yaml


여기서 replicas: 5replicas: 3으로 바꿔보시고 저장하고 나와보세요

  1. helloworld 문구 바꿔보기
    jenkins 가상머신 터미널로 오셔서..
    git repository 관리하는 디렉토리로 오셔서..
cd webapp/src/main/webapp/
vi index.jsp

아래 문구 또는 원하는 문구로 변경해보세요

<h1> Hello World!!! </h1>
<h3> Hava a nice day guys </h3>
cd ../../../..
git add .
git commit -m 'Add Hava a nice day guys and Reduce replicas'
cat ~/.ssh/token
git push

결과 확인

아까 실행해놓은 docker 가상머신을 보고 계세요

기다리시면 이렇게 Pod가 3개로 줄었고 이미지가 교체되었으니 Pod AGE가 다시 시작된걸 확인할실 수 있습니다.

ctrl + c로 나오셔서

아래 명령어 치시면 저희가 추가했던 문구가 생겨난 것을 확인할 수 있습니다.

curl localhost:31313/webapp/

고생하셨습니다~~ 이제 부터 시작이니까 힘내서 다음 단계 해봅시다 !

0개의 댓글