Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

JINIers

[PCK] Orchestrating the Cloud with Kubernetes lab(쿠버네티스로 오케스트레이션) 본문

GCP/Qwiklabs

[PCK] Orchestrating the Cloud with Kubernetes lab(쿠버네티스로 오케스트레이션)

JINIers 2022. 1. 31. 17:12

※ 수정

220921


목표

1. GKE 사용하여 쿠버네티스 클러스터 프로비저닝
2. kubectl 이용 docker 컨테이너 배포 및 관리
3. 쿠버네티스 배포 및 서비스를 사용하여 어플리케이션을 마이크로서비스로 나눔


실습 시작

1. 설정 및 요구사항

#클라우드 인증목록
gcloud auth list

#클라우드 프로젝트 목록
gcloud config list project

 

구글 쿠버네티스 엔진

#영역설정
gcloud config set compute/zone us-central1-b

#실습에 사용할 클러스터 생성
gcloud container clusters create io

2. 샘플코드 받기

# gitjub 저장소 복제
gsutil cp -r gs://spls/gsp021/* .

#디렉터리 변경
cd orchestrate-with-kubernetes/kubernetes

ls

3. 빠른 kubernetes 데모

nginx 컨테이너의 단일 인스턴스 시작

kubectl create deployment nginx --image=nginx:1.10.0


실행중인 포드(nginx containar) 확인

kubectl get pods

 

컨테이너 쿠버네티스 외부에 노출하기

kubectl expose deployment nginx --port 80 --type LoadBalancer


서비스 나열

kubectl get services

 

nginx 컨테이너를 원격으로 하기 위한 외부 ip 추가

curl http://<nginx External IP>:80

* 대충 한 1분정도 기다리면 external ip 뜸


4. 포드

kubeernetes의 핵심 : Pods

- pod는 하나 이상의 컨테이너 컬렉션을 나태고 보유함

- 일반적으로 서로에 대한 의존도가 높은 여러 컨테이너가 있는 경우, 컨테이너를 단일 포드 안에 패키징함

-volumes도 있음

 * volumes : 포드가 살아있는 동안 지속되는 데이터 디스크, 해당 포드의 컨테이너에서 사용 가능

- 콘텐츠에 대한 공유 네임스페이스를 제공(

- 네트워크 네임스페이스 공유(포드 당 하나의 ip 주소가 있음을 의미)


5. 포드 생성

#포드 구성파일 출력
cat pods/monolith.yaml

#모놀리스 포드 만들기
kubectl create -f pods/monolith.yaml

#포드 나열
kubectl get pods

#모놀리스포드에 대한 추가정보 확인
kubectl describe pods monolith

kubectl describe pods monolith


6. 포드와 상호작용

 

두번째 터미널에서 실행, 포트 전달 설정(=로컬포트를 모놀리스 포드 내부 포트에 매핑)

kubectl port-forward monolith 10080:80

 

첫번째 터미널에서 실행, 포드와 대화 시작 (hello 뜨면 성공)

curl http://127.0.0.1:10080

curl http://127.0.0.1:10080

 

보안 엔드포인트에 도달했을 때 어떤 일이 발생하는 지 확인

curl http://127.0.0.1:10080/secure

curl http://127.0.0.1:10080/secure

 

모놀리스 인증토큰 다시 받기

curl -u user http://127.0.0.1:10080/login



비밀번호 'password' 입력

 

토큰 환경변수 만들기

TOKEN=$(curl http://127.0.0.1:10080/login -u user|jq -r '.token')


다시 비밀번호 'password' 입력

환경변수 입력 후 pw 입력

 

복사 토큰 사용보안 끝점에 도달하기

curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure


모노리스 로그 보기

kubectl logs monolith

모노리스 로그보기

 

세번째 터미널에서 사용, 실시간으로 발생하는 로그스트림 보기

kubectl logs -f monolith

세번째 터미널 로그 확인

 

첫번째 터미널, 로그 업데이트 명령 시

curl http://127.0.0.1:10080

두번째 터미널

 

monolith pod 내 대화형 셸 실행

kubectl exec monolith --stdin --tty -c monolith /bin/sh



이것저것 할 수 있음 가령 핑테스트라던가 핑테스트라던가 핑테스트 같은..(할 줄 아는게 그것뿐이라 눈물이 난다 하

ping -c 2 google.com



그럼 핑 가겠지.. exit로 빠져나옴


7. 서비스

service

 

서비스 : pod에 안정적인 엔드포인트 제공

- 레이블을 사용하여 작동하는 pod 결정

   * pod에 올바른 레이블이 있으면 자동으로 선택되어 서비스에 노출됨

 

서비스가 포드 세트에 제공하는 유형 3가지

  • ClusterIP(내부) -- 기본 유형은 이 서비스가 클러스터 내부에서만 볼 수 있음을 의미합니다.
  • NodePort클러스터의 각 노드에 외부에서 액세스할 수 있는 IP를 제공하고
  • LoadBalancer서비스에서 서비스 내의 노드로 트래픽을 전달하는 클라우드 공급자의 로드 밸런서를 추가합니다.

 

여기서는 이거 만들것임

1. 서비스 만들기
2. 레이블 선택기를 사용하여 제한된 pod 집합을 외부에 노출


8. 서비스 생성

#디렉터리 이동
cd ~/orchestrate-with-kubernetes/kubernetes

#모놀리스 서비스 구성파일 탐색
cat pods/secure-monolith.yaml



 

[보안 모노리스 pod 및 해당 구성 데이터 작성]

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


yaml파일 야물딱지게 보는 법

cat services/monolith.yaml



** 참고
app: monolith및 레이블이 있는 모든 포드를 자동으로 찾고 노출하는 데 사용되는 선택기가 있습니다 secure: enabled.
이제 포트 31000에서 nginx(포트 443)로 외부 트래픽을 전달하는 방법이기 때문에 여기에서 노드 포트를 노출해야 합니다.

 

 

#모놀리식 서비스 만들기
kubectl create -f services/monolith.yaml

#방화벽 트래픽 허용
gcloud compute firewall-rules create allow-monolith-nodeport --allow=tcp:31000

#외부 ip 가져오기
gcloud compute instances list

#보안 모놀리스 서비스 접속 시도
curl -k https://<EXTERNAL_IP>:31000

보안 모놀리스 서비스 접속 시도 : 실패


질문!!!!!

kubectl get services monolith / kubectl describe services monolith 사용 확인 
- 모노리스 서비스에서 응답을 받을 수 없는 이유는 무엇입니까?
external-ip 없음
- 모놀리스 서비스에는 몇 개의 엔드포인트가 있습니까?
없음
- 모놀리스 서비스에서 Pod가 선택해야 하는 레이블은 무엇인가요?
↓ 지금 할것임

 

질문!

 


9. 포트에 레이블 추가

 

#포드 실행 확인
kubectl get pods -l "app=monolith"

#레이블 확인, 레이블 없음 추가할꺼야
kubectl get pods -l "app=monolith,secure=enabled"

#누락 레이블 추가
kubectl label pods secure-monolith 'secure=enabled'

# 업데이트 확인
kubectl get pods secure-monolith --show-labels

# 모놀리스 서비스에서 엔드포인트 목록 확인
kubectl describe services monolith | grep Endpoints
# Endpoints: 10.68.0.5:443



리스트 확인 후 연결하기

gcloud compute instances list
curl -k https://<EXTERNAL_IP>:31000

포트에 레이블 추가 과정


10. kubernetes로 애플리케이션 배포

정상 pod

배포(deployments) : 실행 중인 pod 수가 사용자가 지정한 원하는 pod 수와 동일하도록 하는 선언적 방법

 

주요 이점

  • pod 관리의 낮은 수준 세부 정보를 추상화함
  • 배후에서 복제본 세트를 사용하여 pod 시작 및 중지 관리
  • pod를 업데이트하거나 확장해야 하는 경우에 처리함
  • 다운되는 경우 pod 다시 시작 처리

node3 error 발생 시

* node 3 다운 시

새 포드 수동으로 생성 → node 2에서 시작


11. 배포생성


모놀리스 앱을 세 부분으로 나눕니다.

  • auth - 인증된 사용자에 대한 JWT 토큰을 생성합니다.
  • 안녕하세요 - 인증된 사용자를 환영합니다.
  • 프론트엔드 - auth 및 hello 서비스로 트래픽을 라우팅합니다.
#인증배포 구성파일 확인
cat deployments/auth.yaml

#배포 개체 만들기
kubectl create -f deployments/auth.yaml

#인증 서비스 생성
kubectl create -f services/auth.yaml

#hello.yaml 개체 만들기
kubectl create -f deployments/hello.yaml

#hello.yaml 서비스 생성 및 노출
kubectl create -f services/hello.yaml

 

프론트엔드 생성 및 배포, 노출

kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml

 

외부 ip 컬링 후 프런트엔드와 상호작용

#프런트엔드 서비스 가져오기
kubectl get services frontend


#외부 ip 연결
curl -k https://<EXTERNAL-IP>

 

11. 배포 & 생성

Comments