OpenShift에서 프로그래밍 방식으로 Jaeger REST API에 액세스

Jaeger에서 프로그래밍 방식으로 OpenShift에 액세스하려고 시도한 적이 있습니까? 조금 어려울 수 있습니다. 경우에 따라 예를 들어 REST API에 대한 액세스를 원하기 때문에 필요합니다which is not documented because it is for internal usage. 또는 (내 경우처럼) UI에서 무언가를 테스트하고 싶을 수도 있습니다.



이 글을 읽기 전에



이 문서는 "프로덕션"배포 전략을 사용하고 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


읽어 주셔서 감사합니다! 이 기사가 도움이 되었기를 바랍니다. :)

좋은 웹페이지 즐겨찾기