명령적 방식(imperative)과 선언적 방식(declarative)으로 객체를 생성한다.
명령적 방식 imperative
- kubectl 명령 사용
- 작업을 위해 개별적인 명령 실행
- docker run으로 모든 명령을 하는 것과 비슷함
선언적 방식 declarative
- apply 명령을 사용하여 yaml로 작성한 설정(config) 파일을 읽어옴
- config 파일에 원하는 상태를 정의한다.
- Docker Compose와 비슷하다.
Pod
- 쿠버네티스와 상호작용 하는 가장 작은 단위
- 한 개 이상의 컨테이너를 보유하고 실행시킨다.
- 일반적으로 한 개를 가진다.
- 다른 pod들과 공유하는 공유 리소스를 가진다. (e.g. volume)
- 기본적인 내부 IP 주소를 가진다.
- localhost 주소를 이용해 내부 pod끼리 통신할 수 있다.
- 클러스터 외부에서 pod에 액세스 할 때 사용할 수 없다.
- pod 교체 시 IP 주소가 변경되기 때문에 pod의 ip를 찾는 것은 어렵다.
- pod는 임시적이다.
- pod가 kubernetes에 의해 교체되거나 제거되면, pod의 모든 리소스, 예를 들어 컨테이너에 의해 저장되고 생성된 데이터가 손실된다.
Deployment
- 하나 이상의 pod를 제어할 수 있다.
- 원하는 상태를 설정하면 쿠버네티스가 현재 상황을 변경시킨다. 따라서 사람이 직접 pod나 컨테이너를 건드리지 않고 쿠버네티스가 알아서 생성시키고 삭제한다.
- deployment를 일시중지 하거나, 삭제, 롤백할 수 있다.
- deployment도 동적으로 또는 자동 스케일링 될 수 있다.
- deployment 객체를 설정하면 자동으로 master node의 control plane으로 전송한다.
deployment 생성
kubectl create deployment first-app --image=[docker hub id/docker hub image]
scaling 하기
kubectl scale depoyment/[deployment_name] -replicas=[replica_number]
명령으로 replica의 갯수에 대한 설정을 할 수 있다. replica는 똑같이 작동하는 인스턴스의 갯수를 말한다.
deployment의 image 업데이트 하기
deployment의 image를 변경하려면 태그가 변경되어야 kubernetes가 인식하고 이미지를 업데이트 할 수 있다.
만약 같은 태그로 들어오면 image가 변경된 것을 감지하지 못하고 가만히 있는다.
1. 이미지 build
docker build -t summer99summer/kub-first-app:2 .
2. Docker hub에 이미지 push
docker push summer99summer/kub-first-app:2
3. deploy의 image update
deployment/[deployment_name]
의 형식을 사용한다.
kubectl set image deployment/first-app kub-first-app=summer99summer/kub-first-app:2
4. 정상 작동 확인
kubectl rollout status deployment/first-app
rollout으로 현재 deployment에서 진행 중인 상황을 알 수 있다.
4-1. deployment에 실패했다면
여러가지 이유로 deployment에 실패했다면 이전으로 롤백시킬 수 있다.
kubectl rollout undo deployment/first-app
4-2. deployment history 확인
kubectl rollout history deployment/[deployment_name]
kubectl rollout history deployment/[deployment_name] --revision=[number]
kubectl rollout undo deployment/[deployment_name] --to-revision=[number]
history
를 확인하고 --revision
옵션을 이용해 해당 버전의 자세한 정보를 확인할 수 있다. --to-revision
옵션을 이용하면 해당 버전으로 rollout
한다.
Service
pod를 그룹화하고 공유 IP 주소를 제공한다. 이 공유 IP는 고정으로 할당할 수 있다. 따라서 클러스터 외부에서 pod로 접근할 수 있게 된다.
기본적으로 내부 전용이지만 service를 사용하여 IP를 덮어쓸 수 있다.
kubectl expose deployment [deployment_name] --type=[ClusterIP/NodePort/LoadBalancer] --port=[port_number]
명령을 이용해 kubernetes가 service를 생성하고 deployment에 의해 생성된 pod를 노출한다.
CLUSTER-IP
는 클러스터 내부에서 사용할 수 있는 IP이고 EXTERNAL-IP
는 외부 접속이 가능한 IP인데, 이는 Cloud Provider에 연결했을 때 나타난다. 나는 현재 로컬에서 사용 중이기 때문에 EXTERNAL-IP가 따로 나타나지 않는다.
localhost:31963
으로 접속할 수 있다.
삭제