Post

Linux 쿠버네티스(4)

Linux 쿠버네티스(4)

인그레스

인그레스는 하나의 IP or Domain으로 다수의 서비스 제공

  • 서비스(LB) = L4
  • 인그레스 = L7

ALB(L7) == WEB 부하분산
Network Load Balancer(L4) == 일반 서비스 부하분산

인그레스

  • 트래픽 부하분산 경로 기반 라우팅(ex. /, /home, /pay, /login)
  • 도메인 기반 라우팅
  • SSL/TLS 인증서 처리

인그래스 아키텍쳐

  • Ingress Controller
    • Ingress RUles
    • Input: {Ingress service}:80 (kubectl get ingress -w, kubectl get svc -n ingress-nginx)
    • Output: {Service NAme}:80 (kubectl describe ingress homepay-ingress)
  • service(Cluster IP)
    • Input: {service name}:80 (kbuectl describe svc pay-service)
    • Output: {pod’s label}:80 (kubectl describe svc pay-service)
  • Deployment(RepplicaSet, Pod)

인그레스 설치

  • kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml

인그레스 작업

  • vi deploy.yaml
  • vi svc.yaml
  • vi ingress.yaml
  • kubectl apply -f deploy.yaml -f svc.yaml -f ingress.yaml
  • kubectl get ingress -w
  • kubectl get svc -n ingress-nginx
  • curl IP:PORT

쿠버네티스 io 사이트 보기

레이블 & 에너테이션

  1. 레이블(label)
    • [참고]label과 selector
    • [참고]label과 namespace
    1. label
      • 레이블은 3개 이상 정의할 것을 권장한다
      • 예) environment=prod, tier=fronted, release=stable, team=devops1
    2. 레이블 관리
      • kubectl label pods POD key1=value1 key2=value2 [–overwrite]
      • kbuectl get pods POD –show-labels
      • kubectl label pods POD key-
  2. 노드 레이블(Node label)
    1. 노드 레이블(Node Label)
      • kubectl label nodes NOD key1=value1 key2=value2 [–overwrite]
      • kubectl get nodes –show-labels
      • kubectl label nodes NODE key-
    2. 노드 셀렉터
      • vi nodeselector.yaml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
       apiVersion: v1
       kind: Pod
       metadata:
         name: pod-nodeselector
       spec:
         nodeSelector:
           gpu: "true"
           disk: ssd
         containers:
         - name: nginx
           image: nginx:1.14
           ports:
           - containerPort: 80
      

    pod에 라벨 설정하기

    1. yaml 파일 변경 적용
    2. kubectl edit 명령을 사용하여 변경
    3. kubectl -l(–label) 명령 사용하여 변경
  3. 애너테이션(Annotation)
    1. Annotation
      • 애너테이션은 key, value 쌍으로 정의한다
      • 쿠버네티스에게 특정 정보 전달할 용도록 사용
      • ex. annotations: kubenernetes.io/change-cause: nginx:1.14 - 관리를 위해 필요한 정보를 기록할 용도로 사용
      • ex. annotations:
        • builderL BSC
        • builddata: “2024-0403”
        • imgageregistry: “hub.docker.com”
    • [참고] 레이블 vs 애너테이션
      • 레이블: 클러스터를 관리할때 관리하는 값을 입력한다.
      • 애너테이션: 클러스터 필요한 정보를 표시하는데 사용한다.

배포 전략의 종류

  • Blue-Green update : 새로운 거를 아예 새로 만들어서 옮김
  • Cannary Update : 전체 노드에서 10~20%만 새로 만들어서 배포. 후에 문제가 생기면 수정해서 나중에 새로운 것으로 점진적으로 바꿈
    → 상위 두개는 레이블로 구현 가능
  • Rolling Update : 순차적으로 새로운 것을 지웠다가 다시 깖(기본기능 버전이 아닌 레이블을 보기 때문에 괜찮음.

컨피그맵(config map)

[참고] variable vs configmap

  • 변수(variable) : 특정 파드에 변수값을 설정할 때 사용
  • 컨피그맵(configMap): 네임스페이스안에 파드에 대한 전역 변수값을 설정할 때 사용

[참고] configmap vs secret

  • 컨피그맵(configmap): 일반 설정(전역 인증서)
  • 시크릿(secret): 민감한 설정/데이터(예: 아이디/비밀번호, 인증서, 토큰 …)
  1. 컨피그맵
    • 키-값 쌍으로 정의한다
    • 네임스페이스안에 실행되는 파드에서 공통적으로 사용한다.(파드 밖에서는 안됨)
    • 주로 설정하는 것
      • 변수(interval=2)
      • 설정 파일(nginx.conf)
      • 전역 인증서(rootCA)
  2. 컨피그맵 정의 방법
    • 명령어 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     # 정의
     kubectl create cm cmname --from-literal key=value \ # 글자로 설정
     --from-file nginx.conf \        # 파일안에 있는 것이 변수와 값
     --from-file myconf=ngix.conf \  #변수=파일안의 값
     --from-file confdir/            # 디렉토리 안의 파일이름=변수 파일내용=값
    
     # 확인
     kubectl get cm #cm 목록
     kubectl describe cm cmname # cmname 안에 있는 내용
    
    • 파일 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     $ vi cm.yaml
     ----
     kind: ConfigMap
     apiVersion: v1
     metadata: 
       name: cmname
     data: 
       key: value
       nginx.conf: |
         server config 1
         server config 2
       mydata: |
         server config 1
         server config 2
    
  3. 컨피그맵 사용 방법
    1. 컨피그맵 일부 참조하기
      • 환경 변수
      1
      2
      3
      
       env:
       - name: INTERVAL
         value: 2
      
      • 컨피그맵에서 일부 참조하기
      1
      2
      3
      4
      5
      6
      
       env:
       - name: INTERVAL
         valueFrom:
         - configMakeKeyRef:
             name: test-config
             key: INTERVAR
      
    2. 컨피그맵 전체 참조하기
      • 컨피그맵에서 전체 참조하기
      1
      2
      3
      4
      5
      
       env:
       - name: INTERVAL
         envFrom:
         - configMapRef:
             name: test-config
      

시크릿(Secret)

[참고] configmap vs secret

  • 컨피그맵(configmap): 일반 설정(전역 인증서)
  • 시크릿(secret): 민감한 설정/데이터(예: 아이디/비밀번호, 인증서, 토큰 …)
  1. 시크릿
    • 키-값 쌍으로 정의
    • 네임스페이스에 영향을 받음
    • 주로 설정하는 것
      • docker-registry 인증 정보
      • TLS 인증서
  2. 시크릿 정의 방법
    • 명령어 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     # 정의
     kubectl create secrets secname --from-literal key=value \ # 글자로 설정
     --from-file nginx.conf \        # 파일안에 있는 것이 변수와 값
     --from-file myconf=ngix.conf \  #변수=파일안의 값
     --from-file confdir/            # 디렉토리 안의 파일이름=변수 파일내용=값
    
     # 확인
     kubectl get secrets #시크릿 목록
     kubectl describe secrets secname # secname 안에 있는 내용
    
    • 파일 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     $ vi secrets.yaml
     ----
     kind: Secret
     apiVersion: v1
     metadata: 
       name: secname
     data: 
       key: $(echo 2 | tr -d "\n" | base64)
       nginx.conf: $(cat nginx.conf | base64)
       mydata: $(cat nginx.conf | base64) 
     # 한 칸이라도 더 들어가거나 덜 들어가면 틀린 것이 됨!
    
  3. secret 사용 방법
    1. 시크릿 일부 참조하기
      • 환경 변수
      1
      2
      3
      
       env:
       - name: INTERVAL
         value: 2
      
      • 시크릿에서 일부 참조하기
      1
      2
      3
      4
      5
      6
      
       env:
       - name: INTERVAL
         valueFrom:
         - configMakeKeyRef:
             name: test-config
             key: INTERVAR
      
    2. 시크릿 전체 참조하기
      • 시크릿에서 전체 참조하기
      1
      2
      3
      4
      5
      
       env:
       - name: INTERVAL
         envFrom:
         - configMapRef:
             name: test-config
      
This post is licensed under CC BY 4.0 by the author.