이 글에서는 TKG Service가 만든 Tanzu Kubernetes 워크로드 클러스터에 Carvel 패키지를 구축했을 때 이미 수행한 작업을 토대로 작성하겠습니다. 해당 게시물에서 요구 사항이 무엇인지, tanzu 명령줄을 사용하여 워크로드 클러스터에 컨텍스트를 설정하고 TKG v1.4 패키지 저장소를 추가하는 방법을 살펴보았습니다. 또한 첫 번째 패키지인 Cert Manager를 구축하기 위해 tanzu CLI를 사용하는 방법도 살펴보았습니다. 이제 Contour(Ingress용), External-DNS(기존 DNS에 연결용), Prometheus(클러스터 모니터링용) 및 Grafana(대시보드용)와 같은 다른 여러 패키지의 배포를 계속 진행하겠습니다. 여기서의 목표는 Tanzu Kubernetes 클러스터를 모니터링하기 위한 모니터링 스택을 구축하는 것입니다. 이 패키지들은 Tanzu Kubernetes에서 최소한의 구성으로 함께 잘 작동하도록 제작되었으며, 이 모니터링 스택을 너무 많은 노력 없이 빠르게 구축할 수 있어야 합니다. 각 패키지에서 다양한 구성 값을 검색하고 일부 맞춤형 값을 사용하여 패키지를 배포하는 방법을 살펴보겠습니다. 그것을 자세히 살펴보도록 하겠습니다.
Cert Manager(이미 설치)
우리는 이미 이전 포스트에 Cert Manager를 배치했습니다. Cert Manager를 사용하면 모니터링 앱 스택의 보안이 강화됩니다. 이 기능은 다음에 전개할 Contour와 Envoy 수신 사이의 통신을 보호하는 데 사용됩니다. Cert Manager는 인증서 관리를 자동화하여 certificates-as-a-service 기능을 제공합니다. 이전에 보았듯이, Cert Manager에 맞춤형 값을 제공할 필요는 없습니다. 유일한 구성 옵션은 cert-manager가 패키지 리소스(기본값: cert-manager)를 배포하는 네임스페이스입니다.
% tanzu package installed list \ Retrieving installed packages... NAME PACKAGE-NAME PACKAGE-VERSION STATUS cert-manager cert-manager.tanzu.vmware.com 1.1.0+vmware.1-tkg.2 Reconcile succeeded
Contour
Contour을 설치한 이유는 프로메테우스가 Ingress에 대한 요구사항이 있기 때문입니다. Contour은 Envoy Ingress 컨트롤러를 통해 이 기능을 제공합니다. Contour은 Envoy의 제어면 역할을 하는 오픈 소스 Kubernetes 수신 컨트롤러입니다. 이 배포에서는 NSX ALB를 사용하므로 사용자 지정 Contour 데이터 파일을 제공하여 Envoy 서비스 유형을 로드 밸런서로 설정할 수 있을 뿐만 아니라 Contour 복제본 수를 설정할 수 있습니다. 다음 명령을 사용하여 구성 가능한 값을 검색할 수 있습니다. 먼저 Contour packager 버전을 받아야 합니다.
% tanzu package available list contour.tanzu.vmware.com / Retrieving package versions for contour.tanzu.vmware.com... NAME VERSION RELEASED-AT contour.tanzu.vmware.com 1.17.1+vmware.1-tkg.1 2021-07-23 19:00:00 +0100 IST
패키지 버전을 사용하면 기본 Contour 값을 검색할 수 있습니다. (다른 모든 Carvel 패키지에서 값 파일을 검색하기 위해 정확히 동일한 방법을 사용합니다. 따라서 Contour 패키지에 대한 자세한 절차는 보여드리지만, 이 글에 설치하는 다른 패키지는 반복하지 않겠습니다.)
% image_url=$(kubectl get packages contour.tanzu.vmware.com.1.17.1+vmware.1-tkg.1 \ -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}') % echo $image_url projects.registry.vmware.com/tkg/packages/standard/contour@sha256:73dc13131e6c1cfa8d3b56aeacd97734447acdf1ab8c0862e936623ca744e7c4 % mkdir ./contour % imgpkg pull -b $image_url -o ./contour Pulling bundle 'projects.registry.vmware.com/tkg/packages/standard/contour@sha256:73dc13131e6c1cfa8d3b56aeacd97734447acdf1ab8c0862e936623ca744e7c4' Extracting layer 'sha256:93c1f3e88f0e0181e11a38a4e04ac16c21c5949622917b6c72682cc497ab3e44' (1/1) Locating image lock file images... One or more images not found in bundle repo; skipping lock file update Succeeded %
값 파일은 이제 ./contour/config/values.yaml에서 사용할 수 있습니다. 이러한 값은 패키지가 배포되는 기본값이지만 다양한 요구 사항에 맞게 수정할 수 있습니다. 기본 등고선 값은 다음과 같습니다.
infrastructure_provider: vsphere namespace: tanzu-system-ingress contour: configFileContents: {} useProxyProtocol: false replicas: 2 pspNames: "vmware-system-restricted" logLevel: info envoy: service: type: null annotations: {} nodePorts: http: null https: null externalTrafficPolicy: Cluster aws: LBType: classic disableWait: false hostPorts: enable: true http: 80 https: 443 hostNetwork: false terminationGracePeriodSeconds: 300 logLevel: info pspNames: null certificates: duration: 8760h renewBefore: 360h
보통 변경하기 전에 값 파일을 복사합니다. 모든 필드를 사용자 정의 값 파일에 추가할 필요는 없습니다. 워크로드 클러스터에 이 패키지를 구축하려면 이전에 설치된 Cert Manager를 사용하고 Envoy를 위해 LoadBalancer 서비스 유형을 사용해야 합니다. 따라서 Contour에 대한 나의 맞춤 값 파일은 다음과 같이 보일 것입니다.
% cat contour.yaml envoy: service: type: LoadBalancer certificates: useCertManager: true
이제 다음과 같이 contour.yaml이라는 맞춤형 값 파일을 사용하여 Contour 패키지를 배포할 수 있습니다.
% tanzu package available list contour.tanzu.vmware.com / Retrieving package versions for contour.tanzu.vmware.com... NAME VERSION RELEASED-AT contour.tanzu.vmware.com 1.17.1+vmware.1-tkg.1 2021-07-23 19:00:00 +0100 IST % tanzu package install contour --package-name contour.tanzu.vmware.com --version 1.17.1+vmware.1-tkg.1 \ --values-file contour.yaml / Installing package 'contour.tanzu.vmware.com' | Getting namespace 'default' / Getting package metadata for 'contour.tanzu.vmware.com' | Creating service account 'contour-default-sa' | Creating cluster admin role 'contour-default-cluster-role' | Creating cluster role binding 'contour-default-cluster-rolebinding' | Creating secret 'contour-default-values' \ Creating package resource \ Package install status: Reconciling Added installed package 'contour' in namespace 'default' %
다양한 방법으로 패키지가 성공적으로 설치되었는지 확인할 수 있습니다.
% kubectl get apps NAME DESCRIPTION SINCE-DEPLOY AGE cert-manager Reconcile succeeded 45s 138m contour Reconcile succeeded 92s 96s % tanzu package installed list - Retrieving installed packages... NAME PACKAGE-NAME PACKAGE-VERSION STATUS cert-manager cert-manager.tanzu.vmware.com 1.1.0+vmware.1-tkg.2 Reconcile succeeded contour contour.tanzu.vmware.com 1.17.1+vmware.1-tkg.1 Reconcile succeeded
아래 나온 것처럼 특사 데몬셋을 포함하여 네임스페이스 tanzu-system-ingress(기본값 파일에서 구성한 대로)에 배포된 패키지 리소스 개체를 검사할 수 있습니다.
% kubectl get daemonset/envoy -n tanzu-system-ingress NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE envoy 3 3 3 3 3 <none> 2m7s
Envoy가 LoadBalancer 서비스를 할당받았음을 관찰해야(확인) 합니다.
% kubectl get svc -n tanzu-system-ingress NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE contour ClusterIP 100.69.120.194 <none> 8001/TCP 5m9s envoy LoadBalancer 100.71.42.85 xx.xx.62.20 80:30368/TCP,443:32723/TCP 5m8s
이제 External-DNS 구축으로 넘어갈 수 있습니다.
External-DNS
이 패키지는 선택 사항입니다. 외부 DNS에 Kubernetes 서비스를 자동으로 추가할 수 있습니다. 나중에 Grafana 대시보드를 살펴볼 때 FQDN을 사용하여 액세스할 수 있으므로 이 기능이 유용합니다. 이 예에서는 다음 지침에 따라 보안되지 않은 연결을 Microsoft DNS에 통합합니다. 통합하려는 도메인에 대해 Microsoft DNS 구성에서 수행할 수 있는 두 가지 단계는 (1) 보안 및 비보안 동적 업데이트 모두 허용, (2) 모든 서버로 영역 전송을 허용합니다. RFC2136 공급자를 사용하고 있습니다. 이렇게 하면 Microsoft DNS와 같은 외부 DNS용 공급자로 RFC2136 호환 DNS 서버를 사용할 수 있습니다. rainpole.com 도메인과 통합하고 있습니다. 제 External-DNS values 파일의 복사본이 포함되어 있습니다. rf2136-insecure 인수(보안되지 않은 동적 업데이트 지원)와 rf2136-tsig-axfr(지원 영역 전송)을 포함합니다. 레코드 삭제를 위해 영역 이전이 필요합니다. 또한 소스가 contour-httproxy로 설정되어 있으므로 소스를 사용하여 만든 서비스가 DNS에 추가됩니다(예: Prometheus 및 Grafana). 이거 나중에 봐요.
$ cat external-dns.yaml namespace: tanzu-system-service-discovery deployment: args: - --registry=txt - --txt-prefix=external-dns- - --txt-owner-id=tanzu - --provider=rfc2136 - --rfc2136-host=xx.xx.51.252 - --rfc2136-port=53 - --rfc2136-zone=rainpole.com - --rfc2136-insecure - --rfc2136-tsig-axfr - --source=service - --source=contour-httpproxy - --source=ingress - --domain-filter=rainpole.com
이제 위의 값을 사용하여 이 패키지를 배포하겠습니다.
% tanzu package available list external-dns.tanzu.vmware.com - Retrieving package versions for external-dns.tanzu.vmware.com... NAME VERSION RELEASED-AT external-dns.tanzu.vmware.com 0.8.0+vmware.1-tkg.1 2021-06-11 19:00:00 +0100 IST % tanzu package install external-dns -p external-dns.tanzu.vmware.com -v 0.8.0+vmware.1-tkg.1 \ --values-file external-dns.yaml | Installing package 'external-dns.tanzu.vmware.com' / Getting namespace 'default' - Getting package metadata for 'external-dns.tanzu.vmware.com' | Creating service account 'external-dns-default-sa' | Creating cluster admin role 'external-dns-default-cluster-role' | Creating cluster role binding 'external-dns-default-cluster-rolebinding' | Creating secret 'external-dns-default-values' \ Creating package resource / Package install status: Reconciling Added installed package 'external-dns' in namespace 'default' %
External-DNS는 패키지 리소스를 tanzu-system-service-discovery에 배포합니다. 외부 dns 포드의 로그를 검사하면 RFC2136이 구성되었다는 메시지가 표시됩니다.
% kubectl -n tanzu-system-service-discovery logs external-dns-777f74bd6c-zs7bn . . . time="2022-02-15T15:08:09Z" level=info msg="Instantiating new Kubernetes client" time="2022-02-15T15:08:09Z" level=info msg="Using inCluster-config based on serviceaccount-token" time="2022-02-15T15:08:09Z" level=info msg="Created Kubernetes client https://100.64.0.1:443" time="2022-02-15T15:08:10Z" level=info msg="Created Dynamic Kubernetes client https://100.64.0.1:443" time="2022-02-15T15:08:12Z" level=info msg="Configured RFC2136 with zone 'rainpole.com.' and nameserver 'xx.xx.51.252:53'"
모두 좋아 보여요. 이제 프로메테우스로 넘어가죠
Prometheus
Prometheus는 실시간 메트릭스를 기록하고 알림 기능을 제공합니다. Ingress(또는 HTTProxy)에 대한 요구사항이 있으며 해당 요구 사항은 Contour이 충족합니다. Prometheus에는 꽤 많은 구성 옵션이 있는데, 그 중 대부분은 여기에 나와 있지 않습니다. 내 클러스터에서 Prometheus는 Ingress를 사용하도록 구성되어 있으며 외부 DNS 도메인인 prometheus-tkgs-cork.rainpole.com의 일부인 FDQN을 사용합니다(자신의 DNS에 있는 도메인으로 변경해야 합니다). 또한 영구 볼륨에 대해 정의된 일부 스토리지 클래스도 있습니다. Prometheus 서버에는 150GB 볼륨이 필요하고 경고 관리자에는 2GB 볼륨이 필요합니다.
% cat prometheus.yaml ingress: enabled: true virtual_host_fqdn: "prometheus-tkgs-cork.rainpole.com" prometheus_prefix: "/" alertmanager_prefix: "/alertmanager/" prometheusServicePort: 80 alertmanagerServicePort: 80 prometheus: pvc: storageClassName: vsan-default-storage-policy alertmanager: pvc: storageClassName: vsan-default-storage-policy
우리는 이제 위의 값을 가진 패키지를 배포합니다.
% tanzu package available list prometheus.tanzu.vmware.com - Retrieving package versions for prometheus.tanzu.vmware.com... NAME VERSION RELEASED-AT prometheus.tanzu.vmware.com 2.27.0+vmware.1-tkg.1 2021-05-12 19:00:00 +0100 IST % tanzu package install prometheus --package-name prometheus.tanzu.vmware.com \ --version 2.27.0+vmware.1-tkg.1 --values-file prometheus.yaml - Installing package 'prometheus.tanzu.vmware.com' | Getting namespace 'default' / Getting package metadata for 'prometheus.tanzu.vmware.com' | Creating service account 'prometheus-default-sa' | Creating cluster admin role 'prometheus-default-cluster-role' | Creating cluster role binding 'prometheus-default-cluster-rolebinding' | Creating secret 'prometheus-default-values' \ Creating package resource | Package install status: Reconciling Added installed package 'prometheus' in namespace 'default' %
이렇게 하면 네임스페이스 tanzu-monitoring-system에 Prometheus용 패키지 리소스가 많이 생성됩니다.
% kubectl get deploy,rs,pods -n tanzu-system-monitoring NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/alertmanager 1/1 1 1 5m11s deployment.apps/prometheus-kube-state-metrics 1/1 1 1 5m13s deployment.apps/prometheus-pushgateway 1/1 1 1 5m12s deployment.apps/prometheus-server 1/1 1 1 5m13s NAME DESIRED CURRENT READY AGE replicaset.apps/alertmanager-669c4f497d 1 1 1 5m11s replicaset.apps/prometheus-kube-state-metrics-6ccbc7bfc 1 1 1 5m13s replicaset.apps/prometheus-pushgateway-6d7bc967f9 1 1 1 5m12s replicaset.apps/prometheus-server-7cc7df4dd6 1 1 1 5m13s NAME READY STATUS RESTARTS AGE pod/alertmanager-669c4f497d-wsx2s 1/1 Running 0 5m11s pod/prometheus-cadvisor-fxhw8 1/1 Running 0 5m13s pod/prometheus-cadvisor-m758x 1/1 Running 0 5m13s pod/prometheus-cadvisor-mzzm7 1/1 Running 0 5m13s pod/prometheus-kube-state-metrics-6ccbc7bfc-fsggg 1/1 Running 0 5m13s pod/prometheus-node-exporter-24rc7 1/1 Running 0 5m13s pod/prometheus-node-exporter-9b9nh 1/1 Running 0 5m13s pod/prometheus-node-exporter-g6vtp 1/1 Running 0 5m13s pod/prometheus-node-exporter-p8tkk 1/1 Running 0 5m13s pod/prometheus-pushgateway-6d7bc967f9-stctt 1/1 Running 0 5m12s pod/prometheus-server-7cc7df4dd6-ncbhz 2/2 Running 0 5m13s % kubectl get httpproxy -n tanzu-system-monitoring NAME FQDN TLS SECRET STATUS STATUS DESCRIPTION prometheus-httpproxy prometheus-tkgs-cork.rainpole.com prometheus-tls valid Valid HTTPProxy % kubectl get pvc,pv -n tanzu-system-monitoring NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/alertmanager Bound pvc-912dacdd-6533-45a4-948a-34b9fd383d37 2Gi RWO vsan-default-storage-policy 5m29s persistentvolumeclaim/prometheus-server Bound pvc-08e145e4-a267-4e1e-89d2-513cff467512 150Gi RWO vsan-default-storage-policy 5m29s NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/pvc-08e145e4-a267-4e1e-89d2-513cff467512 150Gi RWO Delete Bound tanzu-system-monitoring/prometheus-server vsan-default-storage-policy 3m20s persistentvolume/pvc-912dacdd-6533-45a4-948a-34b9fd383d37 2Gi RWO Delete Bound tanzu-system-monitoring/alertmanager vsan-default-storage-policy 5m27s % kubectl get svc -n tanzu-system-monitoring NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager ClusterIP 100.71.143.203 <none> 80/TCP 6m15s prometheus-kube-state-metrics ClusterIP None <none> 80/TCP,81/TCP 6m17s prometheus-node-exporter ClusterIP 100.67.91.192 <none> 9100/TCP 6m17s prometheus-pushgateway ClusterIP 100.70.217.119 <none> 9091/TCP 6m17s prometheus-server ClusterIP 100.67.174.220 <none> 80/TCP 6m17s
httpproxy가 성공적으로 생성되었고 외부 DNS가 작동 중인 경우 이제 브라우저를 통해 Prometheus 서비스의 FQDN에 연결할 수 있습니다. DNS와 통합하지 않은 경우 로컬 /etc/hosts 파일에 Prometheus FQDN 및 Envoy Load Balancer IP 주소를 추가할 수 있습니다. 이것 또한 효과가 있을 것입니다. 그러면 다음과 유사한 내용이 표시됩니다.
Prometheus가 성공적으로 설치되었으므로 대시보드용 Grafana 패키지를 배포할 수 있습니다.
Grafana
이전과 마찬가지로 Grafana 구성 값은 앞에서 설명한 것과 동일한 방법으로 검색할 수 있습니다. 꽤 많은 값이 있지만, 이전과 마찬가지로 값 파일은 단순하게 유지되도록 다시 노력하겠습니다. 값 파일을 통해 우리는 (프로메테우스에게) 데이터 소스를 제공할 수 있습니다. Prometheus URL은 Prometheus 서버의 포드 이름과 네임스페이스로 구성된 내부 Kubernetes URL입니다. 그라파나도 동일한 클러스터에서 실행되기 때문에 프로메테우스와 그라파나는 내부 쿠버네티스 네트워킹을 사용하여 통신할 수 있습니다. 샘플 그라파나 값 파일입니다.
% cat grafana.yaml namespace: tanzu-system-dashboard ingress: virtual_host_fqdn: "graf-tkgs-cork.rainpole.com" grafana: config: datasource_yaml: |- apiVersion: 1 datasources: - name: Prometheus type: prometheus url: prometheus-server.tanzu-system-monitoring.svc.cluster.local access: proxy isDefault: true pvc: storageClassName: vsan-default-storage-policy
% tanzu package available list grafana.tanzu.vmware.com \ Retrieving package versions for grafana.tanzu.vmware.com... NAME VERSION RELEASED-AT grafana.tanzu.vmware.com 7.5.7+vmware.1-tkg.1 2021-05-19 19:00:00 +0100 IST % tanzu package install grafana -p grafana.tanzu.vmware.com -v 7.5.7+vmware.1-tkg.1 \ --values-file grafana.yaml - Installing package 'grafana.tanzu.vmware.com' | Getting namespace 'default' / Getting package metadata for 'grafana.tanzu.vmware.com' | Creating service account 'grafana-default-sa' - Creating cluster admin role 'grafana-default-cluster-role' | Creating cluster role binding 'grafana-default-cluster-rolebinding' | Creating secret 'grafana-default-values' \ Creating package resource | Package install status: Reconciling Added installed package 'grafana' in namespace 'default' %
다시 한 번, 다양한 그라파나 패키지 리소스가 tanzu-system-dashboard 네임스페이스에 생성됩니다. Grafana는 로드 밸런서 IP와 자체 httpproxy를 가져옵니다. Grafana FQDN도 구성된 경우 외부 DNS에 자동으로 추가해야 합니다.
% kubectl -n tanzu-system-dashboard get pods NAME READY STATUS RESTARTS AGE grafana-7fc98dd5b8-bq2mw 2/2 Running 0 2m25s % kubectl -n tanzu-system-dashboard get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana LoadBalancer 100.67.139.55 xx.xx.62.21 80:31126/TCP 2m33s % kubectl -n tanzu-system-dashboard get httpproxy NAME FQDN TLS SECRET STATUS STATUS DESCRIPTION grafana-httpproxy graf-tkgs-cork.rainpole.com grafana-tls valid Valid HTTPProxy % kubectl -n tanzu-system-dashboard get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE grafana-pvc Bound pvc-72e06aa7-9944-439a-80e0-40fecd61915b 2Gi RWO vsan-default-storage-policy 2m54s
모든 것이 올바르게 작동한다고 가정하면 이제 Grafana FQDN에 연결하여 vSphere with Tanzu 워크로드 클러스터의 대시보드를 볼 수 있습니다. DNS와 통합하지 않은 경우 위에 표시된 Grafana FQDN 및 Grafana 로드 밸런서 IP 주소를 로컬 /etc/hosts에 추가합니다. Grafana의 기본 로그인은 admin/admin이며 새 admin 암호를 설정하라는 메시지가 표시됩니다. 그런 다음 왼쪽의 Dashboards > Manage로 이동하여 두 개의 기존 대시보드 중 하나를 선택하여 몇 가지 메트릭을 확인합니다. 이것은 TKG Kubernetes 클러스터 모니터링 대시보드입니다. 물론, 원하는 경우 직접 맞춤형 대시보드를 작성할 수 있습니다.
이를 통해 TKG 서비스를 통해 프로비저닝된 워크로드 클러스터에 Prometheus 및 Grafana 모니터링 스택을 구축하는 것이 얼마나 쉬운지에 대한 유용한 통찰력을 얻을 수 있기를 바랍니다. 다음은 클러스터에 설치된 전체 패키지 목록입니다.
% tanzu package installed list - Retrieving installed packages... NAME PACKAGE-NAME PACKAGE-VERSION STATUS cert-manager cert-manager.tanzu.vmware.com 1.1.0+vmware.1-tkg.2 Reconcile succeeded contour contour.tanzu.vmware.com 1.17.1+vmware.1-tkg.1 Reconcile succeeded external-dns external-dns.tanzu.vmware.com 0.8.0+vmware.1-tkg.1 Reconcile succeeded grafana grafana.tanzu.vmware.com 7.5.7+vmware.1-tkg.1 Reconcile succeeded prometheus prometheus.tanzu.vmware.com 2.27.0+vmware.1-tkg.1 Reconcile succeeded % kubectl get apps NAME DESCRIPTION SINCE-DEPLOY AGE cert-manager Reconcile succeeded 58s 172m contour Reconcile succeeded 29s 35m external-dns Reconcile succeeded 39s 25m grafana Reconcile succeeded 2m20s 2m24s prometheus Reconcile succeeded 22s 17m
마지막으로, 이제 VMware Cloud에서 Tanzu Services를 이용할 수 있습니다. VMware Cloud를 사용하면 vSphere 관리자는 기본 SDDC 인프라를 관리할 필요 없이 DevOps 팀을 위해 TKG 서비스를 통해 Tanzu Kubernetes 워크로드 클러스터를 구축할 수 있습니다. 여기에서 Tanzu Services에 대해 자세히 읽어보십시오.
출처 : https://cormachogan.com/2022/02/17/prometheus-grafana-monitoring-stack-on-tkgs-workload-cluster-in-vsphere-with-tanzu/
2 comments
강사님, 자료를 모니터링 조사하다가 들렀습니다.~
좋은 하루 되세요.
헛~ 언제 다녀가셨어유! 감사합니다.