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
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
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
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