본문 바로가기
도커 & 쿠버/CKA를 취득하자

쿠버강의 hands-on _ 5

by dudung__ 2023. 10. 17.

 

 

 

 

 

 

 

service 

 

애플리케이션 안팎의 다양한 구성 요소간의 통신을 가능하게 함

=> 애플리케이션 - 애플이케이션 / 유저 연결에 도움을 줌 

 

 

 

 

usecase

 

외부에서 웹으로 접근하려고 할때

==> 이 경우는 노드안에서  직접 접근한것 임

=> 이런방식은 좋지 않음

 

 

 

 

 

 

 

node port service

=> 서비스가 노드의 port에 요청이 들어오면 => pod로 요청해줌 

 

=> 이런식으로 동작함 

 

 

 

 

 

 

 

 

클러스터 ip

=> 클러스터 안에 가상의 ip를 만들어서 다양한 서비스간에 통신을 하게 해주는것

 

 

service - node port 

 

 

노드의 port와 pod의 port를 연결해주는 서비스

 

서비스 => 사실상 노드 내부의 가상서버 => 클러스터 내부의 가상 서버 

 

 

 

 

=> 

클러스터 ip / nodeport / 로드밸런서  가 될 수 있음

 

=> 노드 포트를 지정하지 않으면, 할당 범위내에서 자동으로 할당됨

===> ++ 라벨과 selector를 이용해서 service와 pod를 연결

 

 

=> 확인하면 cluster-ip와 지정해준 포트들을 볼 수 있음

 

 

 

 

다중 웹 서버일 경우에도 label을 같게 지정해두면

=> service가 알아서 이것들을 추적해서 연결하기 때문에, 이 부분에 대해서 추가적인 구성이 필요하지는 않음

 

 

 

 

다중 노드 애플리케이션

 

 

=> 다중 노드일 때도 문제없이, 어떠한 cluster ip = 노드 ip를 사용하여 접근하게 되도 노드 안에 있는 애플리케이션에 접근할 수 있도록 해놓음

=>  노드의 개수에 상관없이 서비스는 모든 노드를 아우를 수 있게 생성됨

===> pod의 추가 / 제거에 따라서 자동으로 업데이트됨

===> pod의 개수 자체는 같은 개수로 유지된다고 하더라도, 장애 / 업데이트 등등의 이유로 pod 자체는 계속 변할 수 있음

 

 

 

 

demo

apiVersion: apps/v1

kind: Deployment

metadata:

  name: myapp-deployment

  labels:

    tier: frontend

    app: nginx

    

spec:

  replicas: 6

  selector:

    matchLabels:

      app: myapp

  template:

    metadata:

      name: nginx-2

      labels:

        app: myapp

 

    spec:

      containers:

        - name: nginx

          image: nginx

 

 

선생님의 실습환경이랑 비슷하게 만들어봄

=> 배포파일을 만들어서 배포 

 

 

=> 서비스를 생성

 

 

service = svc

 

=> 내부에서 접근하기위한 클러스터 ip

 

=>이제 노드 ip + 30004 => 접근 가능하게 되는것임

=> 실제 환경이라면(ex - minikube) => 이걸 통해서 

 

minikube service myapp-service --url => url 도출

 

=> 실제 웹 환경(브라우저)으로 가서 저 url로 접근하면 => 노드 내에 있는 서비스에 접근이 가능한것임

 

 

 

 

cluster ip

 

 위에서 간단하게 언급한것 처럼, pod는 계속 교체되고 / 만들어지기 때문에 pod ip에 의존해서 서비스를 할 수 없음

=> 따라서 cluster ip를 사용하는 것임

 

=> 여러 서비스에 접근할 수 있는 하나의 인터페이스를 만들어놓고 => 이쪽으로 접근하면, 무작위의 한 포드에 전달되는 형태 

 

=> 이것도 똑같이 .yaml파일을 사용함

 

type ClusterIP   ==> default 

=> 아무것도 지정해놓지 않으면 자동으로 ClusterIP의 형식으로 만들어짐 

 

 

apiVersion: v1

kind: Service

metadata:

  name: back-end

spec:

  type: ClusterIP

  ports:

    - port: 80

      targetPort: 80

 

  selector:

    app: myapp

    type: back-end

 

 

 

=> 스크립트 => IP는 대문자로 써야함

 

 

 

 

 

 

 

loadbalancer 

apiVersion: v1

kind: Service

metadata:

  name: image-processing

  labels:

    app: myapp

 

spec:

  type: ClusterIP

  ports:

    - targetPort: 80

      nodePort: 8080

  selector:

    tier: backend

 

 

 

deployment.yaml  => 이걸 참고해서 적었어야했음

 

apiVersion: apps/v1

kind: Deployment

metadata:

  name: image-processing-deployment

  labels:

    tier: backend

spec:

  replicas: 4

  template:

    metadata:

      name: image-processing-pod

      labels:

        tier: backend

    spec:

      containers:

        - name: mycustom-image-processing

          image: someorg/mycustom-image-processing

  selector:

    matchLabels:

      tier: backend

 

 

=> 쭉~~ 작성하는 부분에서 처음 작성한것

 

 

 

 

apiVersion: v1

kind: Service

metadata:

  name: image-processing

  labels:

    app: myapp

spec:

  # type: ClusterIP

  ports:

    - port: 80

      targetPort: 8080

  selector:

    tier: backend

 

 

=> 이해를 잘 못했네 => image-processing이 이름이고 이 컨테이너에서 열려있는 포트면 당연히 서비스에 붙어있는 포트를 말한건데 => 이건 targetport이고 

 

=> 그래도 그것만 틀렸네

 

 

 

 

 

 

hands-on

 

controlplane ~   k get svc

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE

kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   7m9s

 

=> 처음들어갔을 때 있는 서비스는 기본적으로 쿠버에서 실행시킨 서비스임 

 

 

 

 

=> 이미지도 이걸로 볼 수 있고 

==> 생각보다 k get  ~     -o wide로 얻을 수 있는 정보가 많았음 => 종류에 따라서 나오는 정보도 다름 => 잘 골라서 사용하면 될듯함

 

 

=> 관련 사용법에 대해서는 여러 블로그에서 찾아볼 수 있듯이 공식 문서에서 찾아보는 습관을 길러야함 => 북마크쓰는것도 익숙해지고 

 

 

 

 

 

 

microservice application

 

 

redis => inmemory db

mariadb => 영구적

 

간단한 앱의 데이터 흐름

 

 

이걸 이제 도커에서 돌려볼 것임 

 

 

=> db단을 설정해주고 

 

 

=> 애플리케이션과 작업 노드를 설정 

==> 아직 앱과, db, 등등을 서로 연결해주지 않았기 때문에, 제대로된 접근을 할 수가 없음

 

vote-app => redis쓰라고 말하지 않았고

result-app => db쓰라고 말하지 않았음

 

--links => cli option => 컨테이너에 함께 링크하는데 사용됨

 

 

 

 

 

vote-app => 지금 만든 redis를 사용할꺼라고 지정

result-app => 지금 만든 db를 사용해줄꺼라고 지정

 

=> 작업 노드에는 두개를 다 지정해 주었음

 

=> 이런 방식이 나중에는 지원되지 않을 수 있음

=> docker swarm과 네트워킹을 통해서 더 나은 결과물을 도출할 수 있기 때문에 

 

===>  // 도커로 만드는법

 

 

쿠버에 배포하는 법 

 

=> 우선 쿠버에 올리기 전에 어떤 목표를 가지고 배포할 것인가를 먼저 정해야함

 

 

 

  1. 각 서비스를 pod에 배포

 

 

 

 

2. 각 서비스를 연결 

=> 어떤 프로그램  / 어떤 서비스 /  어떤 액세스를 요구하는지를 확실히 명시 / 가지고 있어야함

 

 

 

-> 작업노드로 들어가는 접근이 없기 때문에, 관련 권한을 줄 필요가 없음

==> 관련 서비스가 없음(타인에게 노출되어야할때만 필요함)

=> 타인이 액세스 가능해야할 경우에

 

 

-> 각 정보를 저장하는 redis / db는 작업노드와 각자의 앱에서 접근을 해야함

 

 

 

==> 그럼 앱이 db에 어떻게 접근을 해야할까 ?

==> db의 pod ip?  => pod의 ip가 언제 바뀔줄도 모르고 / 해당 pod가 언제 다른 pod로 바뀔지도 모름 => 이런 방법은 안됨

 

===> service를 이용한 방법이 좋음(db가 들어있는 pod로 직접 접근하지 않기 때문에)

 

 

 

=> 서비스를 이용해서 클러스터 내에서 어디서든 접근이 가능하게 만들어주고 

 

 

 

=> 외부에서의 접근이 가능하게 만들어줬음 

 

 

 

 

=> 각각 파드가 이렇게 지정될 것임

 

demo

 

관련 파일들을 쭉 따라 만들어봤음 -> 아직 환경이 구축되어있지 않아서 이걸 그대로 할 수는 없지만, 나중에 미니쿠베라도 환경설정이 끝나면 한번 실행해봐야겠다 

 

 

postgres-pod.yaml

 

apiVersion: v1

kind: Pod

metadata:

  name: postgres-pod

  labels:

    name: postgres-pod

    app: demo-voting-app

spec:

  containers:

    - name: postgres

      image: postgres

      ports:

        - containerPort: 5432

      env:

        - name: POSTGRES_USER

          value: "postgres"

        - name:  POSTGRES_PASSWORD

          value: "postgres"

  

==> 

기초 과정이라 자격증명을 하드코딩했지만(코드에 담에서 배포) 원래대로라면 이렇게 하면 안됨 => 보안상으로 좋지 않기 때문에

-> aws같은 경우로  생각하면 secret manager나 parameter store를 이용해야함 

 

 

 

 

 

 

 

 

 

'도커 & 쿠버 > CKA를 취득하자' 카테고리의 다른 글

쿠버강의 with practice tests_1  (0) 2023.10.20
쿠버강의 hands-on _ 6  (0) 2023.10.18
쿠버강의 hands-on _ 4  (0) 2023.10.16
쿠버강의 hands-on _ 3  (0) 2023.10.13
쿠버강의 hands-on _ 2  (0) 2023.10.12