AccessingAPI

accessing

μš°λ¦¬κ°€ 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

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

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

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