Run The Bridge

k8s 1일차 본문

Cloud/k8s

k8s 1일차

anfrhrl5555 2021. 8. 5. 13:20
728x90

0. kubernetes 설치하기

컨테이너 오케스트레이션

  • 컨테이너 자동 배치 및 복제
  • 컨테이너 그룹에 대한 로드 밸런싱
  • 컨테이너 장애 복구
  • 클러스터 외부에 서비스 노출
  • 컨테이너 추가 또는 제거로 확장 및 축소
  • 컨테이너 서비스간의 인터페이스를 통한 연결 및 네트워크 포트 노출 제어

 

새로운 vmware 3대를 준비해준다.(2core, 4GB RAM, 40~50GB HDD)

 

1. k8s_manager

2. k8s_worker01

3. k8s_worker02

 

 


1. kubernetes 시작하기

여러 개의 컴포넌트로 구성

  • API서버, 컨트롤 매니저, 스케줄러, DNS, 네트워크 플러그인
  • kubelet : 모든 노드에서 실행되어 컨테이너의 생성, 삭제 등 마스터와 워커 노드 간의 통신 역할
  • 도커 : 쿠버네티스는 토커를 이용하여 이미지를 컨테이너화 한다(OCI, CRI)

왼쪽이 control부, 오른쪽이 data부로 나누어진다.

 

다음 명령을 통해 Container를 볼 수 있다.

kubectl get pod -A

kube- : k8s에서 핵심적인 역할을 맡는다.

etcd-kube-master1(etcd): k8s에 대한 모든 정보를 저장하고 있다.

coredns-: k8s 내부에서 컨테이너끼리의 통신에 사용하는 DNS

calico-: k8s만 설치하면 컨테이너끼리 통신을 할 수 없다. 컨테이너의 네트워크 인터페이스라고 하는 것이 별도로 설치해야 한다 그래서 calico 라는 네트워크 인터페이스를 사용한다.

 

포드: 컨테이너를 다루는 기본 단위

  • 포드는 쿠버네티스에서 애플리케이션의 기본 단위
  • 1개 이상의 컨테이너로 구성된 컨테이너의 집합
  • 도커 스웜 모드에서 서비스와 유사

READY에서 상태가 서로 똑같이 마춰져있어야 한다. ex) 1/1, 2/2

 

(실습) 포드 사용하기

# vi nginx-pod.yaml

apiVersion: v1  # pod에 맞는 api버전이 존재한다.
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

 

0. RUN 하는 방법

kubectl [create || apply] -f nginx-pod.yaml

kubectl get pods  # docker run과 동일하다

 

1. 상세설명

kubectl get pod -o wide

 

2. describe 사용법

kubectl describe pod my-nginx-pod

 

3. 한 개의 컨테이너에 해당 pod로 접속하는 방법

kubectl exec -it my-nginx-pod bash

 

4. pod에 접속하지 않고 명령하는 방법(하이픈 2개를 써주고 명령을 쓴다. 없는 명령은 되지 않는다)

kubectl exec -it my-nginx-pod -- ls -l

 

5. k8s에서 로그 보는 방법(-f 옵션 존재)

 kubectl logs my-nginx-pod

 

6. pod 삭제하는 방법

kubectl delete -f nginx-pod.yaml

kubectl delete [NAME]

 

(실습) 컨테이너가 두 개인 Pod

 

cp nginx-pod.yaml nginx-pod-with-ubuntu.yaml
--------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

  - name: ubuntu-sidecar-container
    image: alicek106/rr-test:curl
    command: ["tail"]
    args: ["-f", "/dev/null"]
--------------------------------------------------
kubectl apply -f nginx-pod-with-ubuntu.yaml

 

7. 컨테이너가 2개 이상일 때 bash 접근 방법

kubectl exec -it my-nginx-pod -c ubuntu-sidecar-container -- bash

※ pod는 k8s가 만든 가상의 컨테이너, 즉 개념적으로만 존재한다 → 실제로는 컨테이너에 붙는다

※ -c: connection 으로 추정

 

컨테이너도 개별 IP를 가지고, Pod도 IP를 가진다 또 컨테이너는 Pod 전체에 네트워크에 속한다 그러므로 하나의 Pod에 속한 컨테이너는 localhost로 통신이 가능하다.

 

레플리카셋(ReplicaSet): 일정 개수의 포드를 유지하는 컨트롤러

YAML에 포드만 정의해서 사용할 경우

  • 포드 삭제 시 포드는 영원히 사라진다 -> 포드를 사용자가 계속 관리해야 한다는 문제점…
  • 포드 1개로는 서비스가 어려워 여러 개로 늘려야 하는 경우 -> 사용자가 포드를 늘려줘야

레플리카셋 컨트롤러는

  • 정해진 수의 동일한 포드가 항상 실행되도록 관리
  • 노드 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성
    → 안정적인 서버 다중화를 위한 방법

 

(실습) ReplicaSet 사용하기

# vi replicaset-nginx.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx-pods-label
  template:
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx-pods-label
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

 

 

 

 

 

 

 

 

728x90
Comments