<클라우드융합> Voting App

박서연·2023년 5월 10일

Cloud

목록 보기
5/13
post-thumbnail

📌 1. 실습 준비

1. openVPN 연결 + password 입력

2. PuTTY에 IP address 작성 후 open + 로그인

🔅 vpn 아이디와 비밀번호, PuTTY IP address는 수업 시간에 배포한 것으로 막을 경우 실습할 수 없음
🔅 image는 해당 코드 이외의 다른 image를 사용해도 됨

📌 2. Voting App

1. redis.yaml

🔸 개인의 투표 결과를 queue 형식으로 redis에 데이터 저장

🔸 redis Pod를 Deployment 형식으로 배포 + redis service를 ClusterIP 형식으로 서비스 노출
cluster 내부에서 redis Pod로 접근 가능

🔸 Code
vim redis.yaml > 코드 작성
kubectl apply -f redis.yaml

apiVersion: apps/v1
kind: Deployment 
metadata:
	labels:
    	app: redis
    name: redis
spec:
	replicas: 1
    selector:
    	matchLabels:
        	app: redis
    template:
    	metadata:
        	labels:
            	app: redis
        spec:
        	containers:
            	- image: local-registry.com:30500/redis:1.0
                  name: redis
                  ports:
                  	- containerPort: 6379
                      name: redis
                  volumeMounts:
                  	- mountPath: /data
                      name: redis-data
            volumes:
            	- name: redis-data
                  emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
	labels:
    	app: redis
    name: redis
spec:
	type: ClusterIP
    ports:
    	- name: "redis-service"
          port: 6379
          targetPort: 6379
    selector:
    	app: redis

2. vote.yaml

🔸Python Flask를 이용하여 만든 투표 대시보드에서 투표 수집

🔸 vote Pod를 deployment 형식으로 배포 + vote service를 NodePort 형식으로 서비스 노출
외부에서 특정 port #로 접근 가능

🔸 Code
vim vote.yaml > 코드 작성
kubectl apply -f vote.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
	labels:
    	app: vote
    name: vote
spec:
	replicas: 1
    selector:
    	matchLabels:
        	app: vote
    template:
    	metadata:
        	labels:
            	app: vote
        spec:
        	containers:
            	- image: local-registry.com:30500/vote:1.0
                  name: vote
                  ports:
                  	- containerPort: 80
                      name: vote
---
apiVersion: v1
kind: Service
metadata:
	labels:
    	app: vote
    name: vote
spec:
	type: NodePort
    ports:
    	- name: "vote-service"
          port: 5000
          targetPort: 80
    selector:
    	app: vote

browser로 확인

🔸 ifconfig하여 NODE IP address를 확인

🔸 kubectl describe svc를 하여 vote의 NodePort 확인

🔅 브라우저 URL에 [Node_IP]:[NodePort] 입력 후 접속

3. db.yaml

🔸 투표자와 투표 내용을 db(PostgreSQL)에 저장

🔸 Code
vim db.yaml > 코드 작성
kubectl apply -f db.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
	labels:
    	app: db
    name: db
spec:
	replicas: 1
    selector:
    	matchLabels:
        	app: db
    template:
    	metadata:
        	labels:
            	app: db
        spec:
        	containers:
            	- image: local-registry.com:30500/db:1.0
                  name: postgres
                  env:
                  	- name: POSTGRES_USER
                      value: postgres
                    - name: POSTGRES_PASSWORD
                      value: postgres
                    - name: POSTGRES_HOST_AUTH_METHOD
                      value: trust
                  ports:
                  	- containerPort: 5432
                      name: postgres
                  volumeMounts:
                  	- mountPath: /var/lib/postgresql/data
                      name: db-data
            volumes:
            	- name: db-data
                  emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
	labels:
    	app: db
    name: db
spec:
	type: ClusterIP
    ports:
    	- name: "db-service"
          port: 5432
          targetPort: 5432
    selector:
    	app: db

4. result.yaml

🔸 투표를 집계하고 자바스크립트를 이용하여 만든 투표 결과 대시보드 제공

🔸 Code
vim result.yaml > 코드 작성
kubectl apply -f result.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
	labels:
    	app: result
    name: result
spec:
	replicas: 1
    selector:
    	matchLabels:
        	app: result
    template:
    	metadata:
        	labels:
            	app: result
        spec:
        	containers:
            	- image: local-registry.com:30500/result:1.0
                  name: result
                  ports:
                  	- containerPort: 80
                      name: result
---
apiVersion: v1
kind: Service
metadata:
	labels:
    	app: result
    name: result
spec:
	type: NodePort
    ports:
    	- name: "result-service"
          port: 5001
          targetPort: 80
    selector:
    	app: result

browser로 확인

🔸 ifconfig하여 NODE IP address를 확인

🔸 kubectl describe svc를 하여 result의 NodePort 확인

🔅 브라우저 URL에 [Node_IP]:[NodePort] 입력 후 접속

cats 또는 dogs 중 하나를 선택했지만 투표 결과는 50%/50%로 표시됨

🔅 redis에 저장된 queue 형식의 투표 결과를 PostgreSQL로 넘기는 컴포넌트 필요

5. worker.yaml

🔸 redis에서 queue 형식으로 저장된 데이터를 받아와 {voter_id/vote} 형식의 고유 voter id로 데이터를 구분하여(.NET) db(PostgreSQL)에 저장

🔸 Code
vim worker.yaml > 코드 작성
kubectl apply -f worker.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
	labels:
    	app: worker
    name: worker
spec:
	replicas: 1
    selector:
    	matchLabels:
        	app: worker
    template:
    	metadata:
        	labels:
            	app: worker
        spec:
        	containers:
            	- image: local-registry.com:30500/worker:1.0
                  name: worker

browser로 확인

🔸 ifconfig하여 NODE IP address를 확인

🔸 kubectl describe svc를 하여 result의 NodePort 확인

🔅 브라우저 URL에 [Node_IP]:[NodePort] 입력 후 접속

cats로 선택했을시 투표 결과는 100%/0%로 표시되어 투표 내용이 정상적으로 반영된 것을 확인함

📌 3. 실습 시 유용한 kubectl

ls

현재 디렉토리에 존재하는 파일 모두 나타냄

kubectl get pods

배포(apply)된 pod 상태(생성 여부) 확인

kubectl get svc

배포(apply)된 service 상태(생성 여부, NodePort #) 확인

kubectl describe pods

배포(apply)된 pod 상세 설명

kubectl describe svc

배포(apply)된 service 상세 설명

kubectl logs (worker pod ID)

worker pod의 log 상태를 보여줌

kubectl delete -f (파일명.yaml)

파일을 apply 하여 생성된 pod, service 등 삭제 :파일은 그대로 존재

mv (변경전파일명) (변경후파일명)

파일명 변경

rm -rf (파일명.yaml)

파일 자체 삭제

ifconfig

현재 노드의 IP address 확인 가능 (ex. 192.168.x.x)

0개의 댓글