반응형

Service Account에 역할(Role)을 Binding하는 기능에 대한 설명을 보고 싶다면, 아래 Web Docs의 10.3 절을 참고할 것 !!!

 

 

https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.10/html-single/authentication_and_authorization/index

 

인증 및 권한 부여 OpenShift Container Platform 4.10 | Red Hat Customer Portal

이 문서에서는 OpenShift Container Platform에서 ID 공급자를 정의하는 방법을 설명합니다. 또한 클러스터를 보호하기 위해 역할 기반 액세스 제어를 구성하는 방법도 알아봅니다.

access.redhat.com

 

 

`oc login` 명령을 이용하여 Service Account에 로그인하는 방법은 위 Web Docs의 11.4 절을 참고할 것 !!!

Cluster 외부에서 Service Account로 Login하는 방법을 요약하자면,
1) Service Account의 Secret 정보(즉, Token)을 열람
2) 이 Secret(즉, Token)을 `oc login --token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...` 이렇게 입력
3) `oc login` 성공하면,
4) `oc whoami`를 수행

 

'kubernetes' 카테고리의 다른 글

NUMA, CPU Pinning, DPDK, SR-IOV  (0) 2022.06.18
Service Account에 Role 부여 (Binding)  (0) 2022.06.16
Openshift Authentication and authorization  (0) 2022.06.06
OCP API Token 조회  (0) 2022.05.19
kubernetes node의 taint & toleration  (0) 2022.03.30
반응형

 

(1)  OCP의 Web Console에서 오른쪽 위에 있는 "계정 이름"을 클릭한다.

 

(2)  [ Copy login command ]을 클릭하면, 새 브라우저 창이 뜬다.

 

 

 

(3)  위 화면에서 [ Copy login command ]을 클릭하면 아래와 같은 브라우저 창이 새로 열릴 것이다.
       이 때 [ Display Token ]을 클릭한다.

 

 

 

(4)  아래와 같이 OCP API Token과,  oc login 명령 예시가 보일 것이다.

 

 

 

(5)  아래와 같이 curl로 TOKEN 값을 이용해서 API를 호출할 수 있다.

 

$  curl -X GET -H "Authorization: Bearer sha256~v9-kYQ_N...중간 생략...z1X5UA" https://api.myasset.cloud:6443/api/v1/namespaces/openshift-etcd/pods --insecure
반응형

 

장황한 설명보다는 예제가 이해가 쉬울 듯하여, 아래의 예제 코드를 작성했다.

 

 

Case:  Kubernetes Cluster 외부에서 Kubernetes Cluster 내부 Service에 접근

아래와 같은 Server, Client App의 구성을 가정하고 아래 예제를 따라해본다.

  • Server App 위치: Kubernetes Cluster 내부
  • Client App 위치: Kubernetes Cluster 외부

 


API 접근용 TOKEN 값을 알고 있다면, 바로 아래 예제를 따라서 수행하면 된다.

 

$  cat curl-pod-list.sh
##
## Create a Pod on myspace namespace
##

TOKEN=$(oc whoami -t)
ENDPOINT="https://api.ocp4.mycluster.io:6443"
NAMESPACE="myspace"

echo ""
echo "TOKEN:     $TOKEN"
echo "ENDPOINT:  $ENDPOINT"
echo "NAMESPACE: $NAMESPACE"
echo ""


##
## Get Pod list in a namespace
##

RESPONSE_FILE=./curl-pod-list-response.json

curl -v -k -o $RESPONSE_FILE \
    -H "Authorization: Bearer $TOKEN" \
    -H 'Accept: application/json' \
    $ENDPOINT/api/v1/namespaces/$NAMESPACE/pods


cat $RESPONSE_FILE


echo ""
echo "====================================================="
echo "                     Summary                         "
echo "====================================================="
echo ""

jq '.items[] | {PodName: .metadata.name, PodIP: .status.podIPs, StartTime: .status.startTime, Node: .spec.nodeName}' curl-pod-list-response.json

$

 

 

Case:  Kubernetes Cluster 내부에서 Kubernetes Cluster 내부 Service에 접근

아래와 같은 Server, Client App의 구성을 가정하고 아래 예제를 따라해본다.

  • Server App 위치: Kubernetes Cluster 내부
    • Server는 Elasticsearch API Server 역할
  • Client App 위치: Kubernetes Cluster 내부

즉, Cluster 내부에서 Pod간 통신이라고 가정한다.

 


[ 참고 ]
API 접근용 TOKEN은Pod 내부의 /var/run/secrets/kubernetes.io/serviceaccount/token 파일에 있다.
ServiceAccount 별로 Token을 생성하고 서비스 접근 권한을 부여하기 때문에 Client App 역할을 하는 Pod가 사용하는 ServiceAccount에게 Server Pod의 Service에 접근할 수 있도록 Role을 Binding해줘야 한다. 

 

 

$  cat clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-my-service-account
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: system:serviceaccount:my-namespace:my-service-account
  
  $  kubectl apply -f clusterrolebinding.yaml

 

 

#!/bin/bash


##
## Run this script in my example pod !
##
##  1) Jump into my example pod
##     $  kubectl exec -n my-namespace -it my-example-pod -- bash
##
##  2) Run this script in the above pod
##     $  chmod +x run-es-query-in-container.sh
##     $  ./run-es-query-in-container.sh
##


TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
ENDPOINT="https://elasticsearch.openshift-logging:9200"
RESPONSE_FILE=curl-es.json

rm  $RESPONSE_FILE

echo ""
echo "TOKEN:     $TOKEN"
echo "ENDPOINT:  $ENDPOINT"
echo ""


curl -k -o $RESPONSE_FILE \
    -H "Authorization: Bearer $TOKEN" \
    -H 'Content-Type: application/json' \
    -H 'Accept: application/json' \
    -d '{ "query": { "match": { "message": "cm-apiserver" } } }' \
    $ENDPOINT/infra-000094/_search?size=3



jq ".hits.hits[]._source | { kubernetes, message }" $RESPONSE_FILE

+ Recent posts