docker desktop의 minikube 사용
Kubernetes Cluster은 Master node와 worker node로 구성되어있다.
Master Node : Kubernetes 클러스터의 중앙 관리 노드다. 주요 컨트롤 플레인 구성 요소인 kube-api server, kube-controller-manager, kube-scheduler, etcd 등이 실행된다. 마스터 노드는 클러스터의 상태를 관리하고, 클러스터 설정 정보를 유지하며, 스케줄링, 모니터링, 로깅 등의 작업을 처리한다. 또한, 클러스터의 API 서버를 통해 개발자와 상호작용한다.
Worker Node : Kubernetes 클러스터의 실제 작업을 수행하는 노드다. 각각의 워커 노드에는 컨테이너 실행을 위한 컨테이너 런타임(Docker, containerd 등), kubelet(노드에서 컨테이너와 상호작용하는 에이전트), kube-proxy(서비스 디스커버리와 로드 밸런싱을 위한 네트워크 프록시) 등의 구성 요소가 실행된다. 워커 노드는 마스터 노드의 지시에 따라 컨테이너를 스케줄링하고 실행하며, 노드 상태를 마스터 노드에 보고한다.
Kubernetes를 사용하여 CI/CD 파이프라인을 통해 애플리케이션을 배포할 때, 컨테이너 형태로 애플리케이션을 패키징하고 관리한다. 이를 위해 컨테이너를 Pod이라는 단위로 감싸고, 이 Pod를 외부와 연결하기 위해 Services 오브젝트를 사용한다.
kubectl get nodes
kubectl get pods
kubectl get pod -o wide
kubectl get deployments
kubectl get services
kubectl describe pod/xxx
kubectl delete pod/xxx
kubectl delete deployment nginx-deployment
kubectl scale deployment xxx --replicas=2
kubectl apply -f xxx.yml
kubectl exec -it nginx-deployment-XXXX-XXXX -- /bin/bash
kubectl expose deployment nginx-deployment --port=80 --type=NodePort
kubectl run sample-nginx --image=nginx --port=80
: Kubernetes 클러스터에서 "sample-nginx"라는 이름의 pod가 생성되며, 해당 팟은 nginx 이미지를 사용하고 80번 포트를 열어서 애플리케이션을 실행한다.
생성한 pod를 삭제한다음 deployment를 생성해보자. Deployment는 pods를 replica set라고 해서 여러 형태로 scailing해서 만들거나 scheduling, historing 작업을 할때 사용할 수 있는 설치 개념으로 pod의 상위 개념이다.
kubectl create deployment sample-nginx --image=nginx
nginx 이미지를 이용해서 deployment를 하나 생성했는데 pod도 같이 생성됨을 확인할 수 있다.
다음은 deployment의 scailing 작업을 해보자.
kubectl scale deployment sample-nginx --replicas=2
pods가 2개로 늘어났다.
위와 같이 작업한 내용들을 script 파일로 만들면 일괄적을 편리하게 실행할 수 있다.
kubectl apply -f sample1.yml
명령어로 스크립트 파일을 실행할 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Kubernetes 스크립트 파일에서 Port, Target Port, NodePort는 서로 다른 개념을 나타낸다. 각각의 역할과 의미는 다음과 같다
NodePort : 외부에서 접속하기 위해 사용하는 포트
Port : Cluster 내부에서 사용할 Service 객체의 포트
TargetPort : Service객체로 전달된 요청을 Pod(deployment)로 전달할때 사용하는 포트
전체 서비스 흐름으로 보면 NodePort --> Port --> TargetPort
앞서 Kubernetes를 docker desktop의 minikube로 기동시켰다. docker 컨테이너로 운영되고 있는 Ansible-server에서 module, playbook을 이용해서 kubernetes를 제어해보려한다.
Ansible-server에서 playbook 파일을 실행시켜 Kubernetes가 가지고 있는 script 파일을 실행하기
docker exec -it ansible-server bash
[ansible-server]
localhost
[kubernetes]
host-pc ip address
ansible-server에서 kubernetes 핑 테스트
ansible -i ./k8s/hosts kubernetes -m ping
ansible-server에서 host-pc에 로그인을 하지 않았기때문에 에러가 떴다.
ssh 키 복사
ssh-copy-id [Host name]@[Host PC IP]
하지만 그래도 에러가 뜬다.. docker 컨테이너로 기동하고 있는 ansible-server에서 Windows PC(HOST)로 ssh-copy-id 명령어는 정상적인 실행이 안될 수 있다고 한다. 아래 글을 따라 참고하자.
참고 : ssh-copy-id 에러, windows에서 ansible playbook으로 kubernetes script 실행 오류
Ansible에서 K8s 접속 테스트
ansible windows -m win_ping
연결 테스트가 성공했다.
Ansible-server에 playbook 작성
kubernetes에서 script 파일 작성
ansible-server에서 playbook 실행
ansible-playbook -i /etc/ansible/hosts k8s-cicd-deployment-playbook.yml
정상적으로 kubernetes의 script 파일이 실행되어서 deployment와 pods가 생성되었다.
앞서 구성된 Ansible + Kubernetes에다가 Jenkins를 연결해보자.
Jenkins item의 빌드후 조치탭의 Send build artifacts over SSH의 Exec command를 아래와 같이 입력하면 된다.
ansible-playbook -i /etc/ansible/hosts k8s-cicd-deployment-playbook.yml
CI : 지속적인 통합
CD : 지속적인 배포
Item 생성
CI
ansible-playbook -i /etc/ansible/hosts create-cicd-devops-image.yml --limit ansible-server
-> ansible server에서만 playbook 실행. 해당 playbook에는 이미지 빌드, docker hub에 푸시, 기존 이미지 삭제하는 CI 작업이 명시되어 있음.
CD
Build other projects는 build가 정상적으로 수행된 다음 동작함, My-K8s-Project-using-Ansible는 docker hub로부터 image를 가져와서 kubernetes에 적용하기 위한 playbook 실행등 CD 작업이 수행됨,