일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 팩토리 패턴 예제
- mysql index 속도차이
- 개발자 전직
- index in
- 개발자 취업 준비
- 라즈베리바이4 mongo
- mongo 4.4
- 회고록
- 신입 개발자 면접
- 개발자 면접 팁
- ECS
- mongo 4.4.18
- 신입 면접 팁
- 밸런스 게임
- 개발자 회고록
- kubernetes
- token 탈취
- OSI 7계층
- 퇴사
- 인텔리제이 github 로그인
- index like
- github accesstoken
- nestjs
- mysql like
- aws m2
- 팩토리 패턴 언제
- 쿠버네티스
- VUE
- docker m2
- git
- Today
- Total
주니어 개발자 1호
[Chapter 3]쿠버네티스 스터디 2주차 - ( 클라우드 조정 ) 본문
학습목표
kubectl을 사용하여 Dokcer 컨테이너를 배포하고 관리합니다. 쿠버네티스의 디폴리어먼트 및 서비스를 사용하여 애플리케이션을 마이크로서비스로 분할합니다
개념 정리
[ Pods ]
1개 이상의 컨테이너가 포함된 모음. 서로 상호작용하며 동작하는 컨테이너를 모아둔 단위 포드에는 불룜 ( 컨테이너에 있는 임시파일 ) 또한 공유하며, 컨테이너에 의해 사용될 수 있음. 포드는 1개의 IP주소를 갖음 이는 클러스터 밖에서 접근할 수 없습니다. kubectl port-forward 명령어를 통해 로컬 port를 모놀리식 pod안의 port로 매핑함
[ Service ]
서비스를 통해 포드의 안정적인 엔드포인트를 제공합니다. Pod는 영구적으로 지속되지 않으며, 다양한 이유로 중지될 수 있습니다. 포드가 다시 시작되며 IP 주소가 바뀔 수도 있습니다.
라벨을 사용하여 어떤 포드에서 작동할지 포드 집합에 대한 액세스 수준은 서비스 유형에 따라 다르며, 3가지 유형이 있습니다.
- ClusterIP(내부) -- 기본 유형이며 이 서비스는 클러스터 안에서만 볼 수 있습니다.
- NodePort 클러스터의 각 노드에 외부에서 액세스 가능한 IP 주소를 제공합니다.
- LoadBalancer는 클라우드 제공업체로부터 부하 분산기를 추가하며 서비스에서 유입되는 트래픽을 내부에 있는 노드로 전달합니다.
[ deployment ]
실행 중인 포드의 개수가, 사용자가 명시한 포드 개수와 동일하게 만드는 선언적 방식 백그라운드에서 replicaset 을 사용하여 pod의 시작 및 중지를 관리 Pod을 업데이트 하거나 확정하는 경우 배포가 이를 처리합니다. 특정 Node가 중단되면 포드또한 같이 중단되며, 직접 새로운 포드를 만들고 이를 위한 노드를 찾는 대신에 다른 Node에서 새로운 포드를 만들고 실행합니다.
API 목록
- kelseyhightower/monolith - 모놀리식 , Auth 및 Hello 서비스
- kelseyhightower/auth - auth 마이크로 서비스, 인증된 사용자를 위한 JWT 토큰 생성
- kelseyhightower/hello - hello 마이크로 서비스, 인증된 사용자를 안내
- ngnix - auth 및 hello 의 프론트엔드 웹 서버 엔진
작업 순서
- 코드 복사
- 쿠버네티스 데모
- Pod 만들기
- Pod 상호 작용
- 서비스 만들기
- 포드에 라벨 추가하기
- deployment 만들기
1️⃣ 코드 복사
# github 저장소 클론
gsutil cp -r gs://spls/gsp021/* .
# orchestrate-with-kubernetes/kubernetes 경로로 진입
cd orchestrate-with-kubernetes/kubernetes
# 파일 목록 확인
ls
# 결과
# -----
deployments/ /* 디플로이먼트 매니페스트 */
nginx/ /* nginx 구성 파일 */
pods/ /* 포드 매니페스트 */
services/ /* 서비스 매니페스트 */
tls/ /* TLS 인증서 */
cleanup.sh /* 정리 스크립트 */
# -----
2️⃣ 쿠버네티스 데모
# nginx imag 1.10.0을 사용하여, 인스턴스를 실행 및 배포
kubectl create deployment nginx --image=nginx:1.10.0
# 실행되고 있는 pods
kubectl get pods
# port 외부 노출 ( 80 port로 라우팅 )
kubectl expose deployment nginx --port 80 --type LoadBalancer
# 서비스 나열, External IP 확인
kubectl get services
# IP:PORT 로 확인
curl http://<External IP>:80
3️⃣ Pod 만들기
# monolith.yaml 파일 열기
cat pods/monolith.yaml
# 파일 열기 결과
# 특징
# 포드가 1개의 컨테이너로 구성되어 있음 ( monolith )
# listen port 80
# ----
apiVersion: v1
kind: Pod
metadata:
name: monolith
labels:
app: monolith
spec:
containers:
- name: monolith
image: kelseyhightower/monolith:1.0.0
args:
- "-http=0.0.0.0:80"
- "-health=0.0.0.0:81"
- "-secret=secret"
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
resources:
limits:
cpu: 0.2
memory: "10Mi"
# ----
# monolith pod를 생성
kubectl create -f pods/monolith.yaml
# pod 확인
kubectl get pods
# pods 정보 확인
kubectl describe pods monolith
4️⃣ Pod와 상호 작용
두번째 터미널에사 아래 실행
# Port forward
kubectl port-forward monolith 10080:80
첫번째 터미널에서 crul을 사용하여 통신
# 통신 테스트
curl <http://127.0.0.1:10080>
# 결과 { message : 'hello' } ( 매핑됨을 확인 )
# secure api 확인 -> 실패 ( token이 존재하지 않음 )
curl <http://127.0.0.1:10080/secure>
# 로그인 하여 token 확인 , 비밀번호 password
curl -u user <http://127.0.0.1:10080/login>
# token을 환경변수로 담음
TOKEN=$(curl <http://127.0.0.1:10080/login> -u user|jq -r '.token')
# token을 headers Authoriztion: Bearer 'Token'으로 세팅하여 전달 -> 성공
curl -H "Authorization: Bearer $TOKEN" <http://127.0.0.1:10080/secure>
# 로그 확인 ( monolith )
kubectl logs monolith
# 세번째 터미널 아래 명령어 입력 ( log에 대한 follow 옵션 )
kubectl logs -f monolith
# 첫번째 터미널 에서 통신 테스트 이후 세번째 터미널에서 확인하면
# 로그가 업뎃됨을 확인
curl <http://127.0.0.1:10080>
# exec명령어를 통해 대화형 셸 싱행
# stdin 표준입출력
# tty 터미널
kubectl exec monolith --stdin --tty -c monolith /bin/sh
# ping 테스트 ( 3회 실행되고 탈출 )
ping -c 3 google.com
exit
5️⃣ 서비스 만들기
# 디렉토리 돌아감
cd ~/orchestrate-with-kubernetes/kubernetes
# secure monolith 서비스 구성 파일 확인
cat pods/secure-monolith.yaml
# tls 설정 ( 인증서 )
# nginx 설정 ( 인것으로 추정 )
# pod 생성 - secure-monolith
kubectl create secret generic tls-certs --from-file tls/
kubectl create configmap nginx-proxy-conf --from-file nginx/proxy.conf
kubectl create -f pods/secure-monolith.yaml
# monolith 서비스 구성 파일 확인
cat services/monolith.yaml
# 결과
# 1. app:monolith / secure: enabled 라벨이 지정된 포드를 찾고,
## 노출 시키는 selector 존재
# 2. 외부 트래픽을 port 31000에서, 443의 nginx로 전달하기 위해
## NodePort를 노출 시켜야 합니다.
# ----
kind: Service
apiVersion: v1
metadata:
name: "monolith"
spec:
selector:
app: "monolith"
secure: "enabled"
ports:
- protocol: "TCP"
port: 443
targetPort: 443
nodePort: 31000
type: NodePort
# ----
# 모놀리식 포드 생성
kubectl create -f services/monolith.yaml
# 방화벽 허용 -> tcp:31000 허용
gcloud compute firewall-rules create allow-monolith-nodeport \\
--allow=tcp:31000
# node service 한개의 외부 ip 가져옴
gcloud compute instances list
# curl 테스트
curl -k https://<EXTERNAL_IP>:31000
# 실패사유 ?
# forward 되지 않음 ( 엔드포인트가 없음 )
6️⃣ 포드에 라벨 추가하기
# 잘 이해가 가지 않는 부분
# 모놀리식 라벨이 지정된 포드를 확인
kubectl get pods -l "app=monolith"
# 결과 -> 1개 이상
# 모놀리식, secure 라벨이 지정된 포드 확인
kubectl get pods -l "app=monolith,secure=enabled"
# 결과 -> 0개
# label 추가
kubectl label pods secure-monolith 'secure=enabled'
kubectl get pods secure-monolith --show-labels
# monolith 서비스의 엔드포인트 확인
kubectl describe services monolith | grep Endpoints
# node service 중 하나를 조회하여 엔드포인트 테스트
gcloud compute instances list
curl -k https://<EXTERNAL_IP>:31000
7️⃣ deployment 만들기
- auth - 인증된 사용자를 위한 JWT 토큰을 생성합니다.
- hello - 인증된 사용자를 안내합니다.
- frontend - 트래픽을 auth 및 hello 서비스로 전달합니다.
# 목적:
# 모놀리식과 같은 방식으로 마이크로 서비스와 상호작용이 가능
# 각 서비스를 독립적으로 확장하고 배포할 수 있음
# auth 검토
cat deployments/auth.yaml
# 1. auth 2.0.0 버전 컨테이너
# ---
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth
spec:
selector:
matchlabels:
app: auth
replicas: 1
template:
metadata:
labels:
app: auth
track: stable
spec:
containers:
- name: auth
image: "kelseyhightower/auth:2.0.0"
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
...
# ---
# deployments 개체 생성
kubectl create -f deployments/auth.yaml
# deploymetns 서비스 생성
kubectl create -f services/auth.yaml
# hello 에 대한 개체와 서비스도 동일하게 생성
kubectl create -f deployments/hello.yaml
kubectl create -f services/hello.yaml
# frontend 에 대한 개체와 서비스도 동일하게 생성
kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml
# frontend에 대한 서비스 확인
kubectl get services frontend
# external ip 테스트
curl -k https://<EXTERNAL-IP>
확인 링크
- pods : https://kubernetes.io/docs/concepts/workloads/pods/
- service : https://kubernetes.io/docs/concepts/services-networking/service/
- deployments : https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#what-is-a-deployment
- replicasets : https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
'Server 관련' 카테고리의 다른 글
[Chapter 5]쿠버네티스 스터디 4주차 - ( CD - 지속적배포 ) (0) | 2022.07.22 |
---|---|
[Chapter 4]쿠버네티스 스터디 3주차 - ( 배포 관리 ) (0) | 2022.07.16 |
[Chapter 2]쿠버네티스 스터디 1주차 - ( 클러스터 생성 ) (0) | 2022.07.03 |
어이 없는, Mongoose 연결 오류 in Nestjs (0) | 2022.07.01 |
[Chapter 1]쿠버네티스 스터디 1주차 - Docker (0) | 2022.06.30 |