๐Ÿ’ป/MLOps

Kubernetes API ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ

ruhz 2024. 2. 23. 22:31

์ตœ๊ทผ ๋งŽ์€ ํŒ€์›๋“ค์ด ์„œ๋น„์Šค, ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ k8s ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ •๋ณด๋ฅผ ์–ป์–ด์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฏธ์ง€ ๋‚ด์— kubectl์„ ์„ค์น˜ํ•˜๊ณ  ์ฝ”๋“œ์—์„œ kubectl ์ปค๋งจ๋“œ๋ฅผ string์œผ๋กœ ์ €์žฅํ•ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜(?) ์‹ฌ์ง€์–ด token๊ฐ’์„ string์œผ๋กœ ๋ฐ•์•„ ๋„ฃ์œผ๋ ค๋Š”(!) ์‹œ๋„๋ฅผ ํ•˜๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜๋‹ค. 

์ด ๋ถ€๋ถ„์„ ๋ฐ”๋กœ ์žก์œผ๋ฉฐ, ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์–ด๋–ค ๋ฌธ์˜๋ฅผ ๋งŽ์ด ๋ฐ›์•˜๋Š”์ง€๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. 

 

kubectl์„ ์ด๋ฏธ์ง€ ๋‚ด ์„ค์น˜ํ•œ๋‹ค(?)

์‚ฌ์‹ค ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.

  1. ์ด๋ฏธ์ง€ ๋‚ด kubectl ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด๋‘”๋‹ค.
  2. ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉํ•  ์ ์ ˆํ•œ ๊ถŒํ•œ์˜ ๊ณ„์ •์„ ์ถ”๊ฐ€ํ•˜๊ณ , kubeconfig๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. configmap์œผ๋กœ kubeconfig๋ฅผ ๋งˆ์šดํŠธํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ, ์ฝ”๋“œ ์—์„œ ์‹œ์Šคํ…œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,
์—๋Ÿฌ ์ฒ˜๋ฆฌ, ๋””๋ฒ„๊น…๋„ ์ „ํ˜€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์ผ ๋ฟ ์•„๋‹ˆ๋ผ ์ดํ›„์— ์ด์–ด์งˆ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์—‰์„ฑํ•ด์ง€๊ฒŒ ๋œ๋‹ค.

๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์ด์ง€๋งŒ ๊ถŒํ•œ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ๋„ ์„œ๋น„์Šค์˜ ๊ถŒํ•œ์„ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ๋”ฐ๋กœ ๊ณ„์ •์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊นจ๋—ํ•˜์ง€ ๋ชปํ•œ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค. 

 

kubectl

์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ์ง€ ๋‚ด kubectl์„ ์„ค์น˜ํ•ด ์‚ฌ์šฉํ•ด์™”๋˜๊ฑด, kubectl์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ง€๋„ ํŠน๋ณ„ํžˆ ๊ด€์‹ฌ์„ ๊ฐ–์ง€ ์•Š๊ณ  k8s๋ฅผ ํ†ต์ œํ•˜๋Š” ์œ ์ผํ•œ ๋งŒ๋Šฅ ๋„๊ตฌ์ธ ๊ฒƒ ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž ๊ด€์ ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๊ฒฐ๊ตญ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋กœ ๋™์ž‘ํ•˜๋Š” ๋…€์„์ด๊ณ , kubectl ์—ญ์‹œ cli์—์„œ API๋ฅผ ์ปค๋งจ๋“œ๋กœ ์‰ฝ๊ฒŒ ๋‚ ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์—ฌ๋Ÿฌ client ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

https://veritis.com/services/kubernetes/

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ๊ฐ„๋‹จํ•œ kubectl ์ปค๋งจ๋“œ๋„, KUBECONFIG์— ์ •์˜๋˜์–ด ์žˆ๋Š” k8s API ์„œ๋ฒ„ ์ฃผ์†Œ, ์ธ์ฆ ์ •๋ณด, ๊ณ„์ • ์ •๋ณด ๋“ฑ์„ ๊ฐ€์ง€๊ณ  "GET /api/v1/namespaces/{namespace}/pods/{name}" ์˜ ์š”์ฒญ์„ k8s master ๋…ธ๋“œ์˜ API ์„œ๋ฒ„์— ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. 

kubectl get pods -n spark
 

Kubernetes API Reference Docs

API Overview Welcome to the Kubernetes API. You can use the Kubernetes API to read and write Kubernetes resource objects via a Kubernetes API endpoint. Resource Categories This is a high-level overview of the basic types of resources provide by the Kuberne

kubernetes.io

 

ํŒŒ๋“œ ๋‚ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์ ‘๊ทผ

๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„์™€, ๊ทธ๋Ÿผ ํŒŒ๋“œ ์•ˆ์—์„œ ์–ด๋–ป๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์˜ณ์€ ๋ฐฉ๋ฒ•์ด๋ž€ ๋ง์ด๋ƒ.
๊ณต์‹๋ฌธ์„œ์— ์•„์ฃผ ์ž˜ ์„ค๋ช…์ด ๋˜์–ด ์žˆ๋‹ค.

 

ํŒŒ๋“œ ๋‚ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผ

์ด ํŽ˜์ด์ง€๋Š” ํŒŒ๋“œ ๋‚ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ

kubernetes.io

API ์„œ๋ฒ„๋ฅผ ์ธ์ฆํ•˜๋Š” ๊ถŒ์žฅ ๋ฐฉ๋ฒ•์€ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, ํŒŒ๋“œ๋Š” ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…(ํ† ํฐ)์€ ํ•ด๋‹น ํŒŒ๋“œ์— ์žˆ๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ ํŠธ๋ฆฌ์˜ /var/run/secrets/kubernetes.io/serviceaccount/token ์— ์žˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ๊ถŒํ•œ ์ œ์–ด, ์ธ์ฆ ๋“ฑ์€ ์„œ๋น„์Šค๊ฐ€ ๋ฌผ๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์— ์žˆ๊ณ , ํŒŒ๋“œ์— ๋งˆ์šดํŠธ๋˜์–ด ์žˆ์œผ๋‹ˆ, ๊ฐ€์ ธ์™€ ์ ์ ˆํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

ํŒŒ๋“œ ๋‚ด์—์„œ "์ปค๋งจ๋“œ"๋กœ API์„ ๋‚ ๋ ค๋ณด์ž๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์š”์ฒญ์ด ๋œ๋‹ค.

APISERVER=https://kubernetes.default.svc
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
TOKEN=$(cat ${SERVICEACCOUNT}/token)
CACERT=${SERVICEACCOUNT}/ca.crt
 
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/spark/pods

ํŒŒ๋“œ ๋‚ด์—์„œ "ํŒŒ์ด์ฌ"์œผ๋กœ API๋ฅผ ๋‚ ๋ ค๋ณด์ž๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์š”์ฒญ์ด ๋œ๋‹ค. 

conf = client.Configuration()
conf.api_key['authorization'] = open('/var/run/secrets/kubernetes.io/serviceaccount/token').read()
conf.api_key_prefix['authorization'] = 'Bearer'
conf.host = 'https://kubernetes.default'
conf.ssl_ca_cert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
conf.verify_ssl = True

v1 = client.CoreV1Api(client.ApiClient(conf))
pod_items: {} = v1.list_namespaced_pod("spark", watch=False).items

 

 

Service Account์— ๊ถŒํ•œ ๋ถ€์—ฌ

(์„ค๋ช…์„ ์œ„ํ•ด ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž) ๋ชจ๋ธํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ ํŒŒ์ด์ฌ ์ฝ”๋“œ์—์„œ, ์ƒˆ๋กœ ์„ค์น˜ํ•œ spark-operator์˜ ์ปค์Šคํ…€ ์˜ค๋ธŒ์ ํŠธ์ธ sparkapplication์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์ปค์Šคํ…€ ์˜ค๋ธŒ์ ํŠธ๋Š” CRD(Custom Resource Definement)๋ฅผ ํ†ตํ•ด ์ •์˜๋œ๋‹ค. CRD์—๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ŠคํŽ™๊ณผ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  API ์ด๋ฆ„์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค. ์‹ค์ œ spark-operator์˜ crd๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

spark-operator/manifest/crds/sparkoperator.k8s.io_sparkapplications.yaml at master · kubeflow/spark-operator

Kubernetes operator for managing the lifecycle of Apache Spark applications on Kubernetes. - kubeflow/spark-operator

github.com

 

์–ด์ฐŒ๋๋“  ํ•ด๋‹น API๋ฅผ ํ†ตํ•ด, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ํŒŒ์ด์ฌ ์ฝ”๋“œ์ž„์„ ๊ฐ€์ •ํ–ˆ์œผ๋‹ˆ, python-kubernetes-client๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•œ๋‹ค. ๋จผ์ € python-kubernetes-client์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์–ด๋–ค ํ˜•ํƒœ๋กœ ์ปค์Šคํ…€ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ŠคํŽ™์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค.

 

python/kubernetes/docs/CustomObjectsApi.md at master · kubernetes-client/python

Official Python client library for kubernetes. Contribute to kubernetes-client/python development by creating an account on GitHub.

github.com

์ƒ์„ฑ ๊ธฐ๋Šฅ๋งŒ ์ฐ”๋” ์ž‘์„ฑํ•ด๋ณด์ž.

import kubernetes.client
import logging


class KubernetesClient:
    def __init__(self):
        conf = kubernetes.client.Configuration()
        conf.api_key['authorization'] = open('/var/run/secrets/kubernetes.io/serviceaccount/token').read()
        conf.api_key_prefix['authorization'] = 'Bearer'
        conf.host = 'https://kubernetes.default'
        conf.ssl_ca_cert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
        conf.verify_ssl = True
        self.api_client = kubernetes.client.ApiClient(conf)

    def create_crd(self, group: str, version: str, namespace: str, plural: str, body: object):
        logging.info(f"Kubernetes Client::Creating custom resource {plural}({group}/{version}).")
        api = kubernetes.client.CustomObjectsApi(self.api_client)
        return api.create_namespaced_custom_object(
            group=group,
            version=version,
            namespace=namespace,
            plural=plural,
            body=body
        )

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

spark-operator๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์„ค์น˜ํ–ˆ๊ณ , ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค์™€ API๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ, ํ˜„์žฌ ํŒŒ์ดํ”„๋ผ์ธ์ด ๊ฐ€์ง„ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์—๋Š” ํ•ด๋‹น API์— ๋Œ€ํ•œ ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค. sparkapplication์— ๋Œ€ํ•œ ์ƒ์„ฑ, ์กฐํšŒ, ์‚ญ์ œ ๋“ฑ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ๊ณจ๋ผ ๋‹ด์•„ Role์„ ๋งŒ๋“ค๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์™€ Role์„ ๋ฌถ๋Š” RoleBinding์„ ์ƒ์„ฑํ•ด์ค€๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ClusterRole ClusterRoleBinding์„ ์ƒ์„ฑํ•œ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค. 

 

Using RBAC Authorization

Role-based access control (RBAC) is a method of regulating access to computer or network resources based on the roles of individual users within your organization. RBAC authorization uses the rbac.authorization.k8s.io API group to drive authorization decis

kubernetes.io

 

์š”์•ฝ

์•„๋ž˜ ์ •๋„๋Š” ๊ธฐ๋ณธ์ด๋‹ˆ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜์ž. 

  • kubectl์„ ์ด๋ฏธ์ง€ ๋‚ด ์„ค์น˜ํ•ด์„œ ์“ฐ๋Š” ๊ฒƒ์€, ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ํ‚ค์šธ ๋ฟ ์•„๋‹ˆ๋ผ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. 
  • ์„œ๋น„์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋กœ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•˜์ž. 
  • ์„œ๋น„์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ role, cluseterRole์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๊ถŒํ•œ์„ ๊ณจ๋ผ ๋‹ด์•„ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.