반응형

VPC(Virtual Private Cloud)는 퍼블릭 클라우드 환경에서 사용할 수 있는 고객 전용 사설 네트워크입니다. 다른 네트워크와 논리적으로 분리되어 있어 IT 인프라를 안전하게 구축하고 간편하게 관리할 수 있습니다. 또한 기존의 데이터 센터 네트워크와 유사하게 구현할 수 있습니다.

-공식 홈페이지

https://guide.ncloud-docs.com/docs/networking-vpc-vpcoverview

가상의 사설망을 구성해 VPC외 다른 네트워크와 상호 간섭이 발생하지 않게 논리적으로 분리된 네트워크를 사용할 수 있다.

클라우드상에서 논리적으로 격리된 고객 전용 네트워크 공간 -> 나만의 클라우드 네트워크 만들 수 있다.

한국 리전만 가능, 계정단 최대 3개의 VPC 생성 가능

10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 중에서 IP 주소 범위 선택 가능

최소 /28에서 최대 /16까지 netmask 생성가능

Subnet을 이용해 VPC 안에서 Segment 생성 관리 가능

Segment? -> 물리적으로 제한되는 네트워크 구분 단위

VPC > Subnet 

Peering : VPC간 연결을 위한 네트웍 구성

ACG & NACL

ACG : 서버 단위(NIC 단위)로 적용되는 보안, Allow 규칙에 한하여 지원, Statefull - Response 트래픽 자동 허용, 모든 규칙 확인 판단.

NACL : Subnet 단위로 적용되는 보안, Allow, Deny 규칙 지원,  Stateless - Response 트래픽 Allow 규칙 필요, 우선순위에 따라 규칙을 반영

Subnet

특정 대역을 용도에 맞게 만드는것 -> VPC 주소 범위 내에서 CIDR 형태로 주소 범위 지정

VPC에 200개의 Subnet 생성 가능

Public / Private를 나눌 수 있으며 Public내에 있는 서버만 Public IP 부여 가능

*외부에서 들어오는 것은 Public만 가능하지만 나가는것은 둘다 가능한다.*

Private : 서버 혹은 로드밸런서를 위치시킨다. -> 굳이 외부에서 접근 할 필요가 없는 것

반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

23.08.30 ASW #3  (0) 2023.08.30
23.08.29 AWS 교육  (0) 2023.08.29
23.08.17 목  (0) 2023.08.17
23.08.16 수  (0) 2023.08.16
쿠버 정리 #2  (0) 2023.08.15
반응형

ingress-nginx-controller 공식 홈페이지의 베어서버 버전 컨트롤러를 설치하면 x-forwarded-for 기능이 올바르게 작동도지 않았다 그이유는 공식 홈페이지의 버전이 조금 더 높아서여서 버전이 낮은 컨트롤러를 이용해서 x-forwarded-for를 확인

 

ingress-nginx-controller 설치

k apply -f https://raw.githubusercontent.com/Beas-github/test/master/T2/nginx-ingress1.yaml

설치 시 k get -n ingress-nginx -o wide 를 통해서 확인 할 수 있다.

ingress-nginx-controller를 설치하게 되면 ingress-nginx라는 namespace가 생성이되면서 ingress - controller는 분리되어 동작이 된다.

Ingress Controller는 Ingress가 동작하기 위해서 반드시 필요한 존재로 ingress Controller가 Ingress를 선택해서 사용한다.

밑의 주소의 사진을 참고하면

 

Ingress

Service Loadbalancing, Canary Upgrade

kubetm.github.io

Ingress가 동작하는 로직을 나타내는 그림으로 Ingress Controller를 설치하면 Ingress-Controller(종류)의 namespace로 Service-Pod가 생성되어 Ingress Controller가 동작이 된다. 

컨트롤러를 더 자세히 살펴보면 Service와 Pod를 볼수가 있는데

컨트롤러의 Service는 외부와 통신을 하기위해서 NodePort 서비스가 생성이되어 HTTP/HTTPS 접근이 가능해지는 Port를 컨트롤러 Pod에 열어준다.

위의 사진을 다시 가져오면 controller에 NodePort 서비스가 HTTP/HTTPS 포트가 열린것을 확인 할 수 있다.

컨트롤러의 Pod는 설치한 컨트롤러의 종류 이번에는 nginx를 설치해서 nginx pod가 생성이 된다.

컨트롤러의 Pod nginx가 하는 일은 쿠버네티스를 통해 만든 Ingress를 참조해 정의해둔 규칙에 따라 동작하는 역활을 한다.

Ingress 만들기

Ingress를 만들어보자.

Ingress는 쿠버네티스를 통해서 yaml파일로 만들 수 있다. -> Ingress는 동작을 정의 할 뿐이지 실제로 동작하는게 아니다.

apiVersion: networking.k8s.io/v1-> Ingress 오브젝트를 사용할 api 서버

kind: Ingress -> 오브젝트 종류는 Ingress

ingressClassName: nginx -> 인그레스 컨트롤러 리소스의 이름으로 어떤 컨트롤러에서 구현 할것인지 정의한다.

tls: -> tls를 사용한다.

- hosts: good.com -> good.com 이라는 도메인으로 접속 할때 tls를 적용 할 수 있다.

secretName: secret-https -> tls에서 사용할 암호 이름은 secret-https이다.

rules: -> 인그레스의 규칙을 설정한다.

host: good.com -> good.com로 접속 할때 적용한다.

path: / -> http를 통해  /(good.com)로 접근 하는 요청을 

backend: -> backend에서 정의한 곳으로 전달 한다.

service.name:  svc-https -> svc-https라는 이름의 service로 전달한다.

service.port.number: 80 -> svc-https 서비스의  80포트로 전달한다.

동작은 위의 그림처럼 될 것 이다.

접속테스트 

$MYDOMAIN1=good.com $IngHttps는 HTTPS 포트번호를 등록했다.

패킷을 확인 해보면

Proxy 서버가 동작하는 것을 확인 할 수 있다.

192.168.10.150은 클라이언트 PC의 IP이고 192.168.10.10은 마스터 노드의 IP이다.

/etc/hosts를 통해 Domain을 수동으로 적용

DNS 서버를 따로 만들지 않아 클라이언트 PC에서 hosts 파일을 직접 수정해서 good.com을 넣어 주었다.

클라이언트 PC <-> Master 노드 사이에 HTTPS 가 동작하는 것을 확인 할 수 있다.

그렇다면 172.30.29.13은 누구의 IP 일까?

 

ingress-nginx-controller의 Pod IP

인그레스 컨트롤러를 설치하며 생성된 컨트롤러 Pod 즉 Nginx가 설치된 Pod의 IP 이다.

컨트롤러의 Pod가 직접 service와 동작하는 모습

실제로 Ingress라는 것은 Ingress-nginx-controller가 동작한다는 것을 확인 할 수 있고 Ingress-nginx-controller가 Proxy 서버로 동작한다는 것을 확인 할 수 있다.

반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

23.08.29 AWS 교육  (0) 2023.08.29
VPC  (0) 2023.08.19
23.08.16 수  (0) 2023.08.16
쿠버 정리 #2  (0) 2023.08.15
쿠버 정리 #1  (0) 2023.08.15
반응형

Ingress

  • 쿠버네티스 클러스터 내부에서 서비스를 외부로 노출시키기 위한 리소스입니다.
  • Ingress는 일종의 API 객체로서, HTTP 및 HTTPS 요청을 적절한 서비스로 전달하도록 관리해주는 역할을 합니다. 이를 통해 쿠버네티스 클러스터 내부에 있는 다양한 서비스들을 동일한 IP와 포트 번호를 사용하여 외부에서 접근할 수 있게 됩니다.

클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리함.

인그레스는 부하 분산, SSL 종료, 명칭 기반의 가상 호스팅을 제공할 수 있다.

전제 조건들

인그레스 컨트롤러가 있어야 인그레스를 충족할 수 있다. 인그레스 리소스만 생성한다면 효과가 없다.

ingress-nginx와 같은 인그레스 컨트롤러를 배포해야 할 수도 있다. 여러 인그레스 컨트롤러 중에서 선택할 수도 있다.

이상적으로, 모든 인그레스 컨트롤러는 참조 사양이 맞아야 한다. 실제로, 다양한 인그레스 컨트롤러는 조금 다르게 작동한다.

인그레스 클래스

인그레스는 서로 다른 컨트롤러에 의해 구현될 수 있으며, 종종 다른 구성으로 구현될 수 있다. 각 인그레스에서는 클래스를 구현해야하는 컨트롤러 이름을 포함하여 추가 구성이 포함된 IngressClass 리소스에 대한 참조 클래스를 지정해야 한다.

apiVersion: networking.k8s.io/v1 // 인그레스 정보가 있는 API
kind: IngressClass // IngressClass 오브젝트 생성
metadata: 
  name: external-lb // 오브젝트 이름
spec:
  controller: example.com/ingress-controller // 사용할 인그레스 컨트롤러
  parameters: // 환경설정 값들이 정의되어 있는 값을 참조하기 위해 사용
    apiGroup: k8s.example.com // api resource들을 묶어 놓은 그룹 
    kind: IngressParameters // 
    name: external-lb

인그레스 컨트롤러

인그레스 리소스가 작동하려면, 클러스터는 실행 중인 인그레스 컨트롤러가 반드시 필요하다.

kube-controller-manager 바이너리의 일부로 실행되는 컨트롤러의 다른 타입과 달리 인그레스 컨트롤러는 클러스터와 함께 자동으로 실행되지 않는다. 클러스터에 가장 적합한 인그레스 컨트롤러 구현을 선택하는데 이 페이지를 사용한다.

프로젝트로서 쿠버네티스는 AWS, GCE nginx 인그레스 컨트롤러를 지원하고 유지한다.

-> 인그레스 컨트롤러는 클러스터(구축하려는 쿠버네티스 서비스)에 맞춰서 컨트롤러 구현을 선택할 수 있다.

매우 다양한 인그레스 컨트롤러가 있다.

하나의 클러스터에서 여러개의 인그레스 클래스를 이용해 여러 개의 인그래스 컨트롤러를 배포할 수 있다.

결국 ingress controller가 모든 처리를 담당하기에 ingress controller를 여러개 만들어서 그 윗단에서 로드밸런서를 통해 ingress controller들을 로드밸런싱한다.

 

https://kubernetes.io/ko/docs/concepts/services-networking/ingress/

 

반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

VPC  (0) 2023.08.19
23.08.17 목  (0) 2023.08.17
쿠버 정리 #2  (0) 2023.08.15
쿠버 정리 #1  (0) 2023.08.15
23.08.14 월  (0) 2023.08.14
반응형

Service

쿠버네티스 환경에서 서비스(Service) 파드들을 통해 실행되고 있는 애플리케이션을 네트워크에 노출(expose)시키는 가상의 컴포넌트다.

쿠버네티스 내부의 다양한 객체들이 애플리케이션과, 그리고 애플리케이션이 다른 외부의 애플리케이션이나 사용자와 연결될 수 있도록 도와주는 역할을 한다.

쿠버네티스에서의 파드는 무언가가 구동 중인 상태를 유지하기 위해 동원되는 일회성 자원으로 언제든 다른 노드로 옮겨지거나 삭제될 수 있다. 또한 파드는 생성될 때마다 새로운 내부 IP를 받게 되므로, 이것만으로 클러스터 내/외부와 통신을 계속 유지하기는 어렵다.

쿠버네티스에서는 파드가 외부와 통신할 수 있도록 클러스터 내부에서 고정적인 IP를 갖는 서비스(Service)를 이용하도록 하고 있다. 

서비스를 정의하고 생성할 때에는 spec.ports 아래에 연결하고자 하는 항목 별로 각각 2개씩의 포트가 지정되어야 한다. 아래의 항목 명칭은 클러스터 안에서 트래픽을 중계하는 서비스의 입장에서 기술된 것임을 이해하자.

  • targetPort : 파드의 애플리케이션 쪽에서 열려있는 포트를 의미한다. 서비스로 들어온 트래픽은 해당 파드의 <클러스터 내부 IP>:<targetPort>로 넘어가게 된다.
  • port : 서비스 쪽에서 해당 파드를 향해 열려있는 포트를 의미한다.

서비스 유형

  1. ClusterIP (기본 형태)
  2. NodePort
  3. LoadBalancer
  4. ExternalName

ClusterIP

ClusterIP 파드들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP다. 이 유형의 서비스는 <ClusterIP>로 들어온 클러스터 내부 트래픽을 해당 파드의 <파드IP>:<targetPort>로 넘겨주도록 동작하므로, 오직 클러스터 내부에서만 접근 가능하게 된다. 쿠버네티스가 지원하는 기본적인 형태의 서비스다.

NodePort

NodePort 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다. 이때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.

LoadBalancer

도의 외부 로드 밸런서를 제공하는 클라우드(AWS, Azure, GCP 등) 환경을 고려하여, 해당 로드 밸런서를 클러스터의 서비스로 프로비저닝할 수 있는 LoadBalancer 유형도 제공된다.

ExternalName

서비스에 selector 대신 DNS name을 직접 명시하고자 할 때에 쓰인다. spec.externalName 항목에 필요한 DNS 주소를 기입하면, 클러스터의 DNS 서비스가 해당 주소에 대한 CNAME 레코드를 반환하게 된다.

CNI 

컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준입니다.

쿠버네티스에서는 Pod 간의 통신을 위해서 CNI 를 사용합니다. 

CNI는 Calico, Weavenet, AWS CNI 등 매우 다양한 종류가 있습니다.

https://captcha.tistory.com/78

CNI에서 사용되는 네트워크 모델

CNI Provider는 VXLAN(Virtual Extensible Lan), IP-in-IP 과 같은 캡슐화된 네트워크 모델 또는 BGP (Border Gateway Protocol)와 같은 캡슐화 되지 않은 네트워크 모델을 사용하여 네트워크 패브릭을 구현합니다. 

 

쿠버네티스는 모든 네트워킹 구현에 대해 다음과 같은 근본적인 요구사항을 만족할 것을 요구한다. (이를 통해, 의도적인 네트워크 분할 정책을 방지)

  • 파드는 NAT 없이 노드 상의 모든 파드와 통신할 수 있다.
  • 노드 상의 에이전트(예: 시스템 데몬, kubelet)는 해당 노드의 모든 파드와 통신할 수 있다.

Namespaces

  • 도커에서의 Namespace와는 다른 개념이다
    • 도커에서의 Namespace는 호스트 내에서 Namespace로 분리하여 독립적인 리소스를 할당받아서 관리할 수 있는 개념이다
  • 쿠버네티스에서의 Namespace는 하나의 Control Plane(Master)와 Worker Node들을 하나의 독립적인 Namespace로 관리한다.

쿠버네티스에서, 네임스페이스 는 단일 클러스터 내에서의 리소스 그룹 격리 메커니즘을 제공한다. 리소스의 이름은 네임스페이스 내에서 유일해야 하며, 네임스페이스 간에서 유일할 필요는 없다. 네임스페이스 기반 스코핑은 네임스페이스 기반 오브젝트 (예: 디플로이먼트, 서비스 등) 에만 적용 가능하며 클러스터 범위의 오브젝트 (예: 스토리지클래스, 노드, 퍼시스턴트볼륨 등) 에는 적용 불가능하다

  • 리소스를 논리적으로 나누기 위한 방법을 제공하는 것
  • Pod, Deployment, Service와 같은 여러 오브젝트들을 하나의 Namespace로 그룹핑해서 관리 할 수 있다.

namespace는 많은 사용자가 여러 팀 또는 프로젝트에 분산되 었는 환경에서 사용하기 위한 것입니다.
사용자가 몇 명에서 수십 명에 이르는 kubernetes cluster의 경우 새롭게 namespaces를 생성할 필
요가 없으며, default-cluster 로 충분합니다.

Labels을 사용하여 동일한 Namespace 내의 resource를 구별 할 수 있습니다.

Pod 생성 및 컨테이너 구성 확인

  • **kubectl api-resources**는 Kubernetes 클러스터 내에서 사용 가능한 API 리소스 목록을 보여주는 명령어입니다. Kubernetes API는 클러스터 내의 다양한 개체(object)를 관리하는 데 사용되며, 이 명령어를 통해 어떤 종류의 리소스가 사용 가능한지, 그리고 해당 리소스의 종류와 버전을 확인할 수 있습니다.
  • kubectl api-resources 명령어는 다음과 같은 정보를 제공합니다:
    1. 이름 (Name): 리소스의 종류를 나타내는 문자열입니다. 예를 들어, "pods", "services", "deployments" 등이 리소스 이름의 예시입니다.
    2. 짧은 이름 (Short Names): 리소스에 대해 짧은 이름의 약어를 제공합니다. 이를 사용하여 리소스를 더 간단하게 참조할 수 있습니다.
    3. API 그룹 (API Group): Kubernetes API는 여러 그룹으로 나누어질 수 있습니다. 대부분의 리소스는 "core" 그룹에 속하며, 이 외에도 커스텀 리소스 정의를 통해 사용자 지정 그룹을 만들 수 있습니다.
    4. 버전 (Version): 리소스의 API 버전을 나타냅니다. Kubernetes는 API 버전 관리를 통해 업그레이드 및 호환성을 유지합니다.
    5. 리소스 타입 (Resource Type): 리소스의 유형을 나타냅니다. 예를 들어 "namespaces", "pods", "services" 등이 리소스 타입의 예시입니다.
  • kubectl api-resources 명령어를 실행하면 현재 사용 가능한 모든 API 리소스의 목록이 표시됩니다. 이를 통해 클러스터 내의 다양한 리소스를 살펴보고, 해당 리소스에 대한 자세한 정보나 명령어를 실행하여 상호작용할 수 있습니다.

쿠버네티스 Pod 생성 실습

myweb.yaml : nginx 이미지를 사용하는 컨테이너를 생성한다.

apiVersion: v1 // stable release API 기본 Pod 생성시 쓰는 api
kind: Pod // 리소스 종류 Pod를 쓴다.
metadata: // pod의 이름과 라벨을 ㅇ지정
  name: myweb // pod 이름은 myweb
spec: // Pod에서 실행될 컨테이너의 스펙
  containers: // 컨테이너 정보
  - image: nginx:latest //사용할 이미지
    name: myweb-container // 컨테이너 이름
    ports: // 사용할 포트
    - containerPort: 80 // 80번 포트 오픈
      protocol: TCP // TCP로 통신

nginx 및 netshoot 컨테이너 생성하여 서로 통신하기

apiVersion: v1
kind: Pod
metadata:
  name: myweb2
spec:
  containers:
  - name: myweb2-nginx
    image: nginx
    ports:
    - containerPort: 80
      protocol: TCP

  - name: myweb2-netshoot // 2번째 컨테이너 이름
    image: nicolaka/netshoot // 2번째 컨테이너 이미지
# netshoot : 네트워크 관련 유틸이 설치된 이미지
    command: ["/bin/bash"]
    args: ["-c", "while true; do sleep 5; curl localhost; done"]
# /bin/bash로 5초 간격으로 웹 페이지를 접속하도록 설정

로그 기록을 통해 확인 가능

  • f 또는 -follow: 로그를 실시간으로 스트리밍하는 옵션입니다. 새로운 로그 메시지가 기록될 때마다 계속해서 출력됩니다.
  • c <container-name> 또는 -container=<container-name>: 컨테이너의 이름을 지정하는 옵션입니다. 만약 Pod 내에 여러 개의 컨테이너가 있는 경우, 이 옵션을 사용하여 특정 컨테이너의 로그를 확인할 수 있습니다.

Pause 컨테이너

  • 역할: Pause 컨테이너는 파드의 네트워크 네임스페이스를 공유하며, 파드 내의 다른 컨테이너들이 공유하는 리눅스 네임스페이스를 유지합니다. 이 컨테이너는 실제 응용프로그램을 실행하지 않고, 단지 네트워크 및 네임스페이스 관리를 위한 역할을 합니다.
  • 통신: 파드 내의 다른 컨테이너들은 공유하는 Pause 컨테이너를 통해 네트워크 통신을 할 수 있습니다. Pause 컨테이너를 통해 파드 내부의 모든 컨테이너는 동일한 IP 주소 범위를 공유하며, localhost를 통해 통신할 수 있습니다.
  • 파드 내의 컨테이너들이 동일한 IP 주소를 가지는 주된 이유는 다음과 같습니다:
    1. Pause 컨테이너를 공유: 파드 내의 모든 컨테이너, 포함하여 일반적인 애플리케이션 컨테이너들, Pause 컨테이너를 공유합니다. Pause 컨테이너는 파드의 네트워크 네임스페이스를 관리하고, 모든 컨테이너가 동일한 네트워크 네임스페이스 내에서 실행됩니다.
    2. 네트워크 네임스페이스 공유: 파드 내의 모든 컨테이너들은 같은 네트워크 네임스페이스를 공유합니다. 이는 네트워크 주소 공간을 파드 단위로 격리하지 않고, 파드 내의 컨테이너들이 동일한 IP 범위와 서브넷을 공유하도록 함으로써 이루어집니다.
    3. 로컬호스트 통신: 파드 내의 컨테이너들은 로컬호스트 주소(127.0.0.1)를 사용하여 서로 통신할 수 있습니다. Pause 컨테이너가 모든 컨테이너들이 공유하는 네트워크 네임스페이스를 관리하므로, 로컬호스트 주소를 통해 컨테이너들이 통신할 수 있습니다.

파드 내 컨테이너에게 부모처럼 net namespace 제공해준다. 파드 내 복수의 컨테이너는 공통으로 pause 컨테이너가 제공한 network namespace를 공유한다. 

모든 파드에 반드시 실행된다.

https://jerryljh.tistory.com/57

 

Pause 컨테이너 정리

KANS 스터디 2주차 Pause 컨테이너 내용 정리. 참고로 면접 때 질문이 pause 컨테이너 역할이었다. 실행 중인거 보았다고 버벅되다 모른다고 하였다. pause 컨테이너란? 파드 내 컨테이너에게 부모처럼

jerryljh.tistory.com

 

반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

23.08.17 목  (0) 2023.08.17
23.08.16 수  (0) 2023.08.16
쿠버 정리 #1  (0) 2023.08.15
23.08.14 월  (0) 2023.08.14
Day 52 23.08.04 금  (0) 2023.08.04
반응형

쿠버네티스를 사용하는 이유?

  • 컨테이너의 자원을 효율적으로 관리하기 위해서 사용
    • 단순히 개수가 많아서 사용한다는 의미가 많이 다름
    • 100개면 안쓰고 10000개면 쓸 것인가에 대한 질문
    • 우리가 운영체제를 왜 쓰는지에 대한 질문과 일맥상통함
  • 클라우드 네이티브를 위한 4가지 요소는 모두 필요하거나 필요하지 않다는 의미보다 각 요소들이 유기적으로 필요에 따라 부분적으로 사용될 수 있다.

쿠버네티스 구조 - 이미지는 공식홈페이지 참조

https://kubernetes.io/ko/docs/concepts/overview/components/

컨트롤 패널 : api, etcd, scheduler, c-m, c-c-m

Kube-apiserver : API 서버는 클러스터 요청이 왔을때 그 요청이 유효한지 검증하는 역할, 모든 요청은 apiserver를 통해서 전달이 된다.

etcd : 모든 클러스터 상태 및 데이터를 담는 쿠버네티스 저장소, key-value 형태로 데이터 저장한다.

scheduler : 노드가 배정되지 않는 새로 생성된 파드를 감지, 실행할 노드를 선택하는 컴포넌트

c-m : 컨트롤러 매니저로 컨트롤러 프로세스를 실행한다. node의 상태를 끊임 없이 체크하고 원하는 상태를 유지

워커 노드 : kubelet. k-proxy

Kubelet : 클러스터의 각 노드에서 실행되는 에이전트, 파드에서 컨테이너가 확실하게 동작하도록 관리한다.

 k-proxy : 각 노드에서 실행되는 네트워크 프록시로 쿠버네티스 서비스 개념의 구현부이다. 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 한다. - 커널의 iptables 

쿠버네티스 동작 원리

  • 컨테이너 생성 요청 시 kubectl를 통해 API로 생성 요청을 전달
  • scheduler를 통해 Worker Node 내 컨테이너 상태를 확인하고 API가 생성 요청을 kubelet에 전달하여 scheduler를 통해 확인한 컨테이너 상태를 기반으로 최적 리소스를 통해 컨테이너를 생성
  • 생성이 완료되면 etcd에 변경된 상태를 전달하여 etcd를 최신 상태로 업데이트
  • 이후 노드들에 상태는 Controller manager를 통해 지속적으로 모니터링하며 체크

https://tech.ktcloud.com/68

쿠버네티스 오브젝트 - 쿠버네티스 시스템에서 영속성을 가지는 오브젝트

Pod

  • 쿠버네티스의 가장 작은 배포 단위
  • 하나의 Pod에는 하나의 컨테이너가 존재할 수 있다.
  • 전체 클러스터에서 고유한 IP를 할당
  • 해당 IP는 수시로 생성, 삭제되는 컨테이너 특성상 고정하지 않으므로 고정이 필요할 경우 별도 설정이 필요하다.

ReplicaSet

  • 여러 개의 Pod를 관리
  • replicas=3 이면 Pod의 개수를 3개로 유지하며 Pod가 3개가 되도록 지속적으로 관리한다.
    • 추가, 생성 시 3개 초과 시 삭제하고 3개 미만 시 생성을 진행

Deployment

  • 배포 버전을 관리 (Pod와 ReplicaSet에 대한 선언과 업데이트를 관리해주는 모)
  • 내부적으로 ReplicaSet을 통한 버전 업데이트 관리
    • yaml 파일에서 특정 Pod에 대한 버전을 수정하고 업데이트 명령을 요청한다.
    • 기존 ReplicaSet은 3개로 지정되어 있고 Pod가 삭제되지 않은 상태이기 때문에 etcd에서는 해당 변경된 정보만 가지고 있음
    • 이후 Pod가 삭제되면 생성 시 변경된 사항(버전 수정)을 참고하여 새로 생성되는 Pod의 버전이 업데이트되어 생성됨
      • 기존 2개는 v1이면 새로 생성된 버전은 v2
    • 이런 식으로 순차적으로 Pod의 버전을 업데이트하면서 서비스 무중단 배포가 가능하다.

워크로드

쿠버네티스에서 구동되는 애플리케이션, 일련의 파드 집합 내에서 실행한다. -> 어떤 애플리케이션을 실행 할 때 필요한 IT 리소스의 집합

각 WorkLoad의 역할에 따라 다양한 오브젝트가 존재한다. -> 배포를 관리하는 오브젝트, 상태를 관리하는 오브젝트, 지속적인 실행을 관리하는 오브젝트 등

  • Deployment : Deployment의 모든 Pod가 "필요 시 교체" 혹은 "상호 교체" 가능한 경우, 클러스터의 스테이트리스 어플리케이션 워크로드를 관리하기에 적합하다.
  • StatefulSet : state를 추적하는 하나 이상의 Pod를 반드시 동작하게 해준다.
  • DaemonSet : 노드-로컬 기능을 제공하는 Pods를 정의한다.
  • Job  CronJob : 실행 완료 후 중단되는 작업을 정의한다.

ClusterIP

  • 노드 내부에 존재하는 IP
  • 해당 IP는 내부에서만 접근 가능하고 외부(다른 노드 등)에서는 접근이 불가능하다.

NodePort

  • 노드에 노출되어 외부에서 접근 가능한 서비스
    • 포트 포워딩과 동일한 방식

LoadBalancer

  • 특정 노드가 문제가 발생하면 외부에서 접근이 불가능하기 때문에 LoadBalancer를 통해 통신 가능한 NodePort를 매핑해준다.

Ingress

  • 클러스터 내부의 서비스에 대한 외부 접근을 관리하는 기능
  • 클러스터 외부에서 들어오는 HTTP와 HTTPS 요청을 특정 서비스로 라우팅하는 역할을 함
  • 이를 통해 클러스터 내부의 서비스를 외부로 노출하거나, 로드 밸런싱, SSL 종료 등을 수행

일반적인 구성

반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

23.08.16 수  (0) 2023.08.16
쿠버 정리 #2  (0) 2023.08.15
23.08.14 월  (0) 2023.08.14
Day 52 23.08.04 금  (0) 2023.08.04
Day 41 ~ 49 23.07.21 - 08.01 1차 프로젝트  (0) 2023.08.01
반응형

중간 프로젝트가 끝나고 말도 안 되는 억까로 코로나에 걸려 겨우 살아나 블로그를 쓰지 못했다.

쿠버네티스 오브젝트

쿠버네티스 시스템에서 영속성을 가지는 오브젝트이다. 클러스터의 상태를 나타내기 위해 오브젝트를 이용한다.

  • 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지)
  • 그 애플리케이션이 이용할 수 있는 리소스
  • 그 애플리케이션이 어떻게 재구동 정책, 업그레이드, 그리고 내고장성과 같은 것에 동작해야 하는지에 대한 정책

쿠버네티스 오브젝트는 하나의 "의도를 담은 레코드"이다.

오브젝트는 2개의 필드를 포함해야 하는데 spec, status이다.

spec : 오브젝트를 생성할 때 원하는 특징(의도한 상태)에 대한 설명을 제공해서 설정한다.

status : 쿠버네티스 시스템과 컴포넌트에 의해 제공되고 업데이트된 오브젝트의 현재 상태를 설명한다.

쿠버네티스에서 오브젝트를 생성할 때, 기본정보 + spec을 yaml 파일로 kubectl에 제공해야 한다.

기본 오브젝트 4가지

파드(Pod)

쿠버네티스에서 생성하고 관리 할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.

하나 이상의 컨테이너 그룹으로 그룹은 스토리지 및 네트워크를 공유하고 해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다.

pod 생성 yaml 예시
apiVersion: v1 //스크립트를 실행하기 위한 쿠버네티스 API 버전 
kind: Pod //리소스의 종류 정의 Pod 쿠버네티스 선언
metadata: // 리소스의 라벨, 이름 등을 지정함
  name: nginx // namespace 상에서 유일한 값
spec: // 생성할 오브젝트의 구체적 내용을 정의하는 spec -> object마다 형식이 다르다.
  containers: // 컨테이너 명세를 배열로 기술
  - name: nginx // 컨테이너 이름
    image: nginx:1.14.2 // 컨테이너 생성시 사용할 이미지
    ports: // 외부 요청을 전달하기 위한 포트 목록
    - containerPort: 80 // 80번 포트를 사용한다.

쿠버네티스 namespace

https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/namespaces/

쿠버네티스에서, 네임스페이스 는 단일 클러스터 내에서의 리소스 그룹 격리 메커니즘을 제공한다. 리소스의 이름은 네임스페이스 내에서 유일해야 하며, 네임스페이스 간에서 유일할 필요는 없다. 네임스페이스 기반 스코핑은 네임스페이스 기반 오브젝트 (예: 디플로이먼트, 서비스 등) 에만 적용 가능하며 클러스터 범위의 오브젝트 (예: 스토리지클래스, 노드, 퍼시스턴트볼륨 등) 에는 적용 불가능하다.

쿠버네티스 클러스터에서 사용되는 리소소들을 구분해 관리하는 그룹이다. pod와 service 등은 네임스페이스별로 생성 및 관리될 수 있으며, 네임스페이스별로 사용자 접근 권한을 다르게 설정할 수도 있다.

쿠버네티스는 namespace 즉 논리적인 분리 단위를 제공해 준다. -> 물리적 분리가 아닌 논리적 분리

볼륨 Volume

pod가 사라지더라도 사용할 수 있는 디렉터리는 볼륨 오브젝트를 통해 host에 저장할 수 있다.

서비스 Service

파드의 집합으로 쿠버네티스의 네트워크를 나타낸다.

ClusterIP - 클러스터 내부에서만 접근 가능한 pod끼리 통신하게 해주는 

NodePort - 클러스터 node위의 open port를 의미하며 고정 포트로 각 노드의 포트를 열어 외부에서 접속할 수 있게 한다.

LoadBalancer - 클라우드 공급자의 로드밸런서를 사용해 서비스를 외부에 expose 한다.

ExternalName -  잘 모르겠음

ex) Deployment

파드와 레플리카셋에 대한 선언적 업데이트를 제공한다.

디플로이먼트에서 의도하는 상태를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다. 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디플로이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다.

apiVersion: apps/v1 // api 버전과 디플로이는 apps/v1을 사용해야 한다.
kind: Deployment // 해당 yaml은 deployment라고 정의
metadata: // metadata 설정
  name: nginx-deployment // namespace 필드 nginx-deployment를 만든다.
  labels: // 라벨을 만든다.
    app: nginx // app=nginx라는 key : value 형식
spec: // spec 요구사항을 적는다.
  replicas: 3 // 레플리카는 3개로
  selector: // 생성된 레플리카셋을 관리할 파드를 찾아내는 방법을 정의
    matchLabels: // 라벨이 맞는 파드들을 관리한다.
      app: nginx // app=nginx라는 라벨을 가진 파드를 관리한다.
  template: // 새 파드를 런칭하는데 사용할 템플릿 -> selector와 labels 가 일치 해야 한다.
    metadata: // 파드 메타데이터
      labels: // 파드 라벨
        app: nginx // app=nginx
    spec: //파드 템플릿 사양
      containers: // 컨테이너 정보
      - name: nginx // 컨테이너 이름 nginx
        image: nginx:1.14.2 // 컨테이너에 사용할 이미지
        ports: // 컨테이너 사용 포트
        - containerPort: 80 // 80포트를 사용한다.
반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

쿠버 정리 #2  (0) 2023.08.15
쿠버 정리 #1  (0) 2023.08.15
Day 52 23.08.04 금  (0) 2023.08.04
Day 41 ~ 49 23.07.21 - 08.01 1차 프로젝트  (0) 2023.08.01
Day 39 23.07.18 화  (0) 2023.07.18
반응형

cgroup

cgroups(control groups의 약자)는 프로세스들의 자원의 사용(CPU, 메모리, 디스크 입출력, 네트워크 등)을 제한하고 격리시키는 리눅스 커널 기능이다.

https://ko.wikipedia.org/wiki/Cgroups

프로세스 모음의 리소스(CPU, 메모리, 디스크 I/O, 네트워크 등) 사용량을 제한, 설명 및 격리하는 리눅스 커널 기능

Resource limits – 프로세스가 사용할 수 있는 특정 리소스(예: 메모리 또는 CPU)의 양을 제한하도록 cgroup을 구성할 수 있습니다.

Prioritization – 리소스 경합이 있을 때 다른 cgroup의 프로세스와 비교하여 프로세스가 사용할 수 있는 리소스(CPU, 디스크 또는 네트워크)의 양을 제어할 수 있습니다.

Accounting – 리소스 제한은 cgroup 수준에서 모니터링되고 보고됩니다.

Control – 단일 명령으로 cgroup에 있는 모든 프로세스의 상태(고정, 중지 또는 다시 시작)를 변경할 수 있습니다.

요약 :  cgroup을 사용하여 프로세스 또는 프로세스 집합에서 액세스 하거나 사용할 수 있는 지정된 키 리소스(CPU, 메모리, 네트워크 및 디스크 I/O)의 양을 제어

namespace

네임스페이스는 한 프로세스 집합이 한 리소스 집합을 보고 다른 프로세스 집합이 다른 리소스 집합을 볼 수 있도록 커널 리소스를 분할하는 Linux 커널의 기능입니다

https://ko.wikipedia.org/wiki/%EC%9D%B4%EB%A6%84%EA%B3%B5%EA%B0%84

네임스페이스의 주요 기능은 프로세스를 서로 격리한다는 것입니다. 

chroot

유닉스 운영 체제에서 chroot는 현재 실행 중인 프로세스와 차일드 프로세스 그룹에서 루트 디렉터리를 변경하는 작업이다.

이렇게 수정된 환경에서 실행되는 프로그램은 지정된 디렉터리 트리 밖의 파일들의 이름을 지정할 수 없으므로(즉, 일반적으로는 접근이 불가능하므로) chroot 감옥으로 부른다. chroot는 chroot(2) 시스템 호출이나 chroot(8) 래퍼 프로그램을 가리킬 수 있다.

root(/)폴더 위치를 바꾸는 명령어로 Linux의 기본 /가 아닌 다른 폴더를 root 폴더로 재 정의 하는 명령어이다.

chroot를 통해서 사용자나 프로세스가 특정 파일 시스템 구역에서 벗어나지 못하도록 울타리를 치는 역할을 한다.

반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

쿠버 정리 #1  (0) 2023.08.15
23.08.14 월  (0) 2023.08.14
Day 41 ~ 49 23.07.21 - 08.01 1차 프로젝트  (0) 2023.08.01
Day 39 23.07.18 화  (0) 2023.07.18
Day 38 23.07.17 월  (0) 2023.07.17
반응형

1차 프로젝트를 진행하느라 블로그를 쓰지 못했다.

프로젝트 관련해서는 따로 글을 쓸 예정이어서 간단하게 소감만 남기려고 한다.

1. 문서를 쓸 때 계획이 있어야 한다.

2. 계획은 최대한 세세하게 시작해야 한다.

반응형

'경기도 미래기술학교 클라우드 > TIL' 카테고리의 다른 글

23.08.14 월  (0) 2023.08.14
Day 52 23.08.04 금  (0) 2023.08.04
Day 39 23.07.18 화  (0) 2023.07.18
Day 38 23.07.17 월  (0) 2023.07.17
Day 36 23.07.13 목  (0) 2023.07.13
반응형

Compose를 사용하는 이유

여러 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리 - 하나의 프로젝트로 다룰 수 있는 작업 환경을 제공.

프로젝트에서 컨테이너를 사용 할 때 내용과 환경을 직관적이고 명시적으로 관리 할 수 있게 된다. - IaC

IaC 코드형 인프라 - 코드를 통해 인프라를 관리는 것을 의미한다.

Docker 공식 홈페이지 실습을 따라한 가이드

Try Docker Compose | Docker Documentation

보고 따라하면 된다.

도커 파일

# syntax=docker/dockerfile:1
FROM python:3.7-alpine  -기본 바탕 이미지
WORKDIR /code           - 실행할 영역
ENV FLASK_APP=app.py    - 플라스크 환경변수
ENV FLASK_RUN_HOST=0.0.0.0 - 플라스크 동작할 호스트
RUN apk add --no-cache gcc musl-dev linux-headers - 파이썬 apk 패키지 실행
COPY requirements.txt requirements.txt - 호스트의 txt 파일 복사
RUN pip install -r requirements.txt - txt에 명시된 파이썬 패키지 설치
EXPOSE 5000 - 포트 설정
COPY . . - 호스트에있는 파일들 복사
CMD ["flask", "run"] - 컨테이너를 시작하면 시작할 명령어

docker-compose.yaml 파일

services:    
  web:
    build: .    - 호스트에 있는 Dockerfile을 빌드한다.
    ports:      - 포트포워딩
      - "8000:5000"
    volumes:  - 볼륨마운트한다. = 호스트에있는 app.py를 사용한다.
      - .:/code
    environment:  - 환경변수로 flask의 debug를 시작한다.
      FLASK_DEBUG: "true"
  redis:  - 레디스를 설치 후 실행한다.
    image: "redis:alpine"

 

반응형

'경기도 미래기술학교 클라우드 > 실습 가이드' 카테고리의 다른 글

Docker network 실습  (0) 2023.07.19
ssl 실습  (0) 2023.07.17
Docker를 이용한 간단한 script 자동화  (0) 2023.07.14
Docker 명령어 실습 가이  (0) 2023.07.11
EEM 가이드  (0) 2023.07.05
반응형

구성도에 맞춰서 wordpress 블로그를 만들어 보자.

구성도

실습 목표

docker0를 사용하지 않고 새로운 Network를 만들어서 분리 시킨다.

docker volume을 사용해서 mysql 정보를 host에 저장한다.

wordpress와 mysql을 link를 통해 연결 시킨다.

wordpress를 호스트와 포트포워딩을 통해서 호스트에서 접속이 가능하게 한다.

실습 과정

새 Network 만들기

docker0는 172.17.0.1/16이라는 default 인터페이스를 가지고있다. 만약 network 설정을 하지 않는다면 컨테이너들은 docker0에 bridge로 연결이되어 생성이 된다.

모든 컨테이너가 하나의 네트워크를 사용하는것과 기본으로 제공되는 docker0를 사용하는것은 보안적으로도 서비스적으로 안전하지 않는다. -> 새로운 network를 만들자.

--driver는 네트워크 타입을 설정하는데 주로 bridge를 사용하게 된다. (다른 것들 추후에 알아보자)

네트워크를 생성하는 명령어

docker network ls를 통해서 확인하자.

none, host, bridge는 docker가 설치되면서 기본으로 설정되기에 건들지 말자.

이제 iptables를 살펴보면 host와 생성한 mzcnet1이 연결된 것을 확인 할 수 있다.

iptables 에서

MASQUERADE는 NAT로 생각하면 된다. all로  172.19.0.0/16이 연결된 것을 확인 할 수 있는데 앞에있는 source가 만든 네트워크 ID임을 확인 할 수 있다.

mysql 설치 - 명령어가 길다.

MYSQL_DATABASES가 되어야 한다.

--network 네트워크를 변경 -v mzvol:/var/lib/mysql  docker volume mzvol에 mysql 정보를 저장하고 컨테이너의 /var/lib/mysql와 연결하고 덮어쓴다.

wordpress 설치

mysql과 같은 네트워크로 설정 -e는 wordpress가 구동하기 위한 필수 환경설정들 (DB 정보) --link 컨테이너이름:식별자를 통해서 컨테이너끼리 연결할 수 있다.

이제 만든 워드프로세스에 접근 할 수 있다. (포트는 포트포워딩을 해야 한다.)

TS

database에 연결 실패라고 뜰 수 있는데 DB와 연결을 실패 했다는 경고로

-e를 잘 못썼을 경우가 대다수 이다. (-e는 대문자로)

또한 MYSQL이 5.7이상의 버전일시에는 wordpress가 접근하기 위해서는 다른 방식이 필요해 에러가 날 수 있다.

반응형

'경기도 미래기술학교 클라우드 > 실습 가이드' 카테고리의 다른 글

Docker compose 실습  (1) 2023.07.19
ssl 실습  (0) 2023.07.17
Docker를 이용한 간단한 script 자동화  (0) 2023.07.14
Docker 명령어 실습 가이  (0) 2023.07.11
EEM 가이드  (0) 2023.07.05

+ Recent posts