Closed visionhong closed 2 years ago
안녕하세요! 찾아보니까 http와 관련된 이슈인 것 같습니다. 아래 내용처럼 kubeflow-gateway를 수정 후 다시 apply 해보시겠어요? https://github.com/kubeflow/kubeflow/issues/5803#issuecomment-848618070
안녕하세요 문의주셔서 감사합니다!
구성하신 클러스터 환경의 다음 정보를 말씀해주시면 더 자세한 확인이 가능할 것 같습니다! 답변주시면 감사하겠습니다. @tjems6498
kubectl get pod -n istio-system
의 출력 결과
kubectl get pod -n dex
의 출력 결과
kubectl get pod -l component=kube-apiserver -n kube-system -o yaml
의 출력 결과
kubectl get pod -n kube-system
이후, kube-apiserver-
로 시작하는 pod 의 이름을 조회한 후, kubectl get pod <해당 pod의 이름> -n kube-system -o yaml
의 출력 결과@tjems6498 이거 저도 같은 문제로 4일 동안 해맸는데, 방금 해결했습니다.
사실 올바른 해법이라고 보기는 어렵지만, http 접근 해용을 해주기 위해 manifest/apps/jupyter/jupyter-web-app/upstream/base
의 deployment.yaml
파일의 내용을 다음과 같이 수정했습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 1
template:
metadata:
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: jupyter-web-app
image: public.ecr.aws/j1r0q0g6/notebooks/jupyter-web-app
ports:
- containerPort: 5000
volumeMounts:
- mountPath: /etc/config
name: config-volume
- mountPath: /src/apps/default/static/assets/logos
name: logos-volume
env:
- name: APP_PREFIX
value: $(JWA_PREFIX)
- name: UI
value: $(JWA_UI)
- name: USERID_HEADER
value: $(JWA_USERID_HEADER)
- name: USERID_PREFIX
value: $(JWA_USERID_PREFIX)
- name: APP_SECURE_COOKIES # 새로이 추가한 부분
value: "false" # 새로이 추가한 부분
serviceAccountName: service-account
volumes:
- configMap:
name: config
name: config-volume
- configMap:
name: jupyter-web-app-logos
name: logos-volume
위와 같이 deployment.yaml을 수정하고 manifest 폴더 경로에서 kustomize build apps/jupyter/jupyter-web-app/upstream/overlays/istio | kubectl apply -f -
를 다시 수행하니, jupyter notebook이 생성되는 것을 볼 수 있었습니다.
manifest 레포에 APP_SECURE_COOKIES
설정 값이 없어서 왜 이 내용이 레포에 빠져 있나 했더니, https 설정이 기본이라 http 접근을 권장하지 않는 상황 때문에 설정이 안되어 있다고 하네요...
혹시 잘못된 설명이 있으면 말씀해주세요!
@tjems6498 저는 MetalLB 와 kubeflow-self-signing-issuer 를 사용하여 해결하였습니다. MetallB 사용방법은 여기를 참조해서 설정하시면 됩니다.
밑에서 kubeflow-self-issuer 설정 방법은 여기를 토대로 설명하겠습니다.
먼저 gateways-issuer.yaml 파일을 작성합니다.
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: kubeflow-ingressgateway-certs
namespace: istio-system
spec:
secretName: kubeflow-ingressgateway-certs
issuerRef:
kind: ClusterIssuer
name: gateways-issuer
commonName: istio-ingressgateway.istio-system.svc
ipAddresses:
- 192.168.35.100 # istio-ingressgateway에 할당한 ip를 적어주세요
gateways-issuer.yaml를 적용합니다.
kubectl apply -f gateways-issuer.yaml
다음으로는 kubeflow-gateway의 설정에 밑의 부분을 추가합니다.
kubectl edit gateway/kubeflow-gateway -n kubeflow
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.istio.io/v1alpha3","kind":"Gateway","metadata":{"annotations":{},"name":"k>
creationTimestamp: "2022-01-05T08:43:55Z"
generation: 6
name: kubeflow-gateway
namespace: kubeflow
resourceVersion: "472376"
uid: e1e5515c-9520-4b55-84a8-afe58df640e6
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: http
number: 80
protocol: HTTP
# 아래 부분을 추가해주세요
tls:
httpsRedirect: true
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: kubeflow-ingressgateway-certs
mode: SIMPLE
kubeflow-gateway파일 수정후 https:192.168.35.100에 접속하면
위의 그림과 같이 https로 접속하는 것을 확인할 수 있습니다.
마지막으로 위의 그림과 같이 Could not find CSRF cookie XSRF-TOKEN in the request 이슈 없이 노트북을 만들 수 있습니다.
@kosehy MetallB를 통해 svc/istio-ingressgateway 의 Type을 LoadBalancer 로 변경하였고 EXTERNAL-IP는 예시랑 같은 IP인 192.168.35.100 으로 하였는데 https://192.168.35.100 으로 접속이 되질 않습니다.
제가 제대로 했다면 우분투 서버 IP와는 관계없이 EXTERNAL-IP인 192.168.35.100로 접속이 가능해야 하나요?
@kosehy MetallB를 통해 svc/istio-ingressgateway 의 Type을 LoadBalancer 로 변경하였고 EXTERNAL-IP는 예시랑 같은 IP인 192.168.35.100 으로 하였는데 https://192.168.35.100 으로 접속이 되질 않습니다.
제가 제대로 했다면 우분투 서버 IP와는 관계없이 EXTERNAL-IP인 192.168.35.100로 접속이 가능해야 하나요?
@tjems6498 일단
ip addr | grep 192.168
이 명령어를 치시면 나오는 우분투 서버 IP를 기반으로 MetalLB IP 설정 에 있는 IP 대역폭을 수정하시고 해당 IP 대역폭에있는 IP 주소를 사용하시면 됩니다.
예시로
ip addr | grep 192.168
결과가
inet 192.168.12.15/24 brd 192.168.12.255 scope global noprefixroute
로 나올 경우에는 MetalLB IP 설정 에 있는 IP 대역폭 설정시 사용가능한 IP address pool을 선택합니다. 여기서는 192.168.12.100 ~ 192.168.12.110
을 사용가능한 주소로 예를 들어서 설명하겠습니다.
MetalLB IP address pool 을
192.168.12.100 ~ 192.168.12.110
으로 설정하신 다음에 여기에 있는 IP 주소 중 하나를 선택합니다. 이 예시에서는 192.168.12.100
을 예시로 들겠습니다.
192.168.12.100
을 svc/istio-ingressgateway 의 loadBalancerIP 값으로 넣으시고
kubeflow-self-issuer 설정 에 있는 ipAddresses: 에
192.168.12.100
을 추가하시면 https://192.168.12.100 으로 kubeflow ui에 접속이 가능합니다
@kosehy 알려주신대로 아래와 같이 진행했습니다.
ip addr | grep 192.168
실행 결과
inet 192.168.49.1/24 brd 192.168.49.255 scope global br-5edf5fa536d0
MetalLB IP설정에서 대역폭의 범위를 192.168.49.100-192.168.49.110로 수정 하였고 svc/istio-ingressgateway 의 loadBalancerIP 값으로 192.168.49.100 을 주었습니다
아래는 svc/istio-ingressgateway의 수정 전 후 정보입니다. 수정 전
수정 후
완료 후에 https://192.168.49.100 로 접속 시도하였지만 접속이 되지않습니다.(kubeflow-self-issuer 설정 후에도 마찬가지입니다..)
info k8s cluster : minikube v1.22.0
metallb_config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.49.100-192.168.49.110 # IP 대역폭
kubectl edit svc/istio-ingressgateway -n istio-system
spec:
clusterIP: 10.106.77.97
externalTrafficPolicy: Cluster
loadBalancerIP: 192.168.49.100
ports:
- name: status-port
nodePort: 30770
port: 15021
protocol: TCP
targetPort: 15021
- name: http2
nodePort: 30199
port: 80
protocol: TCP
targetPort: 8080
- name: https
nodePort: 30121
port: 443
protocol: TCP
targetPort: 8443
- name: tcp
nodePort: 30896
port: 31400
protocol: TCP
targetPort: 31400
- name: tls
nodePort: 30594
port: 15443
protocol: TCP
targetPort: 15443
selector:
app: istio-ingressgateway
istio: ingressgateway
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 192.168.49.100
@kosehy 알려주신대로 아래와 같이 진행했습니다.
ip addr | grep 192.168
실행 결과
inet 192.168.49.1/24 brd 192.168.49.255 scope global br-5edf5fa536d0
MetalLB IP설정에서 대역폭의 범위를 192.168.49.100-192.168.49.110로 수정 하였고 svc/istio-ingressgateway 의 loadBalancerIP 값으로 192.168.49.100 을 주었습니다
아래는 svc/istio-ingressgateway의 수정 전 후 정보입니다. 수정 전
수정 후
완료 후에 https://192.168.49.100 로 접속 시도하였지만 접속이 되지않습니다.(kubeflow-self-issuer 설정 후에도 마찬가지입니다..)
info k8s cluster : minikube v1.22.0
metallb_config.yaml
apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 192.168.49.100-192.168.49.110 # IP 대역폭
kubectl edit svc/istio-ingressgateway -n istio-system
spec: clusterIP: 10.106.77.97 externalTrafficPolicy: Cluster loadBalancerIP: 192.168.49.100 ports: - name: status-port nodePort: 30770 port: 15021 protocol: TCP targetPort: 15021 - name: http2 nodePort: 30199 port: 80 protocol: TCP targetPort: 8080 - name: https nodePort: 30121 port: 443 protocol: TCP targetPort: 8443 - name: tcp nodePort: 30896 port: 31400 protocol: TCP targetPort: 31400 - name: tls nodePort: 30594 port: 15443 protocol: TCP targetPort: 15443 selector: app: istio-ingressgateway istio: ingressgateway sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: 192.168.49.100
일단 저는 kubeadm으로 k8s를 설치해서 minikube 하고 차이가 날 수도 있습니다.
혹시 gateways-issuer.yaml
파일 적용 후에 kubeflow-gateway
파일도 수정을 하셨나요?
만약 kubeflow-gateway
파일을 수정 하셨으면
kubectl delete -f gateways-issuer.yaml
및 kubeflow-gateway
에서 추가한 코드부분을 삭제하시고
192.168.49.100
으로 kubeflow ui 에 접속 가능한지 확인해보세요 . 해결이 안되면 linkedin 여기로 문자보내주세요
저도 동일한 문제가 나타납니다.
@dsyou20 해당 문제는 https://github.com/kubeflow/kubeflow/pull/6395 에서 같은 방법으로도 해결할 수 있습니다.
@RyanKor
@tjems6498 이거 저도 같은 문제로 4일 동안 해맸는데, 방금 해결했습니다.
사실 올바른 해법이라고 보기는 어렵지만, http 접근 해용을 해주기 위해
manifest/apps/jupyter/jupyter-web-app/upstream/base
의deployment.yaml
파일의 내용을 다음과 같이 수정했습니다.apiVersion: apps/v1 kind: Deployment metadata: name: deployment spec: replicas: 1 template: metadata: annotations: sidecar.istio.io/inject: "false" spec: containers: - name: jupyter-web-app image: public.ecr.aws/j1r0q0g6/notebooks/jupyter-web-app ports: - containerPort: 5000 volumeMounts: - mountPath: /etc/config name: config-volume - mountPath: /src/apps/default/static/assets/logos name: logos-volume env: - name: APP_PREFIX value: $(JWA_PREFIX) - name: UI value: $(JWA_UI) - name: USERID_HEADER value: $(JWA_USERID_HEADER) - name: USERID_PREFIX value: $(JWA_USERID_PREFIX) - name: APP_SECURE_COOKIES # 새로이 추가한 부분 value: "false" # 새로이 추가한 부분 serviceAccountName: service-account volumes: - configMap: name: config name: config-volume - configMap: name: jupyter-web-app-logos name: logos-volume
위와 같이 deployment.yaml을 수정하고 manifest 폴더 경로에서
kustomize build apps/jupyter/jupyter-web-app/upstream/overlays/istio | kubectl apply -f -
를 다시 수행하니, jupyter notebook이 생성되는 것을 볼 수 있었습니다.manifest 레포에
APP_SECURE_COOKIES
설정 값이 없어서 왜 이 내용이 레포에 빠져 있나 했더니, https 설정이 기본이라 http 접근을 권장하지 않는 상황 때문에 설정이 안되어 있다고 하네요...혹시 잘못된 설명이 있으면 말씀해주세요!
안녕하세요, 말씀하신 대로 수정 후
kustomize build apps/jupyter/jupyter-web-app/upstream/overlays/istio | kubectl apply -f -
하니 다음과 같은 에러가 뜹니다.
panic: runtime error: index out of range [12] with length 12 [recovered]
panic: runtime error: index out of range [12] with length 12
goroutine 1 [running]:
gopkg.in/yaml%2ev3.handleErr(0xc000ca38f0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/yaml.go:276 +0x85
panic(0xbedf00, 0xc001c03140)
/usr/local/go/src/runtime/panic.go:969 +0x1b9
gopkg.in/yaml%2ev3.write(0xc000683500, 0xc002c6e0c0, 0xc, 0x10, 0xc000c9ed90, 0x829c01)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/emitterc.go:90 +0x245
gopkg.in/yaml%2ev3.yaml_emitter_write_comment(0xc000683500, 0xc002c6e0c0, 0xc, 0x10, 0x1)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/emitterc.go:1978 +0x1ae
gopkg.in/yaml%2ev3.yaml_emitter_process_line_comment(0xc000683500, 0xc000cab5f0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/emitterc.go:1128 +0x6a
gopkg.in/yaml%2ev3.yaml_emitter_emit_block_mapping_value(0xc000683500, 0xc000cab5f0, 0x418801, 0x1)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/emitterc.go:817 +0xec
gopkg.in/yaml%2ev3.yaml_emitter_state_machine(0xc000683500, 0xc000cab5f0, 0x127d201)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/emitterc.go:303 +0x445
gopkg.in/yaml%2ev3.yaml_emitter_emit(0xc000683500, 0xc000683740, 0xc002c6e0d0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/emitterc.go:153 +0x14f
gopkg.in/yaml%2ev3.(*encoder).emit(0xc000683500)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:81 +0x39
gopkg.in/yaml%2ev3.(*encoder).emitScalar(0xc000683500, 0xc001e377a0, 0x5, 0x0, 0x0, 0x0, 0x0, 0xc001990f02, 0x1285808, 0x0, ...)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:417 +0x31a
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0030d19a0, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:559 +0x136f
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0030d17c0, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:508 +0xb25
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0030d0aa0, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:478 +0x5fc
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0002f5c20, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:512 +0xa6f
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0002f5ae0, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:478 +0x5fc
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0002f5860, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:512 +0xa6f
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0001c7220, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:512 +0xa6f
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0006adf40, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:512 +0xa6f
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0006ad900, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:512 +0xa6f
gopkg.in/yaml%2ev3.(*encoder).node(0xc000683500, 0xc0006ad7c0, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:463 +0x245
gopkg.in/yaml%2ev3.(*encoder).nodev(0xc000683500, 0xbb3a00, 0xc0006ad7c0, 0x16)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:421 +0x79
gopkg.in/yaml%2ev3.(*encoder).marshalDoc(0xc000683500, 0x0, 0x0, 0xbb3a00, 0xc0006ad7c0, 0x16)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/encode.go:101 +0x23a
gopkg.in/yaml%2ev3.(*Encoder).Encode(0xc00000e7f8, 0xbb3a00, 0xc0006ad7c0, 0x0, 0x0)
/go/pkg/mod/gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c/yaml.go:251 +0xea
sigs.k8s.io/kustomize/kyaml/yaml.String(0xc0006ad7c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/go/pkg/mod/sigs.k8s.io/kustomize/kyaml@v0.10.9/yaml/types.go:215 +0x1b3
sigs.k8s.io/kustomize/kyaml/yaml.(*RNode).String(...)
/go/pkg/mod/sigs.k8s.io/kustomize/kyaml@v0.10.9/yaml/rnode.go:468
sigs.k8s.io/kustomize/kyaml/yaml.(*RNode).MarshalJSON(0xc002f26b40, 0x200, 0x0, 0x0, 0x0, 0xc001990230)
/go/pkg/mod/sigs.k8s.io/kustomize/kyaml@v0.10.9/yaml/rnode.go:674 +0x37a
sigs.k8s.io/kustomize/api/internal/wrappy.(*WNode).MarshalJSON(0xc000102828, 0x17c, 0x180, 0x502ab9, 0xc000ba8067, 0xc000346600)
/go/pkg/mod/sigs.k8s.io/kustomize/api@v0.8.0/internal/wrappy/wnode.go:219 +0x2e
sigs.k8s.io/kustomize/api/resource.(*Resource).MarshalJSON(...)
/go/pkg/mod/sigs.k8s.io/kustomize/api@v0.8.0/resource/resource.go:106
sigs.k8s.io/kustomize/api/resource.(*Resource).AsYAML(0xc000076f00, 0xc000346600, 0x174, 0x200, 0x174, 0x0)
/go/pkg/mod/sigs.k8s.io/kustomize/api@v0.8.0/resource/resource.go:359 +0x38
sigs.k8s.io/kustomize/api/resmap.(*resWrangler).AsYaml(0xc0003916a0, 0x0, 0x0, 0x0, 0x0, 0x0)
/go/pkg/mod/sigs.k8s.io/kustomize/api@v0.8.0/resmap/reswrangler.go:273 +0x10c
sigs.k8s.io/kustomize/kustomize/v3/commands/build.(*Options).emitResources(0xc0004307e0, 0xd2f000, 0xc000102008, 0xd4eac0, 0x1285808, 0xd52560, 0xc0003916a0, 0xc0002d5880, 0xc0000bdd98)
/workspace/myClone/kustomize/commands/build/build.go:160 +0x4e
sigs.k8s.io/kustomize/kustomize/v3/commands/build.(*Options).RunBuild(0xc0004307e0, 0xd2f000, 0xc000102008, 0x1, 0x0)
/workspace/myClone/kustomize/commands/build/build.go:152 +0x135
sigs.k8s.io/kustomize/kustomize/v3/commands/build.NewCmdBuild.func1(0xc000450000, 0xc0003b8ee0, 0x1, 0x1, 0x0, 0x0)
/workspace/myClone/kustomize/commands/build/build.go:70 +0xad
github.com/spf13/cobra.(*Command).execute(0xc000450000, 0xc0003b8eb0, 0x1, 0x1, 0xc000450000, 0xc0003b8eb0)
/go/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:842 +0x47c
github.com/spf13/cobra.(*Command).ExecuteC(0xc00015f8c0, 0x0, 0xb3aa40, 0xc000078058)
/go/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:950 +0x375
github.com/spf13/cobra.(*Command).Execute(...)
/go/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:887
main.main()
/workspace/myClone/kustomize/main.go:14 +0x2a
error: no objects passed to apply
다음처럼 직접 apply 하면
kubectl apply -f apps/jupyter/jupyter-web-app/upstream/base/deployment.yaml
error: error validating "apps/jupyter/jupyter-web-app/upstream/base/deployment.yaml": error validating data: ValidationError(Deployment.spec): missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors, turn validation off with --validate=false
이번에는 위와 같은 오류가 납니다..
혹시 원인과 해결법 아신다면 도와주시면 감사하겠습니다.!!
안녕하세요! 강의에 필요한 kubflow 컴포넌트들을 설치하고 kubectl port-forward --address [우분투 서버 IP] svc/istio-ingressgateway -n istio-system 8080:80 로 대시보드에 들어와서 주피터랩을 launch하면 다음과 같은 alert가 발생하면서 진행이 되지 않습니다.
로컬환경에서 진행하면 문제가 없을 것 같은데 원격서버에서 실습을 하고싶어 꼭 해결하고 싶은데 구글링을 해봐도 해결이 되지 않습니다... 도움을 받을 수 있을까요? 항상 감사드립니다.