본문 바로가기
k8s

k8s #1 hello world

by PudgeKim 2021. 11. 22.

이번 포스팅은 미니큐브를 이용하여 쿠버네티스의 hello world를 작성해보는 것입니다.

우선 실습을 위해서 미니큐브를 설치해야합니다. 미니큐브란 로컬에서 쿠버네티스를 실행하게 해주는 도구입니다.

제 환경은 M1 맥북이고 따로 VM은 설치하지 않았고 도커를 이용하여 미니큐브 실행 환경을 만들었습니다.

저와 같이 M1 맥북이신분은 아래 링크를 참고하시면 됩니다.

https://medium.com/@seohee.sophie.kwon/how-to-run-a-minikube-on-apple-silicon-m1-8373c248d669

 

How to run a Minikube on Apple Silicon M1

Recently I had a chance studying k8s on my end. To setup the k8s, ideally plural instances are necessary; one would be the master (Control…

medium.com

 

설치가 다 완료되었다면 hello world를 위한 yaml 파일을 작성해야합니다.

 

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Pod
metadata:
  name: webapp
spec:
  containers:
    - name: webapp
      image: <nginx hello world>
cs

위 같은 형식으로 작성해주면 되는데 image 부분에 <nginx hello world>는 똑같이 적으란 뜻이 아니고
nginx나 apache 등의 웹서버 hello world 예제의 image를 dockerhub에서 찾으셔서 적어주시면 됩니다.
(또는 도커 이미지를 직접 만드시거나)

 

1
kubectl apply -f <작성한파일이름>.yaml
cs

yaml 파일 작성이 완료되었다면 저장 후에 위와 같은 명령어를 실행하면 pod .. created가 나오면 성공입니다.

kubectl get all 명령어로 한번 더 확인해보셔도 됩니다.

 

hello world를 보기전에 간단한 쿠버네티스 명령어를 알아봅시다.

 

1
kubectl exec <pod이름> -- ls
cs

위 코드에서 pod이름이란 yaml 파일에서 containers 부분의 name에 해당하는 것입니다.

--는 명령어를 실행하기 전 구분자이고 ls는 우리가 cmd창에서 많이 쓰는 명령어 중에 하나인 바로 그 ls입니다.

즉, 방금 만든 pod으로 들어가서 ls 명령어를 실행하는 코드입니다. (도커와 유사합니다.)

 

1
kubectl -it exec <pod이름> -- sh
cs

도커와 마찬가지로 it 옵션을 통해 pod에 들어갈 수도 있습니다.

 

여기까지 진행한 내용을 그림으로 나타내면 아래와 같습니다.

 

hello-world 도커 컨테이너는 Pod안에 있습니다.

쿠버네티스에서의 Pod이란 하나의 Pod안에 1개 이상의 컨테이너가 들어갈 수 있으며 같은 Pod안에 있는 컨테이너들은 한번에 종료하거나 재실행시키거나 자원을 나눠주는 등의 여러가지 기능을 할 수 있습니다.

그렇게 생긴 여러개의 Pod은 그림처럼 하나의 Cluster로 묶입니다.

 

도커와 마찬가지로 포트를 열어주고 연결시켜주어야 localhost:8080 이러한 주소로 접근했을 때 hello world를 볼 수가 있습니다.

쿠버네티스에서는 이러한 역할을 service를 이용해서 하게 됩니다.

 

위 그림 같이 service를 통해 밖에서 안의 pod으로 통신할 수 있습니다.

** service를 이용해서 외부에서 내부 pod을 접근 가능하다고 항상 service는 외부에서 접근 가능하단 뜻은 아닙니다.
(type을 ClusterIP로 줄 경우에는 해당 service를 외부에서 접근할 수 없습니다.)

이제 service를 위한 yaml파일을 만들어보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
  name: my-webapp
 
spec:
  selector:
    app: webapp
 
  ports:
    - name: http
      port: 80
      nodePort: 30080
      targetPort: 80
 
  type: NodePort
cs

Service를 만드는 것이므로 kind 부분에 Service를 적어줍니다.

metadata/name 부분은 나중에 service간의 통신을 이용할 때 사용되는 이름이기 때문에 이름을 막 지으시면 안됩니다.
(지금은 service간 통신을 안하므로 상관이 없긴 합니다.)

port는 이 service 컨테이너의 port를 뜻하고,
nodePort는 외부에서 이 service 컨테이너를 접근할 때 어떤 port로 접근할 것인지를 나타냅니다.
** 이 값은 30000 이상이어야합니다.
** 만약 다른 service/pod과 연결을 하고 해당 service/pod과의 연결은 외부에 공개하고 싶지 않으면 nodePort 부분을 생략하면 됩니다.

type 부분은 실제 production에서는 LoadBalancer를 사용하게되지만 지금은 로컬에서 테스트해보는 것이므로 NodePort를 사용합니다.

 

여기서 끝이 아니고 우리가 처음 작성했던 hello-world를 위한 yaml파일에 label을 추가해주어야합니다.

현재 service 컨테이너의 selector 부분을 보면 app: webapp이라고 되있습니다.

1
2
3
4
metadata:
  name: webapp
  labels:
    app: webapp
cs

hello-world yaml파일에도 위처럼 labels 부분을 추가해줍니다.

** labels는 key:value만 만족하면 됩니다. 즉, 꼭 key가 app일 필요는 없습니다.
만약 여기서 key를 app이 아닌 다른 것으로 하고싶다면 service 컨테이너의 yaml파일에서도 바꿔주어야 합니다.

 

1
kubectl apply -f <fileName.yaml>
cs

작성이 완료됬으면 위 명령어로 처음 작성한 컨테이너와 service 컨테이너 모두 적용시켜줍니다.

 

그리고 현재 도커 환경이기 때문에 minikube ip 명령어가 아닌
minikube service <service컨테이너의 metadata/name>
명령어를 실행했을 때 나오는 url로 들어가면 정상 실행되는 것을 확인할 수 있습니다.

'k8s' 카테고리의 다른 글

k8s #5 networking&namespace  (0) 2021.11.24
k8s #4 Deployment&Rollout  (0) 2021.11.23
k8s #3 ReplicaSets  (0) 2021.11.22
k8s #2 무중단 배포 기초  (0) 2021.11.22