01. Java
02. git
03. Database
04. Jsp [Server]
05. HTML,CSS
07. JS
06. 미니프로젝트-2W
08. SpringFramework , SrpingBoot
19. 중간프로젝트 (1M)
10. Linux 명령어
11. AWS
12. Docker
13. Kubernetes(v)
14. React JS [Front-end]
15. App - Android
16. 최종프로젝트 (1M)
# first.yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: webapp # ReplicaSet 객체의 "이름"입니다 (Service와 무관) spec: selector: matchLabels: app: webapp # 아래에 있는 template.labels.app과 연결되서 파드 관리 replicas: 1 template: # 복제할 포드를 템플릿으로 정의함 metadata: labels: app: webapp # 서비스와 연결 spec: containers: - name: webapp image: coding404/k8s-coding404-webapp-react:v0-1
kind: ReplicaSet
: 리소스의 유형이 레플리카셋임selector.matchLabels
: 레플리카셋이 관리할 Pod를 고르는 기준replicas
: 유지하려는 Pod 복제본 수template
: 레플리카셋이 복제할 Pod의 템플릿spec.containers
: 생성할 Pod 안에 실행할 컨테이너 목록
롤아웃
: 새 버전을 점진적으로 배포하는 전체 과정롤링배포
: 기존 인스턴스를 조금씩 교체하며 배포
apiVersion: apps/v1 kind: Deployment metadata: name: webapp spec: minReadySeconds: 30 # Pod가 Ready 상태가 된 후에도 최소 30초간 더 기다려야 다음 단계로 넘어감. selector: matchLabels: app: webapp # 아래에 있는 template.labels.app과 연결되서 파드 관리 replicas: 2 template: # 복제할 포드를 템플릿으로 정의함 metadata: labels: app: webapp # 내가 service와 연결됨~~ spec: containers: - name: webapp # image: coding404/k8s-coding404-webapp-react:v0 # 기존버전 image: coding404/k8s-coding404-webapp-react:v0-1 # 버전을 올려봅니다
kubectl rollout status deploy 디플로이명
kubectl rollout restart deploy 디플로이명
kubectl rollout history deploy 디플로이명
kubectl rollout undo deploy 디플로이명 # 바로직전으로 롤백
kubectl rollout undo deploy 디플로이명 --to-revision=1
- 포드의 관리가 더 복잡해질 수 있음
- 포드에서 문제 발생시, 어느 컨테이너에서 발생한 문제인지 찾기 어려움
- 서비스가 포드에 종속됨
항목 ClusterIP NodePort 기본목적 클러스터 내부통신전용 외부에서 클러스터안으로 접속허용 접근가능위치 클러스터내부에서만접근가능 외부(노드IP+포트)에서 접근가능 할당되는 IP 클러스터내 가상IP(ClusterIP) 각Node에 열린 고정포트(30000~32767) 트래픽흐름 내부Pod → Service → 연결된Pod 외부요청(NodeIP:Port) → Node → Service → Pod 사용예시 마이크로서비스 내부호출용 간단한 테스트용 외부오픈, 작은서비스용
네임스페이스는 각 포드들을 식별하기 위한 이름
네임스페이스를 넣지 않으면 default에 네임스페이스를 지정하고, 리소스들만 표시 되게됨
쿠버네티스 리소스를 논리적으로 구분하기 위한 폴더 또는 프로젝트 영역 같은 역할
네임스페이스 목록보기
kubectl get ns
kubectl get all -n kube-system
- pod에 데이터베이스 설치 후 service연결
# postgres.yaml apiVersion: v1 kind: Pod metadata: name: postgres labels: app: postgres spec: containers: - name: postgres image: postgres:14 # 포스트그레 공식 도커 이미지 env: - name: POSTGRES_USER # 초기슈퍼사용자 유저명 value: "postgres" - name: POSTGRES_PASSWORD # 비밀번호 value: "1234" - name: POSTGRES_DB # 기본 데이터베이스 이름 value: "postgres" - name: PGDATA # 데이터 저장 경로 (선택적) value: "/var/lib/postgresql/data/pgdata" --- kind: Service apiVersion: v1 metadata: name: database-postgres spec: selector: app: postgres # 메타데이터의 label값 ports: - name: dbport port: 5432 type: ClusterIP # 외부에서는 볼 수 없고, 내부에서 다른 pod가 참조할 수 있도록 함
- webapp pod안으로 들어가서 database서비스 발견
- 웹앱 파드로 접속
kubectl exec -it pod pod명 -- sh
- DNS이름이 확인 가능한 파일 열어보기
cat /etc/resolv.conf
- kube-dns에 database의 아이피주소 요청
nslookup database-postgres
- webapp내부(리눅스) 에서 database연결
apk update apk add postgresql-client
- postgres 접속 데이블생성
# -h 접속아이피 # -U 유저명 # -d 데이터베이스명 psql -h database-postgres -U postgres -d postgres # 비밀번호 1234 # 테이블 생성 create table example (test varchar(255)); # 테이블 확인하기 \dt
- default 네임스페이스라면, 컨테이너를 구분하는 주소는
<컨테이너명>.default.svc.cluster.local
- default 네임스페이스가 아니라면, 컨테이너를 구분하는 주소는
<컨테이너명>.<네임스페이스>.svc.cluster.local
- 서비스를 찾을 떄 동일한 namespace에 할당되어 있다면, 오브젝트명으로 연결이 가능
- 하지만, 다른 namespace에 등록된 서비스를 찾는다면
오브젝트명.네임스페이스명.svc.cluster.local
형태로 연결해야함