티스토리 뷰

Kubernetes

k8s 기본 구조

파미페럿 2024. 3. 10. 19:20

요즘에는 개발을 하면서 k8s(kubernetes)를 안 쓸 수가 없다.

간단한 k8s 기본 구조와 k8s를 다루는데 쓰이는 기본 kubectl 명령어에 대해 정리 해보자.

 

k8s 기본 구조

k8s 기본 구조를 살펴보면 아래와 같다.

 

ingress

외부에서 들어오는 request 받고 관리한다.

로드밸런서와 같이 트래픽을 분산하는 역할과 ssl/tls 설정을 통해 https 통신을 할 수 있도록 해준다.

 

service

deployment에 실행되고 있는 application을 밖으로 노출시키는 역할을 한다.

내부의 어떤 deployment를 어떤 port로 실행할 것인지 service에 설정한다.

 

deployment(pod)

pod, replicaSet에 대한 관리를 해준다.

여기서 pod란 application이 떠 있는 server를 의미하고 replicaSet은 해당 pod의 수를 유지한다.

replicaSet 설정을 하면 떠 있는 pod를 죽여도 설정한 replicaSet에 맞게 새롭게 pod가 띄워져 설정한 replicaSet 설정대로 pod의 개수를 유지한다.

 

 

k8s yaml 설정

이러한 k8s 기본 구조들은 yaml 파일 작성을 통해 구성할 수 있다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

 

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

 

ingress, service, deployment 설정 파일은 각각 별도의 yaml 파일로 작성할 수도 있고 --- 구분자를 통해 하나의 yaml 파일에 작성할 수도 있다.

 

작성한 파일은 아래 명령어를 통해 적용시킬 수 있다.

여기서 name space는 하나의 k8s 클러스터에 그룹을 여러 개 나눈 거라고 볼 수 있다.

예를 들어 하나의 클러스터에 A 서비스, B 서비스를 운영할 때 둘의 k8s 구성들 구분을 위해 name space를 A, B로 만들어 각각 name space에 k8s를 구성하면 보기도 편하고 아래와 같이 kubectl 명령어 사용시 name space로 구분할 수 있어 관리에도 용이하다.

kubectl apply -f {yaml 파일} -n {name space}

 

각 yaml 파일을 사용할 때 아래와 같이 metadata 영역에 namespace를 명시하면 해당 name space에 설정파일이 적용 된다.

apiVersion: v1
kind: Service
metadata:
  namespace: test
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

 

 

알아두면 좋은 기본 kubectl 명령어

요즘 같은 시대에는 Lens등 k8s를 간편하게 관리하기 좋은 gui 툴들이 많이 있긴 하다.

하지만 여러 이유(유료)로 사용할 수 없거나 하면 직접 kubectl 커맨드를 쳐서 k8s를 관리해야한다.

 

resource 조회

ingress, service, deployment 등 조회는 아래 명령어로 할 수 있다.

kubectl get {resource} -n {name space}

 

예를 들어 아래와 같이 deployment를 조회하면 deployment가 언제 떴는지와 총 replicaSet 중에서 지금 떠 있는 pod는 얼마나 되는지 등 상태를 알 수 있다.

kubectl get deployment -n test
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment-test-api        3/3     1            1           3d

 

name space 또한 -n 옵션 없이 name space 명칭을 입력해서 조회할 수 있다.

kubectl get test-name-space

 

resource 삭제

resource를 삭제하는 것은 간단하다.

아래와 같은 형식으로 명령어를 사용하면 된다.

kubectl delete {resource} -n {name space}

 

 

resource restart

resource를 재시작 하는 방법은 아래와 같다.

여기서 rollout이란 새로운 resource가 뜨고 기존 resource가 죽는 방식처럼 교체하는 방식으로 resource를 restart하는 것을 의미한다.

즉, 기존 resource들을 다 죽이고 restart 하는게 아니어서 기존 서비스에는 영향이 가지 않는다.

kubectl rollout restart {resource} -n {name space}

 

resource label 확인

이 글에 설명은 없지만 resource에는 라벨링을 해서 관리할 수 있다. 이 라벨이 어떤 클라우드에 쓰느냐에 따라 자동으로 붙는 경우도 있다.

라벨은 아래와 같이 조회할 수 있다.

위의 resource 명령어들에서 -n 옵션을 통해 특정 name space에서 조회할 수 있는 것처럼 -L을 써서 특정 라벨이 붙어 있는 resource에 명령을 수행할 수도 있다.

kubectl get {resource} --show-labels -n {name space}

 

 

 

 

✋ kubernetes document

https://kubernetes.io/ko/docs/home/

 

쿠버네티스 문서

쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하기 위한 오픈소스 컨테이너 오케스트레이션 엔진이다. 오픈소스 프로젝트는 Cloud Native Computing Foundation에서 주관한다.

kubernetes.io

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함