Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018

1,415 views

Published on

AWS Kubernetes 서비스 자세히 살펴보기

Kubernetes와 Amazon Elastic Container Service for Kubernetes(EKS)의 주요 개념과 로깅/모니터링, 보안, 스토리지, 오토스케일링을 상세히 다룹니다. 주요 핵심 개념과 함께 Fluentd, Prometheus, Grafana를 활용한 로깅 및 모니터링, 보안 정책, Dynamic provisioning, Headless Service, StatefulSet을 활용한 stateful apps, Horizontal Pod AutoScaler에 대해 설명해 드립니다.

Published in: Technology
  • Be the first to comment

AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018

  1. 1. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. AWS Kubernetes 서비스 자세히 살펴보기 정영준, 이창수 솔루션즈 아키텍트 AWS
  2. 2. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Context • Kubernetes • AMAZON EKS • 로깅과 모니터링 • 스토리지 • 오토 스케일링
  3. 3. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Kubernetes
  4. 4. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 오픈 소스 컨테이너 관리 플렛폼 컨테이너 배포 및 확장 최신 응용 프로그램 구축을 위한 기본 요소를 제공 What is Kubernetes?
  5. 5. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Docker File Dockerfile : FROM golang LABEL maintainer=”sample@aws.amazon.com" LABEL version="1.0” EXPOSE 5000 ENV GOPATH=/go COPY ./code $GOPATH/src/gowebapp WORKDIR $GOPATH/src/gowebapp/ RUN go get && go install ENTRYPOINT ["/go/bin/gowebapp"] # docker build -t gowebapp:v1 . Sending build context to Docker daemon 3.072kB Step 1/9 : FROM golang latest: Pulling from library/golang bc9ab73e5b14: Downloading [=====> ] 4.586MB/45.31MB 193a6306c92a: Downloading [=================> ] 5.389MB/10.74MB e5c3f8c317dc: Download complete a587a86c9dcb: Waiting 1bc310ac474b: Waiting 87ab348d90cc: Waiting 786bc4873ebc: Waiting
  6. 6. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Docker Compose File Dockerfile : FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"] docker-compose.yml : version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" $ docker-compose up Creating network "composetest_default" with the default driver Creating composetest_web_1 ... Creating composetest_redis_1 ... Creating composetest_web_1 Creating composetest_redis_1 ... done Attaching to composetest_web_1, composetest_redis_1 web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) redis_1 | 1:C 17 Aug 22:11:10.480 …
  7. 7. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Kubernetes gowebapp-service.yaml : apiVersion: v1 kind: Service metadata: name: gowebapp labels: run: gowebapp tier: frontend spec: type: NodePort ports: - port: 80 selector: run: gowebapp tier: frontend gowebapp-deployment.yaml : apiVersion: apps/v1 kind: Deployment metadata: name: gowebapp labels: run: gowebapp tier: frontend spec: replicas: 2 selector: matchLabels: run: gowebapp tier: frontend template: metadata: labels: run: gowebapp tier: frontend $ kubectl apply -f gowebapp-service.yaml $ kubectl get service -l "run=gowebapp” $ kubectl apply -f gowebapp-deployment.yaml $ kubectl get deployment -l "run=gowebapp"
  8. 8. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 활발히 성장하는 사용자 커뮤니티와 커뮤니티 Kubernetes 통합 실행 환경 단일 확장 API WHY KUBERNETES? 데 이 터 센 터 클 라 우 드 확장 성능 다양성
  9. 9. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 51%AWS에서 Kubernetes 워크로드를 배치하는 사용자 수 — Cloud Native Computing Foundation Kubernetes on AWS
  10. 10. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Kubernetes cluster setup
  11. 11. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Manage a Kubernetes cluster: Kops
  12. 12. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Amazon EKS
  13. 13. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EKS Tenets K u b ern etes! 업스트림 K 8s 지원 엔터프라이즈 운 영 환 경 AWS 서비스 통합
  14. 14. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EKS architecture
  15. 15. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EKS architecture
  16. 16. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EKS Customers workflow EKS 클러스터 생성 워커 노드 생성 에드온 추가 워크로드 실행
  17. 17. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EKS – Kubernetes masters 고 가 용 성 K 8 s A P I 서 버 구 성 인 증 설 정 I A M 구 성 로 드 밸 런 서 구 성E t c d 구 성 오 토 스 케 일 설 정 EKS 클러스터 생성
  18. 18. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EKSCLI # brew install weaveworks/tap/eksctl # eksctl create cluster --name=clusterName --nodes=30 --node-type=c4.xlarge # eksctl scale nodegroup --name=clusterName --nodes=40 # eksctl create cluster --node-type=p2.xlarge # kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.11/nvidia-device-plugin.yml
  19. 19. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EC2 워커 노드 EKS 컨트롤 플레인 고객 VPC EKS VPC 네트워크 로드밸런서 ENI API 오출 Kubectl Exec/Logs TLS 정적 IPs 오토스케일 그룹 EKS Architecture
  20. 20. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 로깅 & 모니터링
  21. 21. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Docker Logging Driver 출처 - https://jaxenter.com/docker-logging-gotchas-137049.html
  22. 22. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Docker Logging Driver $ docker run --log-driver file-log-driver -- log-opt fpath=/testing/test.log $ docker run --log-driver=fluentd --log-opt fluentd-address=myhost.local:24224 --log-opt tag="mailer" /etc/docker/daemon.json : { "log-driver": "json-file", "log-opts": { "labels": "production_status", "env": "os,customer" } }
  23. 23. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Fluentd
  24. 24. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Fluentd Data Source SQS Unix Domain Socket ELB LogCloudWatch Reference - https://www.fluentd.org/datasources
  25. 25. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Fluentd Architecture Log Files Event Data S1 S2 S3 D1 D3 Amazon CloudWatch Amazon ES Amazon S3 bucket D2 Input Parser Filter Output Formatter Buffer Fluentd 의 6 종류 플러그인
  26. 26. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Elasticsearch + Fluentd + Kibana Amazon ES Rails Pod Worker Node 1 + n Nginx Pod Rails Pod Worker Node 1 + n Nginx Pod Rails Pod Worker Node 1 + n Nginx Pod Rails Pod Worker Node 1 + n Nginx Pod Rails Pod Worker Node 1 + n Nginx Pod Rails Pod Worker Node 1 + n Nginx Pod
  27. 27. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Fluentd Daemonset Deploy fluentd-daemonset-elasticsearch.yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: fluentd namespace: kube-system ... spec: ... spec: containers: - name: fluentd image: quay.io/fluent/fluentd-kubernetes- daemonset env: - name: FLUENT_ELASTICSEARCH_HOST value: "elasticsearch-logging" - name: FLUENT_ELASTICSEARCH_PORT value: "9200" ... $ kubectl apply -f fluentd-daemonset- elasticsearch.yaml 환경 변수 의미 기본값 FLUENT_ELASTICSEARCH_HOST 접속 주소 elasticsearch-logging FLUENT_ELASTICSEARCH_PORT 엘라스틱서치 TCP port 9200
  28. 28. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Tools for Monitoring Resources Full metrics pipelines (Prometheus) CronJob monitoring (Kubernetes Job Monitor) Resource metrics pipeline (Kubelet, cAdvisor)
  29. 29. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Prometheus Architecture Overview
  30. 30. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. EKS Workshop https://eksworkshop.com/
  31. 31. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 스토리지
  32. 32. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Volume type [컨테이너의 볼륨] 컨테이너가 종료되면 손 실 [호스트의 볼륨] 컨테이너가 다른 호스 트재배치되면 접근 불 가 [네트워크 볼륨] 호스트에 독립적
  33. 33. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Volume type Temp Host Local Network emptyDir hostPath GlusterFS gitRepo NFS iSCSI gcePersistentDisk AWSEBS azureDisk Fiber Channel Secret VshereVolume
  34. 34. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Volume type - EmptyDir • Pod이 호스트 노드에서 수행되는 동안 존재하는 임시 볼륨 • 호스트 노드의 메모리 활용 가능 (tmpfs) apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: redis - name: redis volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: medium: Memory
  35. 35. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Volume type - gitRepo • emptyDir을 활용 • Git repo를 clone • Static 데이터 (HTML) 혹은 script source를 git에서 배포하는데 활용 … volumes: - name: html gitRepo: repository: https://github.com/example.git revision:master directory: .
  36. 36. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Volume type - hostPath • 호스트 노드의 파일시스템을 Pod에 마운트하여 사용 o 컨테이너가 Docker 내부 접근 필요 시 -> hostPath :/var/lib/docker o 호스트의 파일 및 디렉토리 read only 활용을 통해 컨테이너 이미지 경량화 • Privileged 컨테이너만 쓰기, 수정 … volumes: - name: test-volume hostPath: # directory location on host path: /data type: Directory
  37. 37. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Ephemeral, host 볼륨의 제약 • 호스트의 가용성에 의존 • Stateless 애플리케이션에 적합 Stateful 애플리케이션 persistent 볼륨 필요!
  38. 38. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. PersistentVolume, PersistentVolumeClaim • PersistentVolume (PV) o 독립적인 라이프사이클이 있는 볼륨 플러그인 o NFS, iSCSI 혹은 클라우드 제공 스토리지 • PersistentVolumeClaim (PVC) o PV를 요청하는 오브젝트 o 용량과 access mode 정의 가능 • Provisioning o Static : 미리 PV를 생성하고 PVC claim 기반으로 특정 PV를 요청 o Dynamic : 미리 정의한 StorageClass에 기반하여 PVC가 동적으로 PV를 할당
  39. 39. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. POD PVC 5GB RWO K8S Control plane PVC 8GB RWO PV 10GB RWO AWS EBS PV 5GB RWO AWS EBS POD • PVC 용량 <= PV 용량 • PV를 요청하기 위해 PVC 생성 (accessModes: RWO, storage: 5Gi) • Pod를 배포할 때 필요한 PVC 정의 kubectl create -f pv1.yaml kubectl create -f pvc1.yaml • 미리 생성한 Amazon EBS 기반 5G PV 생성 PersistentVolume, PersistentVolumeClaim
  40. 40. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. AccessModes • ReadWriteOnce : 단일 노드에 rw로 마운트 가능한 볼륨 모드 (EBS) • ReadOnlyMany : ro로 여러 노드에 마운트 가능한 볼륨 모드 • ReadWriteMany : rw로 여러 노드에 마운트 가능한 볼륨 모드
  41. 41. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Label과 Selector kind: PersistentVolume metadata: name : myvol01 labels: volume-type: gp2 AZ: ap-northeast-2a spec : capacity: storage: 5Gi accessModes: - ReadWriteOnce awsElasticBlockStore: volumeID: vol-47f59cce fstype: ext4 • PVC에 에 selector -> matchLabel 에 에 에 Label에 에 에 PV에 에 에 o 에 에 에 에 에 에 에 에 에 에 에 에 에 에 kind: PersistentVolumeClaim metadata: name : myclaim01 spec : resources: requests: storage: 5Gi accessModes: - ReadWriteOnce selector: matchLabels: volume-type: gp2 AZ: ap-northeast-2a persistentVolumeReclaimPolicy: Retain
  42. 42. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Reclaim policy • Delete (default) o PVC 삭제 시 PV와 할당된 스토리지 볼륨 함께 삭제 (예-AWS EBS) • Retain o PVC 삭제 시 PV는 유지되지만 수동 reclamation전에 사용 불가
  43. 43. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 데모 – Persistent Volume for couchbase on AWS • AWS EBS ID 확인하고 PV 생성 (5GB) $ kubectl create -f pv1.yml • PVC 생성하여 PV와 매핑 $ kubectl create -f pvc1.yml • Couchbase Pod용 RC 생성 $ kubectl create –f couchbase-rc.yml • Service 생성 $ kubectl.sh expose rc couchbase --target-port=8091 --port=8091 --type=LoadBalancer $ kubectl describe service couchbase
  44. 44. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
  45. 45. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Dy namic Prov is oning
  46. 46. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. StorageClass • 정의한 StorageClass를 기반으로 PVC가 PV를 동적 할당 kind: StorageClass metadata: name: gp2 Provisioner: kubernetes.io/aws-ebs Parameter: type: gp2 zones: ap-northeast-2a, ap-northeast-2c encrypted: “true” kmsKeyId: … reclaimPolicy: Retain mountOptions: … kind: StorageClass metadata: name: io Provisioner: kubernetes.io/aws-ebs Parameter: type: io zone: ap-northeast-2a encrypted: “false” reclaimPolicy: Retain mountOptions: …
  47. 47. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. StorageClass kind: PersistentVolumeClaim metadata: name: myclaim01 spec accessModes : - ReadWriteOnce storageClassName: gp2 resources: requests: storage: 30Gi • PVC 에 에 에 에 에 에 에 에 StorageClass에 에 에 에 에 에 o EBS 에 에 에 에 에 에 에 에 에 에 에 에 o EBS vol-ID에 에 에 에 에 PV 에 에 에 에 에 에 에 에 에 o PVC에 에 에 PV에 에 에 에 에 에 에 에 에 o Default StorageClass 에 에 에 PVC -> spec에 에 storageClassName 에 에 에
  48. 48. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 오토스케일링
  49. 49. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Kubernetes 오토스케일링 요소 • Pod 오토스케일링 • Horizontal Pod Autoscaler (HPA) • Vertical Pod Autoscaler (VPA) • Node 오토스케일링 • Cluster Autoscaler (CA)
  50. 50. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Horizontal Pod Autos c aler
  51. 51. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Horizontal Pod Autoscaler (HPA) 워크 플로 Deployment Controller Replicas Metric Server d d d cAdvisor Kubelet Metric Aggregator Metric Server Pod Pod Pod 1. Pod, Container 메트릭 전달 2. HPA Controller에 수집된 메트릭 전달 3. Deployment replicas 스케일링 HPA Controller Pod
  52. 52. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Horizontal Pod Autoscaler (HPA) • Deployment와 바인딩되어 currentMetric/desiredMetric 기반 replicas 스케일링 • 30초 주기로 Controller manager가 resource utilization을 설정한 타겟과 비교 • 동적 메트릭 변화에 replicas 잦은 변화에 방지하기 위해 기본 5분 쿨 다운 딜레이 • 너무 길면 워크로드에 대응이 느리고 너무 짧으면 잦은 쓰레싱 발생 • 현재 stable apiVersion : autoscaling/v1에서는 CPU 메트릭만 지원 • autoscaling/v2beta2에서 memory와 custom, external, multiple 메트릭 지원
  53. 53. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Horizontal Pod Autoscaler (HPA) 데모 https://eksworkshop.com/scaling/test_hpa/ 1. Metric server status 확인 2. 샘플 php-apache이미지 기반 deployment,service 생성 3. HPA 생성 (50%cpu target, min=1, max=10) 4. Log-generator로 부하 발생 5. Scaling out 확인 6. 부하 중지 후 Scale in 확인
  54. 54. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Custom 메트릭 • API aggregation layer enabled 필요 • Kubernetes 스타일의 custom API 서버를 등록 가능 • Custom.metrics.k8s.io 호환되는 Custom adapter (ex-Prometheus) 솔루션 설치 https://github.com/directxman12/k8s-prometheus-adapter • Custom Adapter 배포 후 Aggregation layer로 등록
  55. 55. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Multiple, Custom, external metrics 예제 • https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
  56. 56. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Vertic al Pod Autos c aler
  57. 57. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Vertical Pod Autoscaler (VPA) 워크 플로 Deployment Controller Metric Server d d d cAdvisor Kubelet Metric Aggregator Metric Server Pod 1. Pod, Container 메트릭 전달 2. VPA Controller에 수집된 메트릭 전달, History storage 로깅 3. Recommended resource 전달 VPA Controller Recommender Updater VPA Admission Controller 4. Pod 스펙 Overwrite History Storage Pod
  58. 58. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Vertical Pod Autoscaler (VPA) • VPA Recommender o 메트릭 서버로부터 Pod의 Utilization과 OOM 이벤트 감지 o Recommended resource를 계산하고 추천 결과를 VPA 오브젝트에 저장 • Updater o VPA 오브젝트와 Pod를 비교하여 Recommendation을 Pod에 fetch o PodDisruptionBudget을 통해 동시에 disruption되는 것을 방지 o Cluster status (e.g. quota, 노드 공간, 배치 제약) 등 고려 • History Storage o Historical event와 utilization을 보관
  59. 59. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Clus ter Autos c aler
  60. 60. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Cluster Autoscaler • Cluster 리소스 부족으로 Pending된 Pod이 있을때 클러스터 노드 스케일 아웃 • --cloud-provider=aws, --nodes=AWS EKS node 오토스케일링 그룹 이름 설정 [설정 파일 예제] -> https://eksworkshop.com/scaling/deploy_ca.files/cluster_autoscaler.yml • 불 필요한 노드 Unneeded로 마크되고 10분 간 스케일 인 조건 충족 시 삭제 • Scale-down disabled annotation으로 특정 노드 scale in 방지 가능
  61. 61. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Cluster Autoscaler FAQ • https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md
  62. 62. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 참고 자료 • Getting started with Amazon EKS o https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html • Amazon EKS workshop o https://eksworkshop.com/ • Kubectl Cheat Sheet o https://kubernetes.io/docs/reference/kubectl/cheatsheet/ • Detail Architecture of Kubernetes o https://github.com/kubernetes/community/blob/master/contributors/design- proposals/architecture/architecture.md/
  63. 63. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 참고 자료 • Kubernetes network (Proxy, DNS, etc) o https://kubernetes.io/docs/admin/networking/ o https://kubernetes.io/docs/admin/dns/ • ReplicaSet, Deployment, StatefulSets o https://kubernetes.io/docs/user-guide/replicasets/ o https://kubernetes.io/docs/user-guide/deployments o https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ • Kubernetes Security o https://kubernetes.io/docs/tasks/administer-cluster/securing-a-cluster/
  64. 64. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 참고 자료 • Deploying PHP Guestbook application with Redis o https://kubernetes.io/docs/tutorials/stateless-application/guestbook/ • Deploying WordPress and MySQL with Persistent Volumes o https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/ • Deploying Cassandra with Stateful Sets o https://kubernetes.io/docs/tutorials/stateful-application/cassandra/ • Running a ZooKeeper, A Distributed System Coordinator o https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/
  65. 65. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Q&A • 세션 후, 설문에 참여해 주시면 행사 후 소정의 선물을 드립니다. • #AWSDevDay 해시 태그로 의견을 남겨주세요!

×