2021. 5. 9. 19:50ใ๐ฏ OpenSource/K8S
|
์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ ํต์ ํด ๋ฆฌ์์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ, ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฒ์ ๋ํด ์์๋ณธ๋ค.
8.1 Downward API๋ก ๋ฉํ๋ฐ์ดํฐ ์ ๋ฌ
ํ๋์ IP, ํธ์คํธ ์ด๋ฆ, ํ๋ ์์ฒด์ ์ด๋ฆ๊ณผ ๊ฐ์ด ์คํ ์์ ์ด ์๋ ค์ง์ง ์์ ๋ฐ์ดํฐ๋ ConfigMap ๋๋ Secret์ผ๋ก ์ ๋ฌํ๊ธฐ์ ์ ํฉํ์ง ์๋ค.
ConfigMap, Secret์ ๊ฒฝ์ฐ๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ค์ ํ๊ฑฐ๋ ํ๋๊ฐ ๋ ธ๋์ ์ค์ผ์ค๋ง ๋์ด ์คํ๋๊ธฐ ์ด์ ์ ์๊ณ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๊ฒฝ์ฐ Downward API๋ก ํด๊ฒฐํ ์ ์๋ค.
โ
Downward API - ํ๊ฒฝ๋ณ์ or downward API ๋ณผ๋ฅจ ๋ด์ ํ์ผ๋ก ํ๋์ ํด๋น ํ๊ฒฝ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ปจํ ์ด๋์ ์ ๋ฌ ํ ์ ์๋ค. - Downward API๋ REST API(์ ํ๋ฆฌ์ผ์ด์ ์ด ํธ์ถํด์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๋ api)์๋ ๋ค๋ฅด๋ค. |
8.1.1 ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉํ๋ฐ์ดํฐ ์ดํด
Downward API๋ฅผ ์ฌ์ฉํด์ ๋ค์๊ณผ ๊ฐ์ pod ์์ฒด์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ปจํ ์ด๋์ ์ ๋ฌํ ์ ์๋ค.
- ํ๋์ ์ด๋ฆ
- ํ๋ IP ์ฃผ์
- ํ๋์ ๋ค์์คํ์ด์ค
- ํ๋๊ฐ ์คํ ์ค์ธ ๋ ธ๋ ์ด๋ฆ
- ํ๋๊ฐ ์คํ ์ค์ธ ์๋น์ค ๊ณ์ ์ด๋ฆ (ํ๋๊ฐ api ์๋ฒ์ ํต์ ํ ๋ ์ธ์ฆํ๋ ๊ณ์ )
- ๊ฐ ์ปจํ ์ด๋์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ
- ๊ฐ ์ปจํ ์ด๋์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ ํ (์ปจํ ์ด๋์ ๋ณด์ฅ๋๋ CPU์ ๋ฉ๋ชจ๋ฆฌ์ ์, ์ปจํ ์ด๋๊ฐ ์ป์ ์ ์๋ ์ต๋ ์)
- ํ๋์ ๋ ์ด๋ธ
- ํ๋์ ์ด๋ ธํ ์ด์
8.1.2 ํ๊ฒฝ๋ณ์๋ก ๋ฉํ๋ฐ์ดํฐ ๋ ธ์ถํ๊ธฐ
์๋ yaml ํ์ผ์ ๋ฐ๋ฅด๋ฉด pod ์ด๋ฆ, ip, ๋ค์์คํ์ด์ค๋ ๊ฐ๊ฐ POD_NAME, POD_IP, POD_NAMESPACE๋ก ๋ํ๋๋ค.
์ด๋ divisor๋ CPU๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญ/์ ํํ ๋ ์ฌ์ฉํ๋ ๋จ์์ด๋ค.
apiVersion: v1
kind: Pod
metadata:
name: downward
spec:
containers:
- name: main
image: busybox
command: ["sleep", "9999999"]
resources:
requests:
cpu: 15m
memory: 100Ki
limits:
cpu: 100m
memory: 20Mi
env:
# ํน์ ๊ฐ์ ์ค์ ํ๋ ๋์ ํ๋ ๋งค๋ํ์คํธ์ metadata.name์ ์ฐธ์กฐ
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespac
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
- name: CONTAINER_CPU_REQUEST_MILLICORES
valueFrom:
# ์ปจํ
์ด๋์ CPU/๋ฉ๋ชจ๋ฆฌ ์์ฒญ๊ณผ ์ ํ์ fieldRef ๋์ resourceFieldRef๋ฅผ ์ฌ์ฉํด ์ฐธ์กฐ
resourceFieldRef:
resource: requests.cpu
divisor: 1m # ๋ฆฌ์์ค ํ๋์ ๊ฒฝ์ฐ ํ์ํ ๋จ์์ ๊ฐ์ ์ป์ผ๋ ค๋ฉด ์ ์(divisor)์ ์ ์
- name: CONTAINER_MEMORY_LIMIT_KIBIBYTES
valueFrom:
resourceFieldRef:
resource: limits.memory
divisor: 1Ki
์ yaml ํ์ผ์์ cpu divisor๋ 1m์ผ๋ก, 1๋ฐ๋ฆฌ์ฝ์ด๋ฅผ ์๋ฏธํ๋ค.
memory divisor๋ 1ki(ํค๋น๋ฐ์ดํธ)๋ก ์ค์ ๋์๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ปจํ ์ด๋์ ์ ์ฉ๋ ๋ชจ๋ ํ๊ฒฝ๋ณ์๋ฅผ ๋ณผ ์ ์๋ค.
์ปจํ ์ด๋ ๋ด๋ถ์ ๋ชจ๋ ํ๋ก์ธ์ค๋ ํด๋น ๋ณ์๋ฅผ ์ฝ๊ณ , ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
root@master001:~/k8s_in_action/kubernetes-in-action/Chapter08# kubectl exec downward env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=downward
POD_IP=172.30.254.34
NODE_NAME=worker002
SERVICE_ACCOUNT=default
CONTAINER_CPU_REQUEST_MILLICORES=15
CONTAINER_MEMORY_LIMIT_KIBIBYTES=20480
POD_NAME=downward
POD_NAMESPACE=default
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBIA_NODEPORT_SERVICE_HOST=10.99.129.201
KUBIA_NODEPORT_SERVICE_PORT=80
KUBIA_NODEPORT_PORT=tcp://10.99.129.201:80
KUBIA_NODEPORT_PORT_80_TCP=tcp://10.99.129.201:80
KUBIA_NODEPORT_PORT_80_TCP_PORT=80
KUBIA_NODEPORT_PORT_80_TCP_ADDR=10.99.129.201
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBIA_NODEPORT_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOME=/root
8.1.3 downward API ๋ณผ๋ฅจ์ ํ์ผ๋ก ๋ฉํ๋ฐ์ดํฐ ์ ๋ฌ
downward API ๋ณผ๋ฅจ์ ์ด์ฉํด์ ํ๊ฒฝ๋ณ์ ๋์ ํ์ผ๋ก ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ ธ์ถํ ์ ์๋ค.
ํ๋์ ๋ผ๋ฒจ์ด๋ ์ด๋ ธํ ์ด์ ์ ํ์ผ๋ก๋ง ์ ๋ฌ ๊ฐ๋ฅํ๋ค.
downward๋ผ๋ ๋ณผ๋ฅจ์ ์ ์ํ๊ณ ์ปจํ ์ด๋์ /etc/downward ์๋์ ๋ง์ดํธํ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: downward
labels: # ๋ ์ด๋ธ๊ณผ ์ด๋
ธํ
์ด์
์ downwardAPI ๋ณผ๋ฅจ์ผ๋ก ๋
ธ์ถ
foo: bar
annotations:
key1: value1
key2: |
multi
line
value
spec:
containers:
- name: main
image: busybox
command: ["sleep", "9999999"]
resources:
requests:
cpu: 15m
memory: 100Ki
limits:
cpu: 100m
memory: 4Mi
volumeMounts:
- name: downward
mountPath: /etc/downward # downward ๋ณผ๋ฅจ /etc/downward์ ๋ง์ดํธ
volumes:
- name: downward # downwardAPI ๋ณผ๋ฅจ ์ ์
downwardAPI:
items:
- path: "podName" # metadata.name์ ์ ์ํ ์ด๋ฆ์ podName ํ์ผ์ ๊ธฐ๋ก๋จ
fieldRef:
fieldPath: metadata.name
- path: "podNamespace"
fieldRef:
fieldPath: metadata.namespac
- path: "labels" # ํ๋์ ๋ ์ด๋ธ์ /etc/downward/labels ํ์ผ์ ๊ธฐ๋ก๋จ
fieldRef:
fieldPath: metadata.labels
- path: "annotations" # ํ๋์ ์ด๋
ธํ
์ด์
์ /etc/downward/annotations ํ์ผ์ ๊ธฐ๋ก๋จ
fieldRef:
fieldPath: metadata.annotations
- path: "containerCpuRequestMilliCores"
resourceFieldRef:
containerName: main
resource: requests.cpu
divisor: 1m
- path: "containerMemoryLimitBytes"
resourceFieldRef:
containerName: main
resource: limits.memory
divisor: 1
๋ง์ดํธ๋ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ธ ๊ฐ๋ฅํ๋ค.
root@master001:~/k8s_in_action/kubernetes-in-action/Chapter08# kubectl exec downward-volume -- ls -lL /etc/downward
total 24
-rw-r--r-- 1 root root 227 May 9 12:16 annotations
-rw-r--r-- 1 root root 2 May 9 12:16 containerCpuRequestMilliCores
-rw-r--r-- 1 root root 8 May 9 12:16 containerMemoryLimitBytes
-rw-r--r-- 1 root root 9 May 9 12:16 labels
-rw-r--r-- 1 root root 15 May 9 12:16 podName
-rw-r--r-- 1 root root 7 May 9 12:16 podNamespace
ํ๊ฒฝ๋ณ์๋ก๋ ์ ๋ฌํ ์ ์๋ label๊ณผ annotaion๋ ์ ๋ฌ๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
๋ ์ด๋ธ๊ณผ ์ด๋ ธํ ์ด์ ์ ๋ฐ์ดํธ
- downward API ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋ฉด ํ๋๊ฐ ์คํ ์ค์ธ ์ํ์์ ๋ ์ด๋ธ๊ณผ ์ด๋ ธํ ์ด์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋๋ฉด ํ๋๊ฐ ์ต์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋๋ก ํ๋ค.
- ํ๊ฒฝ๋ณ์ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ๋ฐ์ดํธ ๋ถ๊ฐ๋ฅํ๋ค.
๋ณผ๋ฅจ ์คํ์์ ์ปจํ ์ด๋ ์์ค์ ๋ฉํ๋ฐ์ดํฐ ์ฐธ์กฐ
๋จ ์ปจํ ์ด๋์ ์์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ๋ ํด๋น ์ปจํ ์ด๋์ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ค.
spec:
volumes:
- name: downward
downwardAPI:
items:
- path: "containerCpuRequestMilliCores"
resourceFieldRef:
containerName: main # ์ปจํ
์ด๋ ์ด๋ฆ ์ง์
resource: requests.cpu
divisor: 1m
๐ฎ DownwardAPI ๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์๋ ๋ฉํ๋ฐ์ดํฐ๋ ํ์ ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ํด์๋ ์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ํตํด ๊ฐ์ ธ์์ผ ํ๋ค. |
8.2 ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ ํต์ ํ๊ธฐ
DownwardAPI๋ ํ๋ ์์ฒด์ ๋ฉํ๋ฐ์ดํฐ์ ์ผ๋ถ ๋ฐ์ดํฐ๋ง์ ๋ ธ์ถํ๋ค.
ํด๋ฌ์คํฐ์ ์ ์๋ ๋ค๋ฅธ ํ๋๋ ๋ฆฌ์์ค์ ๊ดํ ์ ๋ณด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฟ ๋ฒ๋คํฐ์คAPI๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
8.2.1 ์ฟ ๋ฒ๋คํฐ์ค REST API ์ดํด๋ณด๊ธฐ
๋ก์ปฌ์์ ์๋ฒ์ REST ์๋ํฌ์ธํธ๋ฅผ ํตํด API ์๋ฒ์ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณธ๋ค.
root@master001:~/k8s_in_action/kubernetes-in-action/Chapter08# kubectl cluster-info
Kubernetes control plane is running at https://172.16.110.10:6443
KubeDNS is running at https://172.16.110.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
์ธ์ฆ ์ฒ๋ฆฌ ๋๋ฌธ์ ํด๋น url๋ก ์๋ฒ์ ํต์ ํ๋๊ฑธ ํ์ธํ ์ ์๋ค.
๊ทธ๋์ proxy๋ก localhost์์ HTTP ์ฐ๊ฒฐ์ ์์ ํ๋๋กํ๋ค.
root@master001:~/k8s_in_action/kubernetes-in-action/Chapter08# kubectl proxy &
[1] 3103944
root@master001:~/k8s_in_action/kubernetes-in-action/Chapter08# Starting to serve on 127.0.0.1:8001
์ด์ curl๋ก ๋ก์ปฌ ํฌํธ 8001๋ฒ์ผ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
root@master001:~/k8s_in_action/kubernetes-in-action/Chapter08# curl localhost:8001
{
"paths": [
"/.well-known/openid-configuration",
"/api",
"/api/v1",
"/apis",
"/apis/",
"/apis/admissionregistration.k8s.io",
"/apis/admissionregistration.k8s.io/v1",
"/apis/admissionregistration.k8s.io/v1beta1",
"/apis/apiextensions.k8s.io",
"/apis/apiextensions.k8s.io/v1",
"/apis/apiextensions.k8s.io/v1beta1",
"/apis/apiregistration.k8s.io",
"/apis/apiregistration.k8s.io/v1",
"/apis/apiregistration.k8s.io/v1beta1",
"/apis/apps",
"/apis/apps/v1",
proxy๋ก ์์ฒญ์ ๋ณด๋ด๊ณ -> proxy๊ฐ API ์๋ฒ๋ก ์์ฒญ -> proxy๋ API ์๋ฒ๊ฐ ๋ฐํํ๋ ๊ฒ์ ๋ฐํ
์์ ๋ฐํ ๊ฒฐ๊ณผ์์ ๋๋ถ๋ถ์ ๋ฆฌ์์ค ํ์ ์ ํ์ธ ๊ฐ๋ฅํ๋ค.
์ด๋ฌํ ๊ฒฝ๋ก๋ ํ๋, ์๋น์ค ๋ฑ๊ณผ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ๋ ๋ฆฌ์์ค ์ ์์ ์ง์ ํ API ๊ทธ๋ฃน๊ณผ ๋ฒ์ ์ ํด๋นํ๋ค.
๋ฐฐ์น API ๊ทธ๋ฃน์ REST ์๋ํฌ์ธํธ ์ดํด๋ณด๊ธฐ
Job ๋ฆฌ์์ค API๋ฅผ ์ดํด๋ณด๋๋ก ํ๋ค.
/apis/batch ๊ฒฝ๋ก ๋ค์๋ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๊ฐ ์กด์ฌ ํ๋ค.
root@master001:~/Chapter08# curl http://localhost:8001/apis/batch
{
"kind": "APIGroup",
"apiVersion": "v1",
"name": "batch",
"versions": [
{
"groupVersion": "batch/v1",
"version": "v1"
},
{
"groupVersion": "batch/v1beta1",
"version": "v1beta1"
}
],
"preferredVersion": {
"groupVersion": "batch/v1",
"version": "v1"
}
๋ฐํ๊ฐ์ ๋ณด๋ฉด ๋ฐฐ์น API ๊ทธ๋ฃน์๋ v1๊ณผ v1beta1 ๋ฒ์ ์ด ์กด์ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฟ ๋ฒ๋คํฐ์ค์์ ๊ถ์ฅํ๋ ๋ฒ์ ์ v1์์ ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด /apis/batch/v1 ๊ฒฝ๋ก์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด ๋ณธ๋ค.
root@master001:~/Chapter08# curl http://localhost:8001/apis/batch/v1
{
"kind": "APIResourceList", # batch/v1 API ๊ทธ๋ฃน ๋ด์ API ๋ฆฌ์์ค ๋ชฉ๋ก
"apiVersion": "v1",
"groupVersion": "batch/v1",
"resources": [ # ์ด ๊ทธ๋ฃน์ ๋ชจ๋ ๋ฆฌ์์ค ์ ํ์ ๋ด๋ ๋ฐฐ์ด
{
"name": "jobs",
"singularName": "",
"namespaced": true,
"kind": "Job", # job ๋ฆฌ์์ค
"verbs": [ # job ๋ฆฌ์์ค์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋ช
๋ น์ด(๋์ฌ)
"create",
"delete",
"deletecollection",
"get",
"list",
"patch",
"update",
"watch"
],
"categories": [
"all"
],
"storageVersionHash": "mudhfqk/qZY="
},
{
"name": "jobs/status", # ๋ฆฌ์์ค์ ์ํ๋ฅผ ์์ ํ๊ธฐ ์ํ ๋ณ๋์ REST ์๋ํฌ์ธํธ
"singularName": "",
"namespaced": true,
"kind": "Job",
"verbs": [ # ์ํ ์ ๋ณด๋ฅผ ๊ฒ์, ํจ์น, ์
๋ฐ์ดํธ ๊ฐ๋ฅ
"get",
"patch",
"update"
]
}
]
8.2.2 ํ๋ ๋ด API ์๋ฒ์์ ํต์
์ด๋ฒ์๋ kubectl์ด ์๋ ํ๋์ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ๊ฐ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณธ๋ค.
API ์๋ฒ์ ํต์ ํ๊ธฐ ์ํด์๋ ๋ค์ ์ธ ๊ฐ์ง๊ฐ ์ํ๋์ด์ผ ํ๋ค.
- API ์๋ฒ์ ์์น๋ฅผ ์ฐพ๋๋ค.
- ์ ํํ API ์๋ฒ์ ํต์ ํ๊ณ ์๋์ง ํ์ธ
- API ์๋ฒ๋ก ์ธ์ฆ
API ์๋ฒ์์ ํต์ ํ ํ๋ ์คํ
apiVersion: v1
kind: Pod
metadata:
name: curl
spec:
containers:
- name: main
image: tutum/curl
command: ["sleep", "9999999"]
๊ทธ๋ฆฌ๊ณ ํด๋น ์ปจํ ์ด๋์ bash ์๋ก ์ ์ํ๋ค.
root@master001:~/Chapter08# kubectl exec -it curl bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@curl:/#
ํด๋น pod์์ API ์๋ฒ์ ํต์ ํ๋ ๊ฒ์ ํ์ธํด ๋ณธ๋ค.
์ด๋ฅผ ์ํด์๋ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ IP์ ํฌํธ๋ฅผ ์ฐพ์์ผ ํ๋ค.
root@curl:/# env | grep KUBERNETES_SERVICE
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT_HTTPS=443
์์ ๋ณ์๋ค์ kubernetes ๋ผ๋ ์๋น์ค์์ ์ ๊ณต๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ปจํ ์ด๋์์ kubernetes๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
root@curl:/# curl https://kubernetes -k
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
"reason": "Forbidden",
"details": {
},
"code": 403
์๋ฒ์ ์์ด๋ดํฐํฐ ๊ฒ์ฆ
- Authorization HTTP ํค๋ ๋ด๋ถ์ ํ ํฐ์ ์ ๋ฌํ์ฌ ํ ํฐ์ ์ธ์ฆ๋ ๊ฒ์ผ๋ก ์ธ์ํ์ฌ ์ ์ ํ ์๋ต ๋ฐ๊ธฐ ๊ฐ๋ฅ
- ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ค์์คํ์ด์ค ๋ด์ ์๋ ๋ชจ๋ ํ๋ ์กฐํ ๊ฐ๋ฅ (curl ํ๋๊ฐ ์ด๋ค ๋ค์์คํ์ด์ค์์ ์คํ์ค์ธ์ง ์์์ผ ํจ)
# ์๋ฒ์ ์ธ์ฆ์๊ฐ CA๋ก ์๋ช
๋ ๊ฒ์ธ์ง ํ์ธํ๊ธฐ ์ํด CA ์ธ์ฆ์๋ฅผ ์ง์ ํด์ API ์๋ฒ์ ์ ์ํ๋ค.
root@curl:/# export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
root@curl:/# curl https://kubernetes
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
"reason": "Forbidden",
"details": {
},
"code": 403
API ์๋ฒ๋ก ์ธ์ฆ
์๋ฒ์์ ์ธ์ฆ์ ํต๊ณผํด์ผ ํด๋ฌ์คํฐ์ ๋ฐฐํฌ๋ API ์ค๋ธ์ ํธ๋ฅผ read, update, delete๋ฅผ ํ ์ ์๋ค.
์ด๋ ์ธ์ฆํ๊ธฐ ์ํด์๋ ์ธ์ฆ ํ ํฐ์ด ํ์ํ๋ค.
์ด ํ ๊ทผ์ default-token ์ํฌ๋ฆฟ์ผ๋ก ์ ๊ณต๋๋ค. ํด๋น ํ ์ดํฐ๋ฅผ TOKEN ํ๊ฒฝ๋ณ์์ ๋ก๋ํด์ API ์๋ฒ๋ก ์์ฒญ ๋ณด๋ผ๋ ์ฌ์ฉํ๋๋ก ํ๋ค.
root@curl:/# TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
์ด์ ํด๋น token์ ์ฌ์ฉํด์ API ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ๋์ง ๋ณธ๋ค.
root@curl:/# curl -H "Authorization: Bearer $TOKEN" https://kubernetes
{
"paths": [
"/.well-known/openid-configuration",
"/api",
"/api/v1",
"/apis",
"/apis/",
"/apis/admissionregistration.k8s.io",
"/apis/admissionregistration.k8s.io/v1",
"/apis/admissionregistration.k8s.io/v1beta1",
"/apis/apiextensions.k8s.io",
ํ๋๊ฐ ์ฟ ๋ฒ๋คํฐ์ค์ ํต์ ํ๋ ๋ฐฉ๋ฒ ์ ๋ฆฌ
Pod ๋ด์์ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฟ ๋ฒ๋คํฐ์ค API์ ์ ์ ํ ์ก์ธ์ค ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๋ค.
- ca.cert : ์ ํ๋ฆฌ์ผ์ด์ ์ API ์๋ฒ์ ์ธ์ฆ์๊ฐ ์ธ์ฆ ๊ธฐ๊ด์ผ๋ก๋ถํฐ ์๋ช ๋๊ฑด์ง ๊ฒ์ฆํด์ผ ํ๋๋ฐ, ca.crt ํ์ผ์ด ์ธ์ฆ ๊ธฐ๊ด์ ์ธ์ฆ์์ด๋ค.
- token : ์ ํ๋ฆฌ์ผ์ด์ ์ token ํ์ผ์ ๋ด์ฉ์ Authorization HTTP ํค๋์ Bearer ํ ํฐ์ผ๋ก ๋ฃ์ด ์ ์กํด์ ์์ ์ ์ธ์ฆํ๋ค.
- namespace : ํ๋์ ๋ค์์คํ์ด์ค ์์ ์๋ API ์ค๋ธ์ ํธ์ CRUD(create, read, update, delete) ์์ ์ ์ํํ ๋ ๋ค์์คํ์ด์ค๋ฅผ API ์๋ฒ๋ก ์ ๋ฌํ๋๋ฐ ์ฌ์ฉ
8.2.3 ์ฐ๋ฐฐ์๋ ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ API ์๋ฒ ํต์ ๊ฐ์ํ
์ง๊ธ๊น์ง ํ ๊ฒ์ฒ๋ผ HTTPS, ์ธ์ฆ์, ์ธ์ฆ ํ ํฐ์ ํ๋ํ๋ ๋ค๋ฃจ๋๊ฑด ๊น๋ค๋กญ๋ค.
๊ทธ๋์ pod ๋ด์์๋ proxy๋ฅผ ์ฌ์ฉํด์ API๋ก ์ง์ ์์ฒญ์ ๋ณด๋ด๋ ๋์ ํ๋ก์๋ก ์์ฒญ์ ๋ณด๋ด ์ธ์ฆ, ์ํธํ ๋ฑ์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ด๋ฅผ ์ฐ๋ฐฐ์๋ ํจํด์ด๋ผ๊ณ ํ๋ค.
์ฐ๋ฐฐ์๋ ์ปจํ ์ด๋ ํจํด
API์ ์ง์ ํต์ ํ๋ ๋์ ๋งค์ธ ์ปจํ ์ด๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ HTTP๋ก ์ฐ๋ฒ์๋์ ์ฐ๊ฒฐํ๊ณ , ์ฐ๋ฒ์๋ ํ๋ก์๊ฐ API ์๋ฒ์ ๋ํ https ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋ค.
์ฐ๋ฒ์๋ ์ปจํ ์ด๋ ์ฌ์ฉํ curl ํ๋ ์คํ
kubectl-proxy ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ambassador ์ปจํ ์ด๋๋ฅผ ํฌํจํ pod๋ฅผ ์คํ์ํจ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: curl-with-ambassador
spec:
containers:
- name: main
image: tutum/curl
command: ["sleep", "9999999"]
- name: ambassador
image: luksa/kubectl-proxy:1.6.2
curl-with-ambassador pod๋ฅผ ์์ฑํ ํ main ํ๋์ ๋ค์ด๊ฐ API ์๋ฒ์ ์ ์ํ๋ค.
์ด๋ curl์ ๋ ๋ฆฌ๋ฉด ambassador ์ปจํ ์ด๋์์ proxy ๋๋๋ก ํ๋ค.
kubectl proxy๋ ํฌํธ 8001์ ๋ฐ์ธ๋ฉ ๋์ด ์๋ค.
root@curl-with-ambassador:/# curl localhost:8001
{
"paths": [
"/.well-known/openid-configuration",
"/api",
"/api/v1",
"/apis",
"/apis/",โ
(์ฌ๊ธฐ์ curl์ ๋ ๋ฆฌ๋ฉด ๋ฐ๋ก ์์ ๊ฐ์ api path๊ฐ ๋์์ด์ผ ํ์ผ๋, serviceaccount๊ฐ ์์ฑ๋์ง ์์ 403 forbidden์ด ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค)
Kubernetes log, User “system:serviceaccount:default:default” cannot get services in the namespace
์ ๋ฌธ์์ ๋ฐ๋ผ default ServiceAccount์ Cluster-admin์ด๋ผ๋ role์ ๋ฐ์ธ๋ฉํ๊ณ ํด๊ฒฐํ๋ค.
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: fabric8-rbac
subjects:
- kind: ServiceAccount
# Reference to upper's `metadata.name`
name: default
# Reference to upper's `metadata.namespace`
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
๊ฒฐ๊ณผ์ ์ผ๋ก, curl๋ก ์ถ๋ ฅ๋ ๊ฒฐ๊ณผ๋ ์์ ํ ์คํธํ ๊ฒ๊ณผ ๊ฐ์ง๋ง ์ด๋ฒ์๋ token ์์ฑ๊ณผ ๊ฐ์ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์น ํ์๊ฐ ์์๋ค.
- ๊ณผ์
- main ์ปจํ ์ด๋์์ ์ผ๋ฐ HTTP ์์ฒญ์ ambassador ์ปจํ ์ด๋๋ก ์ ๋ฌ
- ambassador์ proxy๊ฐ HTTPS ์์ฒญ + ์ธ์ฆ ํ ํฐ + ์๋ฒ ์ธ์ฆ์๋ฅผ API ์๋ฒ๋ก ์ ๋ฌ
- ์ธ์ฆ ์ด๋ค์ง ํ main ์ปจํ ์ด๋๋ก ์์ฒญ๊ฐ ๋ฐํ
์ด๋ฌํ ambassador container์ ๋จ์ ์ ์ถ๊ฐ ํ๋ก์ธ์ค๊ฐ ๋์ํ์ฌ ๋ฆฌ์์ค๊ฐ ์๋น๋๋ค๋ ๊ฒ์ด๋ค.
8.2.4 ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉํ์ฌ API ์๋ฒ์ ํต์
๋จ์ํ API ์์ฒญ์ ๊ฒฝ์ฐ kubectl-proxy ambassador๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ง๋ง, ์ข ๋ ๋์ด๋ ์๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ์ฟ ๋ฒ๋คํฐ์ค API ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก
-> kubernetes.io/ko/docs/reference/using-api/client-libraries/
Swagger์ OpenAPI๋ฅผ ์ฌ์ฉํด ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ถ
์ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ํ ํด๋ผ์ด์ธํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ค์จ๊ฑฐ Swagger API ํ๋ ์์ํฌ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค. Swagger API๋ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ ํ์ฌ๋์ด ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋นํ์ฑํ ๋์ด ์๋ค.
'๐ฏ OpenSource > K8S' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[K8S] Service (NodePort / ClusterIP / LoadBalancer) (0) | 2022.11.14 |
---|---|
11. Secret (0) | 2021.05.09 |
10. ConfigMap (0) | 2021.05.08 |
09. Job์ผ๋ก ์๋ฃ ๊ฐ๋ฅํ ๋จ์ผ task ๊ตฌํํ๊ธฐ (0) | 2021.04.05 |
08. DaemonSet (0) | 2021.04.05 |