OpenShift에서 프로그래밍 방식으로 Jaeger REST API에 액세스
이 글을 읽기 전에
이 문서는 "프로덕션"배포 전략을 사용하고 Jaeger Operator을 통해 배포할 때 Jaeger 쿼리 서비스에 액세스하는 방법에 대해 설명합니다. 다른 배포 방법을 사용하는 경우 일부 단계는 동일할 수 있습니다. 보안을 비활성화한 경우에도 다음 단계가 필요하지 않을 수 있습니다.
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: disable-oauth-proxy
spec:
ingress:
security: none
또한 이것이 OpenShift용임을 고려하십시오. 따라서 보안 프록시 등 없이 Kubernetes를 사용하는 경우 Jaeger 쿼리 엔드포인트에 액세스하기 위해 다음 단계를 따를 필요가 없습니다. 또는 (다른 프록시를 사용하는 경우) API에 액세스하려면 자격 증명을 구성해야 합니다. OpenShift Oauth Proxy 을 사용하고 있다고 가정합니다.
Jaeger 쿼리 서비스에 액세스하기
kubectl create -f simple-prod.yaml
네임스페이스에 다음 CRD( israel
)를 배포했다고 가정해 보겠습니다.apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simple-prod
spec:
strategy: production
storage:
type: elasticsearch
elasticsearch:
nodeCount: 1
resources:
requests:
cpu: 200m
memory: 1Gi
limits:
memory: 1Gi
생성된 OpenShift 경로에 대한 실행 결과
curl
는 403 오류입니다.$ curl https://$(kubectl get route simple-prod -o jsonpath='{.spec.host}') -I
HTTP/1.1 403 Forbidden
Set-Cookie: _oauth_proxy=; Path=/; Domain=simple-prod-israel.apps.mycluster.iblancasa.com; Expires=Thu, 05 May 2022 11:09:34 GMT; HttpOnly; Secure; SameSite
Date: Thu, 05 May 2022 12:09:34 GMT
Content-Type: text/html; charset=utf-8
Set-Cookie: 3f978cf9c2d3ee8d70cad1d11aef9dcd=8d2f11be8db90157d1e73d19b515f187; path=/; HttpOnly; Secure; SameSite=None
헤더만 수신하도록
-I
옵션을 지정하지 않은 경우 로깅 웹 페이지에서 전체 HTML 코드를 수신합니다. 서버에서 "올바른"답변을 얻는 방법을 살펴보겠습니다.첫 번째 단계는 Service Account 을 생성하는 것입니다. OpenShift 문서에서:
A service account is an OpenShift Container Platform account that allows a component to directly access the API.
내 서비스 계정의 이름을 "automation-access"로 지정하겠습니다. 따라서 내 파일
sa.yaml
에는 다음이 포함됩니다.apiVersion: v1
kind: ServiceAccount
metadata:
name: automation-access
그리고
kubectl create -f sa.yaml
를 사용하여 OpenShift에서 생성합니다.$ kubectl create -f sa.yaml
serviceaccount/automation-access created
이제 클러스터 역할 바인딩을 생성해야 합니다. Kubernetes documentation에서:
A role binding grants the permissions defined in a role to a user or set of users. It holds a list of subjects (users, groups, or service accounts), and a reference to the role being granted. A RoleBinding grants permissions within a specific namespace whereas a ClusterRoleBinding grants that access cluster-wide.
단순화로 클러스터 역할 바인딩을 사용하여 예를 들어 서비스 계정과 클러스터 역할 간의 관계를 설정할 수 있습니다. 우리의 경우
jaeger-operator
네임스페이스의 observability
서비스 계정에 대한 system:auth-delegator과 이전에 생성한 서비스 계정에 대한 cluster-reader으로 충분합니다. crb.yaml
파일은 다음과 유사합니다.kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jaeger-operator-with-auth-delegator
namespace: observability
subjects:
- kind: ServiceAccount
name: jaeger-operator
namespace: observability
roleRef:
kind: ClusterRole
name: system:auth-delegator
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: automation-access-bind
subjects:
- kind: ServiceAccount
name: automation-access
namespace: israel
roleRef:
kind: ClusterRole
name: cluster-reader
apiGroup: rbac.authorization.k8s.io
그리고 다음을 사용하여 OpenShift 클러스터에 적용합니다.
kubectl create -f crb.yaml
:$ kubectl create -f crb.yaml
clusterrolebinding.rbac.authorization.k8s.io/jaeger-operator-with-auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/automation-access-bind created
마지막으로 Jaeger 배포에 몇 가지 추가 옵션을 설정해야 합니다(
jaeger-sar.yaml
).apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simple-prod
spec:
query:
options:
query.bearer-token-propagation: true
ingress:
openshift:
sar: '{"namespace": "israel", "resource": "pods", "verb": "get"}'
delegateUrls: '{"/":{"namespace": "israel", "resource": "pods", "verb": "get"}}'
options:
pass-access-token: true
pass-user-bearer-token: true
scope: "user:info user:check-access"
pass-basic-auth: false
그런 다음
kubectl apply -f jaeger-sa.yaml
로 적용합니다.$ kubectl apply -f jaeger-sar.yaml
Warning: resource jaegers/simple-prod is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
jaeger.jaegertracing.io/simple-prod configured
확인! 거의 다 왔어. 다음 단계는 프로그래밍 방식으로 Jaeger 쿼리 서비스에 액세스할 수 있게 해주는 토큰을 얻는 것입니다. 토큰을 얻으려면 사용할 Kubernetes secret의 이름을 가져와야 합니다. 다음 명령에서 해당 정보를 얻을 수 있습니다.
$ kubectl get sa automation-access -o jsonpath='{.secrets}'
[{"name":"automation-access-token-q2p2x"},{"name":"automation-access-dockercfg-xvzsq"}]
결과는 2개의 비밀 이름입니다. 우리는
auomation-access-token-<ID>
라는 것을 사용할 것입니다. yq 을 사용하는 경우 명령은 다음과 같습니다.$ kubectl get sa automation-access -o yaml | yq eval '.secrets[] | select( .name == "*-token-*")'.name
automation-access-token-q2p2x
마지막으로 비밀에서 토큰을 추출합니다.
$ kubectl get secret automation-access-token-q2p2x -o jsonpath='{.data.token}' | base64 -d
eyJhbGciOiJSUzI1NiIsImtpZCI6Iks3TXcwUWhyb3BVdUVJblhkQmVQT25Fek1KVVlfa2RPV3dDZWpJVXpmekUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJpc3JhZWwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiYXV0b21hdGlvbi1hY2Nlc3MtdG9rZW4tcTJwMngiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYXV0b21hdGlvbi1hY2Nlc3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI1NGY1ZDE0MC1lMDEwLTQ5NWYtYWE4Yy0wNmQ3ZjIwNjg3OGIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6aXNyYWVsOmF1dG9tYXRpb24tYWNjZXNzIn0.J5USv-olD1vU0A5tL8TT1SDoH-jf5f58hSIEPnkkiZzTiOjHHx2Vj2v1p0bm26epfTQwLV3TfIsgcsV7tnpC0cR64MmDQe9EuBtNonJqV45nTkSoboWuBfeSxXqjk7Tuj_bcZcutcA0vsVHzAglb-Z0wavx9ETfQJueDWTzF6Cry5HxVxYn6ytogHfbaEgiLN9HNeZBWW4xi7JAzY-2viECrFq1yEIJKzWDihZScFkyX2fu1UDpFLH2ewA8N6bdqSd5FTEna0JS0e8yxQcGo-oXykDW2G_YcLDBSrCpQaji390FgMp_6dEl1yHSazGgCaKwulwOU4Rr6usf807mdBQ
이 명령은 암호에서 토큰을 가져와서 디코딩합니다.
Authorization
호출을 수행할 때 curl
헤더에 이 토큰을 제공해야 합니다.$ export TOKEN=$(kubectl get secret automation-access-token-q2p2x -o jsonpath='{.data.token}' | base64 -d)
$ curl https://$(kubectl get route simple-prod -o jsonpath='{.spec.host}') -I -H "Authorization: Bearer $TOKEN"
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Thu, 05 May 2022 12:44:06 GMT
Gap-Auth: system:serviceaccount:israel:[email protected]
Gap-Upstream-Address: localhost:16686
Vary: Accept-Encoding
Set-Cookie: 3f978cf9c2d3ee8d70cad1d11aef9dcd=2e6b6fcf2050268c74e1aabcf71e9bab; path=/; HttpOnly; Secure; SameSite=None
Cache-control: private
읽어 주셔서 감사합니다! 이 기사가 도움이 되었기를 바랍니다. :)
Reference
이 문제에 관하여(OpenShift에서 프로그래밍 방식으로 Jaeger REST API에 액세스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/iblancasa/access-the-jaeger-rest-api-programatically-in-openshift-ebk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)