반응형

Pod 로그 관리

  • 전통적인 애플리케이션의 로그 운영
    • 애플리케이션이 항상 지정된 장비에서 실행됨을 보장
    • logrotate와 같은 system 관리 tool을 이용해서 로그 관리
    • 일정시간 로그를 저장하고, 일정시간 후에는 로그를 제거
  • 클러스터 환경에서 로그 운영
    • 애플리케이션이 어느 노드에서 실행 되는지 얼마나 많은 자원 사용하는지 응답속도 및 응답 코드 확인
    • 개별 노드에 접근하지 않고 직접 Pod의 로그를 확인할 수 있어야 함
      • 로그 수집 & 저장 & 모니터링
    • Pod 로그 확인

 

EFK를 이용하여 Kubernetes Application 로그 관리

  • EFK stack은 클러스터 환경에서 로그를 수집, 검색 그리고 시각화를 지원
    • 각 클러스터 Node에 fluentd가 daemonset으로 log를 수집
    • elasticsearch는 fluentd가 수집한 로그를 저장하고 요청에 따라 검색 함
    • 마지막으로 유저가 용이하게 사용할 수 있도록 kibana로 시각화
  • EFK 구축
    • ElasticSearch 구축
    • Kibana 구축
    • Fluented 구축

 

Stern으로 여러 개의 Pod 로그 확인

  • Stern
    • 여러 개 Pod 로그를 실시간 모니터링
    • 사이트: https://github.com/stern/stern
  • Stern 설치 및 Pod 로그 보기

 

Reference

따배쿠35강

 

반응형
반응형

ConfigMap과 Secret

  • ConfigMap: 컨테이너 구성 정보를 한곳에 모아서 관리
  • Secret: 컨테이너가 사용하는 password, auth token, ssh key와 같은 중요한 정보를 저장하고 민감한 구성정보를 base64로 인코딩하여 한곳에 모아서 관리
  • 민감하지 않은 일반 설정파일 -> configMap 사용 / 민감한 데이터 -> secret 사용
  • Secret 데이터 전달 방법
    • Command-line Argument
    • Environment Variable
    • Volume Mount

 

Secret 만들기

  • kubectl create secret <Available Commands> name [flags] [options]
    • Available Commands 종류
      • docker-registry
        • Create a secret for use with a Docker registry
      • generic
        • Create a secret from a local file, directory or literal value
      • tls
        • Create a TLS secret
    • Available Commands에 따라 들어가는 옵션이 달라짐
      • docker-registry
        • 인증 정보 / username, password, email-address
      • generic
        • user define 정보 / --from-literal, --from-file
      •  tls
        • public, private key 정보 / cert, key

Secret Type 종류

 

Secret 사용하기

  • 정의된 Secret을 Pod의 Container에 전달하는 방법
    • environment variable로 전달
    • command-line argument로 전달
    • volume에 secret을 사용하여 컨테이너 디렉토리에 mount

  • 생성한 secret을 컨테이너 환경변수(env)로 컨테이너에 전달하기

  • 생성한 secret을 컨테이너 volume mount로 전달하기

 

Secret 데이터 용량 제한

  • Secret etcd에 암호화하지 않은 텍스트로 저장되므로 secret value가 커지면 메모리 용량을 많이 사용하게 됨
  • secret의 최대 크기는 1MB

 

Reference

따배쿠34강

 

반응형
반응형

ConfigMap

  • ConfigMap: 컨테이너 구성 정보를 한곳에 모아서 관리
    • 컨테이너 수가 많을 때 하나하나 컨테이너에 들어가 구성 정보를 관리하는 것이 쉽지 않음
    • configmap의 구성 정보를 여러 컨테이너에 적용하여 관리
  • 구성 정보 전달 방법
    • 환경 변수로 전달
    • argument로 전달
    • volume mount, 저장소 파일로 전달

 

ConfigMap 생성

  • --from-file로 파일 source, --from-literal로 key:value
    • kubectl create configmap test_Configmap --from-literal=id=b2021002 --from-literal=class=bigdata
    • kubectl create configmap test_Configmap --from-file=text.file
    • kubectl create configmap test_Configmap --from-file=mydata=text.file
    • kubectl create configmap test_Configmap --from-file=/configmap.dir/

Example

 

ConfigMap의 일부분을 적용하기

  • 생성한 ConfigMap의 key를 pod의 컨테이너에 적용

 

ConfigMap의 전체를 적용하기

  • 생성한 ConfigMap 전체 key를 pod의 컨테이너에 적용

 

ConfigMap의 볼륨으로 적용하기

  • 생성한 ConfigMap의 key를 pod의 컨테이너에 볼륨 마운트 하기
    • key가 파일이름으로 value가 내용으로 전달

 

Reference

따배쿠33강

 

반응형
반응형

Canary Deployment

  • 파드를 배포(업데이트)하는 방법
    • 블루 그린 업데이트
    • 카나리 업데이트
    • 롤링 업데이트
  • Canary 배포
    • 기존 버전을 유지한 채로 일부 버전만 신규 버전으로 올려서 신규 버전에 버그나 이상이 없는지 확인
    • 신규 버전에 문제가 있으면 기존 버전으로 복구
    • 신규 버전에 문제가 없으면 기존의 일부 버전을 또 신규 버전으로 올려 문제가 없는지 확인

 

Canary Deployment Example

  • 기존의 구버전(블루) 파드 두개 실행
  • 새로운 버전(그린) 한개 실행
  • 기존 버전 2개 새로운 버전 1개 service로 묶어 실행
    • 고객은 세개의 파드 무작위로 사용
  • 문제가 없으면 새로운 버전 1개 추가 & 구버전 1개 삭제
  • 이와 같은 방식으로 새로운 버전을 하나씩 테스트하며 자유롭게 업데이트

 

Reference

따배쿠32강

 

반응형
반응형

Annotation

  • Label과 동일하게 key-value를 통해 리소스의 특성을 기록
  • Kubernetes에게 특정 정보 전달할 용도로 사용
    • 예를 들어 Deployment의 rolling update 정보 기록

  • 관리를 위해 필요한 정보를 기록할 용도로 사용
    • 릴리즈, 로깅, 모니터링에 필요한 정보들을 기록
    • describe에서 정보 확인 가능

 

Annotation Example

  • annotation example pod 생성
    • kubectl create -f annotation-exam1.yaml
  • describe로 pod의 anootation 정보 확인
    • kubectl describe pod annon-pod

 

Reference

따배쿠31강

 

반응형
반응형

Node Label

  • Worker Node의 특성(ex.하드웨어 스펙)을 Label로 설정
    • kubectl label nodes <노드 이름> key=value
  • 노드를 선택해서 파드 배치 가능
    • 각 노드의 스펙이 다른 경우 파드에 적합한 노드를 선택하여 배치
      • 딥러닝이 돌아가는 컨테이너를 갖는 파드를 gpu가 있는 노드를 선택하여 배치해야 함

 

Node Label 관리 명령어

  • Label 보기
    • 전체 노드 Label 보기
      • kubectl get nodes --show-labels
    • 특정 Label 갖는 노드 보기
      • kubectl get nodes -L/--selector <label_name>
      • 해당 label을 갖는 노드 출력
      • -l이 selector 기능
  • Label 관리: kubectl label --help
    • Label 생성 및 변경
      • Label 할당 
        • kubectl label node <name> key=value
      • Label 복수 할당
        • kubectl label node <name> key=value key=value
      • 이미 존재하는 Label 위에 덮어쓰기 (--overwrite속성)
        • kubectl label node <name> key=value --overwrite
    • Label 확인
      • kubectl get node --show-labels
    • Label 제거
      • Label명 뒤에 -(대시문자)
      • kubectl label node <name> key-

 

Reference

따배쿠30강

 

반응형
반응형

Label

  • Node를 포함하여 pod, deployment 등 모든 리소스에 할당
  • 리소스의 특성을 분류하고, Selector를 이용해서 선택
    • 파드 이름만 갖고 특성을 분류하는데 한계가 존재
      • Main UI pod가 여러개 존재할 때 stable, beta, canary 중 어떤 버전인지 파드 이름만으로는 분류 불가
  • Key-value 한쌍으로 적용

 

Label과 Selector

  • Label

      metadata:

         labels:

            rel: stable

            name: mainui

  • Selector

      selector:

         matchLabels:

            key:value

         matchExpressions:

            - {key: name, operator: In, values: [mainui]}

            - {key: rel, operator: NotIn, values: ["beta","canary"]}

 

Label Template

  • Label 지정시 단순 문자열의 경우 ""없어도 됨
    • TRUE, FALSE, YES, NO 등의 값은 제외

 

Label 관리 명령어

  • Label 보기
    • 전체 파드 Label 보기
      • kubectl get pods --show-labels
    • 특정 Label 갖는 파드 보기
      • kubectl get pods -l/--selector <label_name>
      • 해당 label을 갖는 pod 출력
      • -l이 selector 기능
  • Label 관리: kubectl label --help
    • Label 생성 및 변경
      • Label 할당 
        • kubectl label pod <name> key=value
      • Label 복수 할당
        • kubectl label pod <name> key=value key=value
      • 이미 존재하는 Label 위에 덮어쓰기 (--overwrite속성)
        • kubectl label pod <name> key=value --overwrite
    • Label 확인
      • kubectl get pods --show-labels
    • Label 제거
      • Label명 뒤에 -(대시문자)
      • kubectl label pod <name> key-

 

 

Reference

따배쿠29강

 

반응형
반응형

Kubernetes Ingress 동작

 

Ingress 이용한 웹서비스 운영

  • Ingress Controller 설치
    • namespace 생성
    • nodePort 설정
    • Ingress Controller 파드 생성
  • Default namespace 치환: kubectl config
    • Ingress Controller의 namespace로 치환
  • 웹 서비스 동작
    • 기존에 Main Page, Pay Page 이미지 생성
  • Ingress 동작

 

Reference

따배쿠28강

 

반응형
반응형

Kubernetes Ingress

  • 쿠버네티스의 API 중 하나로 HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출
    • 여러 서비스를 통합하여 외부 노출
  • 기능
    • Serivce에 외부 URL을 제공
    • 트래픽을 로드밸런싱
    • SSL 인증서 처리
    • Virtual hosting을 지정

 

Kubernetes Ingress 동작방식

  • Main page, Login, Order 등 각 서비스들을 통합하여 외부에 연결해주는 관리자 역할 수행
  • ingress에 서비스를 묶은 룰 등록하여 각 서비스에 접속

 

Reference

따배쿠27강

반응형
반응형

Headless Service

  • ClusterIP가 없는 서비스로 단일 진입점이 필요 없을 때 사용
    • Pod들의 endpoint를 묶어주지만 IP는 x
  • Service와 연결된 Pod의 endpoint로 DNS 레코드가 생성됨
    • Pod들의 endpoint에 DNS resolving Service로 지원
  • Pod의 DNS 주소: pod-ip-addr.namespace.pod.cluster.local

 

Example

  • clusterIP가 None으로 설정되면 Headless Service
  • create -f를 통해 Headless Service 실행
    • kubectl create -f headless-nginx.yaml
  • get, describe를 통해  Headless Service확인
    • kubectl get service
    • kubectl describe svc headless-service
  • Pod Endpoint DNS 서비스 조회
    • kubectl run testpod -it --image=centos:7 /bin/bash
    • curl ip-addr.default.pod.cluster.local

 

kube-proxy

  • Kubernetes Service의 backend 구현
    • iptables 룰 생성
  • endpoint 연결을 위한 iptables 구성
  • nodePort로의 접근과 Pod 연결을 구현(iptables 구성)


kube-proxy mode

  • userspace
    • 클라이언트의 서비스 요청을 iptables를 거쳐 kube-proxy가 받아서 연결
    • kubernetes 초기버전에 잠깐 사용
  • iptables
    • default kubernetes network mode
    • kube-proxy는 service API 요청 시 iptables rule이 생성
    • 클라이언트 연결을 kube-proxy가 받아서 iptables 룰을 통해 연결
  • IPVS
    • 리눅스 커널이 지원하는 L4 로드밸런싱 기술을 이용
    • 별도의 ipvs 지원 모듈을 설정한 후 적용 가능
    • 지원 알고리즘: rr(round-robin), lc(least connection), dh(destination hashing), sh(source hashing), sed(shortest expected delay), nc

 

Reference

따배쿠26강

 

반응형
반응형

ClusterIP

  • selector의 label가 동일한 파드들을 그룹으로 묶어 단일 진입점 (Virtual IP)을 생성
  • 클러스터 내부에서만 사용 가능
  • type 생략 시 default 값으로 10.96.0.0/12 범위에서 할당 됨
    • type을 고정시키지 않는 이유: 충돌을 예방하기 위해

 

Example

  • create -f를 통해 ClusterIP Service 실행
    • kubectl create -f clusterip-nginx.yaml
  • get, describe를 통해  ClusterIP Service확인
    • kubectl get service
    • kubectl describe svc clusterip-service
  • curl 이용 ClusterIP 접속
    • curl 10.100.100.100
  • delete를 통해 ClusterIP Service 삭제 
    • kubectl delete svc clusterip-service

 

NodePort

  • 모든 노드를 대상으로 외부 접속 가능한 포트를 예약
    • ClusterIP는 클러스터 내부에서만 사용 가능한 반면 NodePort 이용시 해당 포트로 외부에서 접속 가능
    • NodePort는 외부에서 접근할 수 있도록 도움
  • Default NodePort 범위: 30000-32767
  • ClusterIP를 생성 후 NodePort를 예약

 

Example

  • create -f를 통해 NodePort Service 실행
    • kubectl create -f nodeport-nginx.yaml
  • get, describe를 통해  NodePort Service확인
    • kubectl get service
    • kubectl describe svc nodeport-service
  • curl 이용 외부 접속
    • curl node1.example.com:30200
  • delete를 통해 NodePort Service 삭제 
    • kubectl delete svc nodeport-service

 

LoadBalancer

  • Public 클라우드(AWS, Azure, GCP 등)에서 운영 가능
  • LoadBalancer를 자동으로 구성 요청
  • NodePort를 예약 후 해당 nodeport로 외부 접근을 허용

 

Example

  • create -f를 통해 LoadBalancer Service 실행
    • kubectl create -f loadbalancer-nginx.yaml
  • get을 통해  LoadBalancer Service확인
    • kubectl get service
  • delete를 통해 LoadBalancer Service 삭제 
    • kubectl delete svc loadbalancer-service

 

ExternalName

  • 클러스터 내부에서 External(외부)의 도메인을 설정
    • ExternalName은 DNS(Domain Name Service)를 지원
    • 클러스터 내부에서 외부로 나갈 수 있는 도메인 등록
    • 쿠버네티스 도메인이 외부 도메인으로 치환

 

Example

  • create -f를 통해 ExternalName Service 실행
    • kubectl create -f externalname.yaml
  • get을 통해  ExternalName Service확인
    • kubectl get service
  • curl 이용 쿠버네티스 도메인 접속 -> 외부 도메인 치환되어 접속 (클러스터 내의 pod에서 작동)
    • curl externalname-svc.default.svc.cluster.local
    • externalname-svc: ExternalName Service 이름
    • default.svc.cluster.local: 쿠버네티스 도메인
  • delete를 통해 ExternalName Service 삭제 
    • kubectl delete svc externalname-svc

 

Reference

따배쿠25강

 

반응형
반응형

Kubernetes Service 개념

  • 동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공
    • 하나의 pod에 작업이 집중되면 다른 pod는 놀고 있어 성능 저하
    • 모든 pod에 균등하게 작업을 분산해야 함
  • 같은 레이블을 갖는 Pod의 ip를 하나의 Virtual IP로 묶음

 

Service Definition

  • Deployment Definition으로 Pod 생성
  • Service Definition으로 같은 레이블의 Pod에 작업 균등 분배
    • ClusterIP 설정
    • port는 ClusterIP의 포트
    • target port는 Pod의 포트

 

Service Type

  • 4가지 타입 지원
    • ClusterIP(default)
      • Pod 그룹의 단일 진입점(Virtual IP) 생성
    • NodePort
      • ClusterIP가 생성된 후 모든 워커 노드에 외부에서 접속가능한 포트 설정
    • LoadBalancer
      • 클라우드 인프라스트럭처(AWS, Azure, GCP 등)나 오픈스택 클라우드에 적용
      • LoadBalancer를 자동으로 프로 비전하는 기능 지원
    • ExternalName
      • 클러스터 안에서 외부에 접속 시 사용할 도메인을 등록해서 사용
      • 클러스터 도메인이 실제 외부 도메인으로 치환되어 동작

 

Reference

따배쿠 24강

 

반응형

+ Recent posts