CKA Study Day 3

김건호·2023년 3월 28일
0

28-35

컨트롤러 쿠베의 두뇌

모닡러링 그에 따른 반응 프로세스
Replication Controller

왜 필요한가
앱 실행 단일 파드
앱다운 -> 접속 불가
액세스 일ㅎ지 않도록 하나이상의 파드 실행되어야함
rs 다중 앱 실행 -> 고가용성 보장
파드 1개여도 쓸 수 있음 하나여도 레플리가 기존 파드가 고장 낫을때 자동으로 새 파드로 불러옴
특정 개수 파드 실행되도록 보장함
2번째 이유
로드밸런싱 스케일링
사용자 증가시 파드 더 설치하여 스케일링 노드 리소스꽉차면 다른 노드에 새로운 파드 실행
여러 노드로 뻗어 있음

Replication contreller vs Replica Set
옛날 기술 set으로 대체중

생성방법

apiVersion: v1
kind: ReplicaController
metadata:
  name: myapp-rc
  labels:
    app: myapp
    type: front-end
spec:
  replicas: 3 ( 필요한 만큼의 복제본 수 )
  template: ( 컨트롤러가 복제할 파드를 만들기 위한 템플릿 )
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
        

kubectl create -f rc-definition-yml
kubectl get replicationcontroller
kubectl get pods


replicaset

apiVersion: apps/v1 ( 다를 경우 error: unable to recognize "replicaset-definition.yaml": no matches for/, Kind=RepliacSet 발생 )
kind: ReplicaSet
metadata:
  name: myapp-rs
  labels:
    app: myapp
    type: front-end
spec:
  replicas: 3 ( 필요한 만큼의 복제본 수 )
  template: ( 컨트롤러가 복제할 파드를 만들기 위한 템플릿 )
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
   selector: 파드 식별 기능 왜? 복제본이 아닌 파드도 관리할 수 있음
   레이블과 셀렉터 일치 전에 파드가 생성 되었을 경우때문에
     matchLabels:
       type: front-end
        

kubectl create -f repliaset-definitoion .yaml
kubectl get pods

레이블 셀렉터
프론트엔드 파드 3개 실해중인 파드 3개라고 생각하며 유지
파드 모니터 고장나면 새프다 배포
어떤 파드를 모니터할지? 레이블을 붙이는게 중요

스케일
repliacas 6개로 늘리면 복제본 수 6개로 업데이트
kubectl replace -f rs.yaml
kubectl scale --replicas=6 -f rs.yaml
kubectl scale --replicas6 rs myapp-rs < - 파일은 안바뀜

commands

kubectl create -f rs.yaml
k get rs
k delete rs myapp-rs
k replace -f rs.yaml
k scale --replicas-6

연습문제

deployment

프로그램을 어떻게 배포할지
프로덕션 환경에 배포 -> 한개가 아닌 여러개의 웹 앱
2 도커 허브 이미지 업데이트 될때마다 업그레이드 -> 하나씩 롤링 업데이트 해야함
변경점 롤백 가능
명령 실행 시 바로 적용 X -> 유예기간 후에 롤 아웃

생성방법

apiVersion: apps/v1 ( 다를 경우 error: unable to recognize "replicaset-definition.yaml": no matches for/, Kind=RepliacSet 발생 )
kind: Deployment
metadata:
  name: myapp-rs
  labels:
    app: myapp
    type: front-end
spec:
  replicas: 3 ( 필요한 만큼의 복제본 수 )
  template: ( 컨트롤러가 복제할 파드를 만들기 위한 템플릿 )
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
   selector: 파드 식별 기능 왜? 복제본이 아닌 파드도 관리할 수 있음
   레이블과 셀렉터 일치 전에 파드가 생성 되었을 경우때문에
     matchLabels:
       type: front-end
        

연습문제

서비스

services
앱과 컴포넌트간의 통신
앱과 사용자간의 통신

프론트 엔드 그룹
백엔드 그룹
데이터 소스 연결 그룹

백엔드와 프론트엔드 연결설정 데이터베이스와 연결 설정

예시 내부네트워크로 공유 파드가 아니라
외부사용자 웹 접근 법
노드 아이피가 있고 192.168.1.2노트북도 같은 대역대 192.168.1.10
vkemsms 10.244.0.2 노트북에서 접근 불가

노드에서 curl http://10.244.0.2 가능 혹은 노드에 gui가 있다면 가능
이건 쿠베 안에서

노드에 ssh 없이 웹서버 적븐
노드에 ip에 접근함으로 중간에 도움이 필요 -> 서비스 필요
노드포트 30038 서비스가 파드로 요청

  • 노드포트 노드의포트를 내부의포트로 연결
  • 클러스터 아이피 가상 아이피로 서비스 간의 통신 가능하게 fe와 백엔드와
  • 로드밸런서 : 로드 밸런스 프로비전

노드포트

노드포트와 서비스포트를 매핑

실제 웹서버 실행 포트 80 타겟 포트 요청을 포워드하니까 Target Port
서비스 자체 포트 Port 클러스터 IP고유의 주소
외부에서 접근하는 노드포트

총 3가지가 있음 노드포트는 유효범위가 있음 30000-32767

생성방법

svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  
spec: 실제 서비스 정의
  type: NodePort
  port:
    - tagretPort: 80 < 없으면 port랑 같다고 생각
      port: 80
      nodePort: 30008 < 없으면 범위내의 포트 자동 할당
  selector:
    app: myapp
    type: front-end < 파드와 연결하기 위함, 80으로 연결되는 파드는 많음-> 파드를 직접 지정해줘야함

kubectl get svc

파드가 여러개라면? 모두 같은 레이블 키 앱 값 설정 시 레이블이 있는 파드찾아 3개를 찾음
서비스는 자동적으로 3개의 파드의 엔드포인트 선택에 외부 요청을 보냄 -> 추가 구성 할 필요 없음
부하 분산 알고리즘
Algorithm: Random
SessionAffinity: Yes
서비스가 다른 파드에에 로드밸런싱함

다중 노드에 파드가 분산되면?

서비스 생성시 클러스터내 모든 노드를 가로질러 같은 노드에 매핑함

시험 팁 커맨드로 리소스 생성

Create an NGINX Pod

kubectl run nginx --image=nginx

Generate POD Manifest YAML file (-o yaml). Don't create it(--dry-run)

kubectl run nginx --image=nginx --dry-run=client -o yaml

Create a deployment

kubectl create deployment --image=nginx nginx

Generate Deployment YAML file (-o yaml). Don't create it(--dry-run)

kubectl create deployment --image=nginx nginx --dry-run=client -o yaml

Generate Deployment YAML file (-o yaml). Don’t create it(–dry-run) and save it to a file.

kubectl create deployment --image=nginx nginx --dry-run=client -o yaml > nginx-deployment.yaml

Make necessary changes to the file (for example, adding more replicas) and then create the deployment.

kubectl create -f nginx-deployment.yaml



OR

In k8s version 1.19+, we can specify the --replicas option to create a deployment with 4 replicas.

kubectl create deployment --image=nginx nginx --replicas=4 --dry-run=client -o yaml > nginx-deployment.yaml
profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

0개의 댓글