GCP를 활용한 Kubernetes 학습을 진행하며 정리하는 글입니다 (Google Cloud Study Jam 참여 중).
Pod
Pod 란?
- 하나 이상의 Container가 포함된 집합을 의미합니다.
- 일반적으로 종속도가 높은 여러 Container가 있을 경우 Container들을 단일 Pod로 패키징합니다.
- Volume 은 Data Disk로서 Pod의 컨테이너에서 사용할 수 있습니다.
- Pod는 Contents에 대한 공유 Namespace 제공합니다.
- Pod에 속한 두 Container가 서로 통신할 수 있으며 연결된 Volume도 공유합니다.
- Pod는 Network Namespace도 공유합니다(Pod마다 IP주소가 하나씩 있습니다.).
- Pod는 하나의 Container(Monolith)로 구성됩니다.
- Pod는 기본적으로 비공개 IP 주소가 할당 됩니다.
Pod 만들기
.yaml 형식의 구성 파일을 통해 Pod를 생성합니다. (파일명 → POD_NAME)
kubectl create -f POD_NAME.yaml
## POD_NAME.yaml 파일구성
apiVersion: v1
kind: Pod
metadata:
name: monolith
labels:
app: monolith
spec:
containers:
- name: monolith
image: kelseyhightower/monolith:1.0.0
args:
- "-http=0.0.0.0:80"
- "-health=0.0.0.0:81"
- "-secret=secret"
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
resources:
limits:
cpu: 0.2
memory: "10Mi"
모든 Pod 조회
kubectl get pods
실행 된 Pod 정보 조회
kubectl describe pods POD_NAME
- Pod의 IP 주소 및 이벤트 로그 등 Pod에 관한 정보를 확인할 수 있어 이슈 해결 시 유용한 명령어입니다.
Ford interaction
Pod는 기본적으로 비공개 IP 주소가 할당 되며 클러스터 외부에 도달할 수 없습니다. 따라서 포트 포워딩을 통해 로컬 포트를 Pod 포트로 매핑하여 사용합니다.
kubectl port-forward POD_NAME LOCAL_PORT:POD_PORT
- LOCAL_PORT 를 POD_PORT 로 포워딩 합니다.
Pod의 Log를 조회하기 위해서 'logs' 명령을 사용합니다.
kubectl logs POD_NAME
kubectl logs -f POD_NAME // 실시간으로 발생하는 로그 확인이 가능합니다.
대화형 쉘 실행도 가능합니다.
kubectl exec POD_NAME --stdin --tty -c POD_NAME /bin/sh
Service
Service 란?
- Pod 집합과 통신하기 위해서 Service를 사용합니다.
- Service는 Pod를 위한 안정적인 EndPoint를 제공합니다.
- Service는 Label을 사용해 Service가 수행될 Pod를 판단합니다.
- Service가 Pod 집합에 제공하는 Access 수준은 현재 3가지 입니다.
- ClusterIP (내부) : 기본 유형으로서 이 Service는 클러스터 내부에서만 볼 수 있습니다.
- NodePort : 클러스터의 각 노드에 외부 엑세스가 가능한 IP를 제공합니다.
- LoadBalancer : Service에서 포함된 노드로 트래픽을 전송하는 클라우드 제공업체의 부하 분산기를 추가합니다.
Service 만들기
.yaml 형식의 Service 구성 파일을 통해 Service를 생성합니다.
kubectl create -f SERVICE_NAME.yaml
## SERVICE_NAME.yaml 파일구성
kind: Service
apiVersion: v1
metadata:
name: "monolith"
spec:
selector:
app: "monolith"
secure: "enabled"
ports:
- protocol: "TCP"
port: 443
targetPort: 443
nodePort: 31000
type: NodePort
- 구성 파일 기준으로 봤을 때
- 'app=monolith' 및 'secure=enabled' Label의 Pod를 자동으로 찾습니다.
- 31000 포트에서 nginx(포트 443)로 외부 트레픽을 전송하기 위해서는 Node 포트를 노출해야 합니다.
Pod에 Label 추가
Label 추가
kubectl label pods POD_NAME 'LABEL_NAME'
kubectl get pods POD_NAME --show-label
Deployment
Deployment 란?
- Production 단계에서 Container를 확장하고 관리하기 위해 사용됩니다.
- Deployment는 실행 중인 Pod의 수가 사용자가 지정한 Pod 개수와 일치하도록 보장해주는 선언적 방법입니다.
- Deployment는 Pod 관리에 대한 하위 수준의 세부 정보를 추상화 해주는 장점이 있습니다.
- Background에서 Deployment는 'ReplicaSet'를 사용해 Pod의 시작과 중지를 관리합니다.
- Pod를 업데이트 및 확장해야 할 경우 Deployment에서 처리해 줍니다.
- Pod가 중단될 경우 Pod를 재시작 처리해 줍니다.
- 마이크로 서비스 별 상호 작용을 할 수 있게 됩니다.
- 독립적으로 확장 및 배포가 가능해집니다.
Deployment 만들기
.yaml 형식의 구성파일을 통해 Deployment 생성 시 Deployment 매니페스트의 데이터를 따르는 Pod가 생성됩니다.
kubectl create -f DEPLOYMENT_NAME.yaml
## DEPLOYMENT_NAME.yaml 파일구성
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: auth
spec:
replicas: 1
template:
metadata:
labels:
app: auth
track: stable
spec:
containers:
- name: auth
image: "kelseyhightower/auth:1.0.0"
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
...
ETC
Secret 이란
Kubernetes에서 Secret은 외부로 노출되면 안되는 민감한 정보들을 저장하는 용도로 사용합니다.
kubectl create secret ...
학습 내용 출처 : https://run.qwiklabs.com/focuses/557?parent=catalog
'삽질의 현장 > - Docker&Kubernetes' 카테고리의 다른 글
[GCP Study Jam] Kubernetes에 MongoDB 설정 (0) | 2019.01.27 |
---|---|
[GCP Study Jam] Kubernetes Helm 소개 (0) | 2019.01.27 |
[GCP Study Jam] Kubernetes Engine으로 배포 관리 (0) | 2019.01.20 |
[GCP Study Jam] Kubernetes 노드 소개 (0) | 2019.01.13 |
[GCP Study Jam] GCP를 활용한 Docker 사용해보기 (0) | 2019.01.13 |