ref: 시작하세요 도커/쿠버네티스
kubectl api-resources
그러나 이 오브젝트를 다 알 필요는 없음, 필요할 때마다 검색 ~!!
kubectl explain pod
쿠버에서 yml 파일의 용도는 컨테이너뿐만 아니라 거의 모든 리소스 오브젝트에 사용될 수 있다는 것
따라서 쿠버를 잘 사용하는 방법은 yaml 파일을 잘 작성하는 것
노드의 역할을 크게 마스터와 워커로 나뉘어져 있고, 마스터 노드는 관리자, 워커 노드에는 애플리케이션 컨테이너임
도커 스웜 모드는 단일 도커 데몬만을 설치해 사용하지만, 쿠버는 도커를 포함한 많은 컴포넌트들이 실행됨.
또한 이런 컴포넌트들은 기본적으로 도커 컨테이너로서 실행되고 있음.
마스터 노드에 SSH로 접속해 docker ps 명령어를 실행해보면 많은 컨테이너가 실행되고 있는 것을 확인할 수 있음.
그리고 쿠버의 클러스터 구성을 위해 kubelet이라는 에이전트가 모든 노드에서 실행됨.
쿠버의 입장에서 보면 도커 데몬 또한 하나의 컴포넌트 - 쿠버네티스는 도커에 내장된 기능이 아니기 때문.
오히려 컨테이너를 사용하기 위해 쿠버네티스가 도커를 이용하는 방식이므로 쿠버네티스에서 반드시 도커를 사용해야 하는 것은 아니며, OCI(Open Container Initiative)라는 컨테이너의 런타임 표준을 구현한 CRI(Container Runtime Interface)를 갖추고 있다면 어떠한 컨테이너를 써도 문제는 없음.
쿠버 내에 있는 다양한 리소스 중에서 반드시 알아야 할 몇 가지의 오브젝트
포드(pod)
저는 팟이라고 합니다....혼용 주의
레플리카 셋(replica set)
서비스 (service)
배포 (deployment)
도커 엔진의 기본 단위 = 도커
쿠버네티스는 컨테이너 애플리케이션을 배포하기 위한 기본 단위로 pod을 사용
한개의 pod에는 1개의 container만이 존재할 수도 있고, 여러 개가 있을 수도 있음.
간단한 예시로, nginx 웹 서비스를 쿠버네티스에서 생성하려면 컨테이너와 팟을 어떻게 사용할 수 있을까? 가장 쉬운 방법은 팟 1개에 nginx 컨테이너 1개만을 포함해 생성하는 것이고, 만약 동일한 nginx 컨테이너를 여러 개 생성하고 싶다면 1개의 nginx 컨테이너가 들어 있는 동일한 팟을 여러개 생성하면 된다.
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
kubectl apply -f nginx-pod.yaml
성공!
kubectl get <오브젝트>
이 nginx 팟을 생성할 때, yml 파일에 사용할 포트(containerPort)를 정의하긴 했지만, 아직 외부에서 접근할 수 있도록 노출된 상태는 아님!
따라서 팟의 nginx 서버로 요청을 보내려면 팟 컨테이너의 내부 IP로 접근해야 함.
kubectl describe pods [팟 이름]
위의 명령어를 사용하면 생성된 리소스의 자세한 정보를 얻어올 수 있음.
팟의 내부 IP는 192.168.1.2 인 것을 확인할 수 있음.
그러나 이건 외부에서 접근할 수 있는 IP가 아니기 때문에 클러스터 내부에서만 접근 가능.
docker run 에서 -p 옵션을 안한 거랑 비슷함
쿠버네티스 외부 또는 내부에서 팟에 접근하려면 서비스(service)라고 하는 쿠버네티스 오브젝트를 따로 생성해야 하지만, 지금은 서비스 오브젝트 없이 IP만으로 nginx 팟에 접근할 것.
클러스터의 노드 중 하나로 접속한 뒤 nginx 팟의 IP로 HTTP 요청을 전송, 이로써 nginx 팟이 정상적으로 활동중인지 체크할 수 있다.
worker 노드에서 확인했을 때 잘 실행중인 것을 볼 수 있음.
docker exec 명령어와 비슷하게 kubectl exec 명령어 실행 가능
kubectl exec -it my-nginx-pod bash
다음과 같이 my-nginx-pod에서 배시 셀을 실행하되, -it 옵션으로 셀 유지 가능
kubectl logs my-nginx-pod
docker logs 처럼 kubectl logs 를 사용할 수 있음.
# kubectl delete -f nginx-pod.yaml
# kubectl delete pod [팟 이름]
위의 코드는 nginx-pod.yaml에 정의된 nginx 팟을 삭제하는 코드임.