[k8s] kubernetes(쿠버네티스) cluster에 nginx 설치하기

반응형
반응형

 

 

 

실습 환경

k8s-master-1
CentOS 7.8
IP : 192.168.56.102

k8s-master-2
CentOS 7.8
IP : 192.168.56.106

k8s-worker-1
CentOS 7.8
IP : 192.168.56.107

k8s-worker-2
CentOS 7.8
IP : 192.168.56.108

 

kubernetes cluster 구성은 아래 글을 참고해 주세요.

https://sh-safer.tistory.com/45

 

[k8s] kubespray로 kubernetes(쿠버네티스) 설치하기

실습 환경 k8s-master-1 CentOS 7.8 IP : 192.168.56.102 k8s-master-2 CentOS 7.8 IP : 192.168.56.106 k8s-worker-1 CentOS 7.8 IP : 192.168.56.107 k8s-worker-2 CentOS 7.8 IP : 192.168.56.108 Python3 설..

sh-safer.tistory.com


 

kubernetes cluster의 node 확인

쿠버네테스 클러스터가 마스터 노드 2개 워커 노드 2개로 이루어져 있는 상태입니다.

[root@k8s-master-1 kubespray]# kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
k8s-master-1   Ready    master   61m   v1.18.5
k8s-master-2   Ready    master   60m   v1.18.5
k8s-worker-1   Ready    worker   58m   v1.18.5
k8s-worker-2   Ready    worker   58m   v1.18.5

 

Deployment 생성 및 확인

쿠버네티스에 어플리케이션 배포를 위해 deployment object를 사용합니다.

아래 코드를 nginx-deployment.yml 이름으로 생성합니다. 

apiVersion: apps/v1           # 쿠버네티스 api 버전
kind: Deployment              # 생성할 오브젝트 종류
metadata:                
  name: nginx-deployment      # deployment의 이름
  labels:
    app: nginx                # label 지정
spec:                         # deployment의 스펙을 정의
  replicas: 3                 # 3개의 pod 설정
  selector:                   # deployment가 관리할 pod를 찾는 방법을 정의
    matchLabels:     
      app: nginx
  template:
    metadata:
      labels:                 # pod의 label
        app: nginx
    spec:
      containers:             # 컨테이너 설정
      - name: nginx          
        image: nginx:1.14.2
        ports:
        - containerPort: 80

 

kubectl apply로 deployment 오브젝트를 생성합니다.

[root@k8s-master-1 task]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

 

nginx-deployment를 확인해보면 pod 3개가 모두 실행 중인 것을 확인할 수 있습니다,

[root@k8s-master-1 task]# kubectl get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           50s

 

이번엔 pod를 조회해 보겠습니다.  3개 모두 정상적으로 Running 상태네요

[root@k8s-master-1 task]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6b474476c4-5282f   1/1     Running   0          2m4s
nginx-deployment-6b474476c4-hxwms   1/1     Running   0          2m4s
nginx-deployment-6b474476c4-kgkv4   1/1     Running   0          2m4s

 

좀 더 상세히 확인해보면, 3개의 pod은 모두 k8s-worker-2 node에 올라가 있고 각각의 ip는 아래와 같습니다. 

[root@k8s-master-1 task]# kubectl get pod -o yaml | grep worker
    nodeName: k8s-worker-2
    nodeName: k8s-worker-2
    nodeName: k8s-worker-2

 

[root@k8s-master-1 task]# kubectl get pod -o yaml | grep " podIP: "
    podIP: 10.233.88.5
    podIP: 10.233.88.6
    podIP: 10.233.88.7

 

 

현재 구성도는 아래와 같겠네요. 

 

pod IP로 접속하면 정상적으로 nginx 디폴트 페이지가 뜨는 것을 확인할 수 있습니다.

하지만 pod는 언제든 죽고 다시 살아날 수 있는 오브젝트이기 때문에 그때마다 ip가 변경되어 해당 IP로는 서비스 용도로는 사용을 할 수 없습니다.

[root@k8s-master-1 task]# curl 10.233.88.5 | grep title
<title>Welcome to nginx!</title>
[root@k8s-master-1 task]# curl 10.233.88.6 | grep title
<title>Welcome to nginx!</title>
[root@k8s-master-1 task]# curl 10.233.88.7 | grep title
<title>Welcome to nginx!</title>

 

Service 생성 및 확인

생성한 deployment 오브젝트를 서비스 할 수 있도록 service 오브젝트를 생성합니다.

yaml 파일을 생성하여 아래 내용을 입력합니다.

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  type: NodePort     # 서비스 타입
  ports:
  - port: 8080       # 서비스 포트
    targetPort: 80   # 타켓, 즉 pod의 포트
    protocol: TCP
    name: http
  selector:
    app: nginx

 

kubectl apply로 service 오브젝트를 생성합니다.

[root@k8s-master-1 task]# kubectl apply -f nginx-svc.yaml
service/my-nginx created

 

서비스 확인

cluster ip를 통해 클러스터 내부에서 서비스에 접속할 수 있습니다.

[root@k8s-master-1 task]# kubectl get svc | grep my-nginx
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
my-nginx     NodePort    10.233.5.210   <none>        8080:32382/TCP   17s

 

NodePort는 Node의 임의의 Port 또는 지정된 Port를 통하여 외부에서 서비스에 접근이 가능합니다.

즉, 모든 호스트의(k8s-*) 32382 포트를 통해 서비스에 접근이 가능하다는 것입니다.

 

 

 

 

 

 

 

 

반응형

댓글

Designed by JB FACTORY

loading