장황한 설명보다는 예제가 이해가 쉬울 듯하여, 아래의 예제 코드를 작성했다.
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