728x90
POD
포드
- 컨테이너의 공동 배포된 그룹이며 쿠버네티스의 기본 빌딩 블록을 대표
- 쿠버네티스는 컨테이너를 개별적으로 배포하지 않고 컨테이너의 포드를 항상 배포하고 운영
- 일반적으로 포드는 단일 컨테이너만 포함하지만 다수의 컨테이너를 포함 할 수 있음
- 포드는 다수의 노드에 생성되지 않고 단일 노드에서만 실행
- 여러 프로세스를 실행하기 위해서는 컨테이너 당 단일 프로세스가 적합
- 다수의 프로세스를 제어하려면 -> 다수의 컨테이너를 다룰 수 있는 그룹이 필요
포드의 관리
- 두 가지 장점
- 포드는 밀접하게 연관된 프로세스를 함께 실행하고 마치 하나의 환경에서 동작하는 것처럼 보임
- 그러나 동일한 환경을 제공하면서 다소 격리된 상태로 유지
동일한 포드의 컨테이너 사이의 부분 격리
- 포드의 모든 컨테이너는 동일한 네트워크 및 UTS 네임스페이스에서 실행
- 같은 호스트 이름 및 네트워크 인터페이스를 공유 포트 충돌 가능성 있음
- 포드의 모든 컨테이너는 동일한 IPC 네임스페이스 아래에서 실행되며 IPC 를 통해 통신 가능
- 최신 쿠버네티스 및 도커 버전에서는 동일한 PID 네임스페이스를 공유할 수 있지만 이 기능은 기본적으로 활성화돼 있지 않다
플랫 인터 포드 네트워크 구조
- 쿠버네티스 클러스터의 모든 포드는 공유된 단일 플랫, 네트워크 주소 공간에 위치
- 포드 사이에는 NAT 게이트웨이가 존재 하지 않음
컨테이너를 포드 전체에 적절하게 구성하는 방법
- 다수의 포드로 멀티티어 애플리케이션 분할하기
- 각각 스케일링이 가능한 포드로 분할하기
YAML 로 포드 디스크립터 만들기
- kubectl 실행 명령으로 간단한 리소스 작성 방법도 가능하지만 일부 항목에 대해서만 가능하며 저장이
용의하지 않음 - 모든 쿠버네티스 객체를 YAML 로 정의하면 버전 제어 시스템에 저장 가능
- 모든 API에 대한 내용은 http://kubernetes.io/docs/reference/ 참고
포드 정의
- apiVersion kind 메타 데이터 스펙 스테이터스 로 구성
- 포드 정의 구성 요소
- apiVersion 쿠버네티스 api 의 버전을 가리킴
- kind 어떤 리소스 유형인지 결정 포드 레플리카컨트롤러 서비스 등
- 메타데이터 포드와 관련된 이름 네임스페이스 레이블 그 밖의 정보 존재
- 스펙 컨테이너 볼륨 등의 정보
- 상태 포드의 상태 각 컨테이너의 설명 및 상태 포드 내부의 IP 및 그 밖의 기본 정보 등
포드에서 YAML 파일 불러오기
$ kubectl get pod http-go -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2019-06-18T08:23:04Z"
generateName: http-go-
labels:
run: http-go
name: http-go-jvsg4
namespace: default
ownerReferences:
- apiVersion: v1
blockOwnerDeletion: true
controller: true
kind: ReplicationController
name: http-go
uid: 40b167be-91a2-11e9-8c69-0800278e464d
resourceVersion: "8777"
selfLink: /api/v1/namespaces/default/pods/http-go-jvsg4
uid: 4b85d848-91a2-11e9-8c69-0800278e464d
포드에서 YAML 파일 불러오기
# 포드의 상세 스펙(포드 컨테이너의 목록, 볼륨, 그 밖의 것들)
spec:
containers:
- image: gasbugs/http-go
imagePullPolicy: Always
name: http-go
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-mts8j
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: slave2-virtualbox
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
[중략]
# 포드의 컨테이너의 상세 상태
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2019-06-18T08:23:07Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2019-06-18T08:23:33Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2019-06-18T08:23:33Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2019-06-18T08:23:04Z"
status: "True"
type: PodScheduled
[중략]
디스크립터 작성하기
- 간단히 다음과 같이 디스크립터 생성 (http-go-pod.yaml)
# 이 디스크립터는 쿠버네티스 API v1를 사용
apiVersion: v1
# 리소스 포드에 대한 설명
kind: Pod
metadata:
# 포드의 이름
name: http-go
spec:
containers:
# 생성할 컨테이너의 컨테이너 이미지
- image: gasbugs/http-go
name: http-go
ports:
# 응답 대기할 애플리케이션 포트
- containerPort: 8080
protocol: TCP
kubectl에 디스크립터 작성 요령 확인 가능
$ kubectl explain pods
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of created by clients and
containers that can run on a host. This resource is scheduled onto hosts.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
디스크립터를 사용해 포드 생성
- kubectl create -f <파일명>
$ kubectl create -f http-go-pod.yaml
pod/ http-go created
pod 확인
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go 0/1 ContainerCreating 0 11s
보다 정확한 정보 확인시 -o wide
옵션추가
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
http-go 1/1 Running 0 3m34s 10.32.0.3 work1 <none> <none>
관찰 모드 변경되면 내용이 갱신된다
$ kubectl get pod -w
yaml
이나 json
의 형태로도 볼 수 있음yaml
로 보기
$ kubectl get pod -o yaml
json
으로 보기
$ kubectl get pod -o json
진행상황 확인
$ kubectl describe pod http-go
kubectl log로 포드의 로그 가져오기
- kubectl logs http-go
컨테이너에서 호스트로 포트 포워딩
- 디버깅 혹은 다른 이유로 서비스를 거치지 않고 특정 포드와 통신하고 싶을 때 사용
- kubectl port-forward 명령으로 수행
- 컨테이너 8888 포트를 pod의 8080 포트로 전달
$ kubectl port-forward http-go 8080:8080
Forwarding from 127.0.0.1:8888 -> 8080
^Z
[1]+ Stopped kubectl port-forward http-go 8888:8080
$ bg
[1]+ kubectl port-forward http-go 8888:8080 &
$ curl 127.0.0.1:8888
Handling connection for 8888
Welcome! http-go
※ 팁: 포트포워딩 종료는 프로세스 강제 kill로 수행한다
포드에 주석 추가하기
- 각 포드나 API 객체 설명이 추가
- 클러스터를 사용하는 모든 사람이 각 객체의 정보를 빠르게 확인 가능
- 예를 들어 객체를 만든 사람의 이름을 지정
- 공동 작업 가능
- 총 256KB까지 포함 가능
$ kubectl annotate pod http-go key="test1234"
pod/http-go annotated
$ kubectl get pod http-go -o yaml
포드 삭제
만든 포드 조회
$ kubectl get pod NAME READY STATUS RESTARTS AGE http-go 1/1 Running 0 7h12m
포드 삭제
- kubectl delete pod <포드 이름>
전체 포드 삭제
- kubectl delete pod --all
연습문제
모든 리소스 삭제
kubectl delete pod --all
YAML을 사용하여 도커이미지 jenkins로 Jenkins-manual 포드를 생성하기
jenkins-manual-pod.yaml
파일 생성apiVersion: v1 kind: Pod metadata: name: jenkins-manual spec: containers: - name: jenkins image: jenkins ports: - containerPort: 9080
Jenkins 포드에서 curl 명령어로 로컬호스트:8080 접속하기
kubectl exec jenkins-manual -- curl 127.0.0.1:8080 -s
Jenkins 포트를 8888로 포트포워딩하기
kubectl port-forward jenkins-manual 8888:8080
kubectl logs jenkins-manual
현재 Jenkins-manual의 설정을 yaml로 출력하기
kubectl get pod jenkins-manual -o yaml
728x90
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-레이블을 이용한 포드 구성 (0) | 2020.11.27 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-라이브니스, 레디네스, 스타트업 프로브 구성 (0) | 2020.11.27 |
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-etcd 데이터베이스 살펴보기 (0) | 2020.09.20 |
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-Kube 시스템 컴포넌트 (0) | 2020.09.20 |
[데브옵스를 위한 쿠버네티스 마스터] minikube 소개 및 활용 (0) | 2020.09.13 |
댓글