반응형
장황한 설명보다는 예제가 이해가 쉬울 듯하여, 아래의 예제 코드를 작성했다.
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
'kubernetes' 카테고리의 다른 글
OCP API Token 조회 (0) | 2022.05.19 |
---|---|
kubernetes node의 taint & toleration (0) | 2022.03.30 |
Kubernetes 또는 OCP에 SR-IOV 네트워크 추가 (0) | 2022.01.13 |
Kubernetes Pod이 Terminating 상태에 빠짐(Pod Stuck in Terminating Status) (0) | 2021.12.30 |
Kubernetes Metrics Server 설치 (0) | 2021.11.26 |