AccessingAPI

์šฐ๋ฆฌ๊ฐ€ k8s๋ฅผ ์„ค์น˜ํ• ๋•Œ kubectl์„ ์„ค์น˜ํ•˜์—ฌ cli๋ฅผ ํ†ตํ•ด ์ž์›์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ๋„ k8s api server์— ์ ‘๊ทผํ•˜์—ฌ ์กฐํšŒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ cluster ๋ฐ–์˜ ๊ด€๋ฆฌ์ž๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•˜๊ณ ์ž ํ• ๋•Œ๋Š” ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋งŒ https๋กœ ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ด€๋ฆฌ์ž๊ฐ€ kubectl๋ช…๋ น์–ด๋กœ proxy๋ฅผ ์—ด์–ด์ฃผ์—ˆ๋‹ค๋ฉด http๋กœ ์ธ์ฆ์„œ ์—†์ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ, kubectl์„ cluster๋‚ด๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ๋ฐ–์—์„œ๋„ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ Config๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ cluster์— ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„๋“ค์„ User Account๋ผ๊ณ  ํ•œ๋‹ค.

๋งŒ์ผ pod์—์„œ api server์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ณด์•ˆ์ƒ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— Service Account๋ฅผ ์ด์šฉํ•ด pod์—์„œ api server์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ์™ธ๋ถ€ pod์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

1. Authentication

1) X509 Client Certs

k8s ์„ค์น˜์‹œ์— kubeconfig๋ผ๋Š” ํ•ด๋‹น cluster์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  ์ธ์ฆ์„œ์™€ key๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ์™ธ๋ถ€์—์„œ client crt/key ๋ฅผ ํฌํ•จํ•˜์—ฌ https์š”์ฒญ์œผ๋กœ api server์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ kubectl ์„ค์น˜์‹œ์— ๋‚ด๋ถ€์ ์œผ๋กœ kubeconfig๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— kubectl์„ ํ†ตํ•ด api server๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  Proxy์˜ต์…˜์„ accept-hosts์ฃผ๋ฉด kubectl์ด ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋Š” http์š”์ฒญ์œผ๋กœ ์ธ์ฆ์„œ์—†์ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

kubectl config setting

  1. kubeadm / kubectl / kubelet ์„ค์น˜ yum install -y --disableexcludes=kubernetes kubeadm-1.15.5-0.x86_64 kubectl-1.15.5-0.x86_64 kubelet-1.15.5-0.x86_64

  2. admin.conf ์ธ์ฆ์„œ ๋ณต์‚ฌ

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. proxy ๋„์šฐ๊ธฐ nohup kubectl proxy --port=8001 --address=192.168.0.30 --accept-hosts='^*$' >/dev/null 2>&1 &

2) kubectl

์™ธ๋ถ€์— kubectl์„ ์„ค์น˜ํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ cluster์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ• ๋•Œ ํ•ด๋‹น kubectl๋‚ด์˜ ๊ฐ cluster์˜ kubeconfigํŒŒ์ผ์ด ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

kubeconfig์•ˆ์—๋Š” clusters, users, contexts๋“ฑ์˜ ์„ค์ •์ด ์กด์žฌํ•œ๋‹ค.

  • clusters : ํ•ด๋‹น ํ•ญ๋ชฉ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    • name : ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„

    • url : ์—ฐ๊ฒฐ์ •๋ณด ( ip )

    • ca : ์ธ์ฆ์„œ ํŒŒ์ผ

  • users : ํ•ด๋‹นํ•ญ๋ชฉ์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    • name : ์‚ฌ์šฉ์ž ์ด๋ฆ„

    • crt : ์‚ฌ์šฉ์ž ์ธ์ฆ์„œ ํŒŒ์ผ

    • key : ๊ฐœ์ธ ํ‚ค

  • contexts : ํด๋Ÿฌ์Šคํ„ฐ์™€ user ์—ฐ๊ฒฐ ์ •๋ณด

    • name : ์ปจํ…์ŠคํŠธ ์ด๋ฆ„

    • cluster : ์—ฐ๊ฒฐํ•  ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„

    • user : ์—ฐ๊ฒฐํ•  ์‚ฌ์šฉ์ž ์ด๋ฆ„

#kubeconfig
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1KVEUtLS0tLQo=
    server: https://192.168.0.30:6443
  name: cluster-a
- cluster:
    certificate-authority-data: LS0tLS1KVEUtLS0tLQo=
    server: https://192.168.0.50:6443
  name: cluster-b
contexts:
- context:
    cluster: cluster-a
    user: admin-a
  name: context-a
- context:
    cluster: cluster-b
    user: admin-b
  name: context-b
current-context: context-a
kind: Config
preferences: {}
users:
- name: admin-a
  user:
    client-certificate-data: LS0tLS1KVEUtLS0tLQo=
    client-key-data: LS0tLS1KVEUtLS0tLQo=
- name: admin-b
  user:
    client-certificate-data: LS0tLS1KVEUtLS0tLQo=
    client-key-data: LS0tLS1KVEUtLS0tLQo=
# ํŠน์ • context์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
kubectl config user-context context-A

# node ์ •๋ณด ์กฐํšŒ
kubectl get nodes

3) Service Account

namespace๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ํ•˜๋‚˜์˜ default๋ผ๋Š” ์ด๋ฆ„์˜ ServiceAccount๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ์ด ServiceAccount๋Š” ํ•˜๋‚˜์˜ Secret์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ๋‚ด์šฉ์œผ๋กœ๋Š” ์ธ์ฆ์„œ์™€ token๊ฐ’์ด ํฌํ•จ๋˜์–ด์žˆ๋‹ค.

ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ์ด ServiceAccount๊ฐ€ ์—ฐ๊ฒฐ์ด ๋˜๊ณ  Pod๋Š” ์ด token๊ฐ’์„ ํ†ตํ•ด์„œ api server์— ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํ•ด๋‹น token๊ฐ’ ๋งŒ ์•ˆ๋‹ค๋ฉด ์™ธ๋ถ€์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

#ServiceAccount ํ™•์ธ
kubectl describe -n nm-01 serviceaccounts
#Secret ํ™•์ธ
kubectl describe -n nm-01 secrets
#Pod ์ƒ์„ฑ
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: nm-01
  labels:
     app: pod
spec:
  containers:
  - name: container
    image: kubetm/app
EOF

Authorization

k8s๊ฐ€ ์ž์›์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. (RBAC, ABAC, Webhok, Node)

1) RBAC

k8s์—๋Š” Node, PV, Namespace์™€ ๊ฐ™์ด cluster ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ž์›๊ณผ Pod์™€ Service์™€ ๊ฐ™์ด namespace๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ž์›์ด ์กด์žฌํ•˜๊ณ  ServiceAccount, Role, RoleBinding๋„ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ServiceAccount์˜ Role๊ณผ RoleBinding์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ฐ™์€ namespace์˜ ์ž์›๋งŒ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ cluster์˜ ์ž์›์— ์ ‘๊ทผํ•˜๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. Role์€ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ๊ฐ Role์—๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, RoleBinding์€ Role์„ ์ง€์ •ํ•˜๋Š” ์ž์›์œผ๋กœ์จ Role์€ ํ•œ๊ฐœ๋งŒ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๊ณ  ServiceAccount๋Š” ์—ฌ๋Ÿฌ๊ฐœ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ServiceAccount์—์„œ cluster์ž์›์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ClusterRole๊ณผ clusterRoleBinding์ด ์ƒ์„ฑ๋˜์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ธฐ๋Šฅ์€ role๊ณผ rolebinding๊ณผ ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ RoleBinding์—์„œ clusterRoleBinding์ด ์•„๋‹Œ ClusterRole๋ฅผ ์ง์ ‘ ์ง€์ •์ด ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๊ฒฝ์šฐ์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ž์›์—๋Š” ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฐ™์€ namespace์˜ ์ž์›๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋Š” role์„ ๋งŒ๋“ค์–ด์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ๋ฐ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ชจ๋“  namespace๋งˆ๋‹ค ๋˜‘๊ฐ™์€ role์„ ๋ถ€์—ฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ƒํ™ฉ์—์„œ role์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ๋ชจ๋“  namespace๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•˜์ง€๋งŒ ์ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด clusterRole๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•œ๋‹ค.

2) Role, RoleBinding

Role๊ณผ RoleBinding์„ ํ†ตํ•ด ServiceAccount์™€ ์—ฐ๊ฒฐ์„ ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด ์™ธ๋ถ€์—์„œ Secret์˜ token๊ฐ’์„ ๊ฐ€์ง€๊ณ  API Server์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ํ•œ ํ† ํฐ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋‹จ์œ„์˜ ์ž์›์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ClusterRoler๊ณผ ClusterRoleBinding์„ ์ƒ์„ฑํ•˜์—ฌ ClusterRoleBinding์„ ServiceAccount์— ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ํ•œ namespace๋‚ด ์ž์› ์ ‘๊ทผ

#Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: r-01
  namespace: nm-01
rules:
- apiGroups: [""]
  verbs: ["get", "list"]
  resources: ["pods"]

#RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rb-01
  namespace: nm-01
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: r-01
subjects:
- kind: ServiceAccount
  name: default
  namespace: nm-01

#Service
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    app: pod
  ports:
  - port: 8080
    targetPort: 8080

ํ•œ cluster๋‚ด ์—ฌ๋Ÿฌ namespace ์ž์› ์ ‘๊ทผ

#namespace
apiVersion: v1
kind: Namespace
metadata:
  name: nm-02

#ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa-02
  namespace: nm-02

#ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cr-02
rules:
- apiGroups: ["*"]
  verbs: ["*"]
  resources: ["*"]

#ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: rb-02
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cr-02
subjects:
- kind: ServiceAccount
  name: sa-02
  namespace: nm-02

Reference

์ธํ”„๋Ÿฐ-๊น€ํƒœ๋ฏผ๋‹˜ ๊ฐ•์˜

Last updated