티스토리 뷰
요즘에는 개발을 하면서 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/
'Kubernetes' 카테고리의 다른 글
deployment livenessProbe, readinessProbe (0) | 2024.02.23 |
---|---|
mac Docker 설치하고 예제 앱 이미지 올리고 실행시켜보기 (0) | 2022.04.20 |
- Total
- Today
- Yesterday
- 역직렬화
- 스프링부트
- 데이터베이스
- k8s
- DB
- 자바
- enum
- 메시지큐
- Caching
- 어노테이션
- rabbitmq
- Java
- annotation
- 이클립스
- 공간데이터
- ssh
- MAC
- Intellij
- DATABASE
- 캐싱
- mockito
- HttpClient
- Spring
- springboot
- cache
- postgres
- eclipse
- 캐시
- JPA
- PostgreSQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |