Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Authenticating with Bootstrap Tokens

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.18 [stable]

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์€ ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ƒˆ ๋…ธ๋“œ๋ฅผ ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ์— ๊ฒฐํ•ฉํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์ „๋‹ฌ์ž ํ† ํฐ์ด๋‹ค. kubeadm์„ ์ง€์›ํ•˜๋„๋ก ๊ตฌ์ถ•๋˜์—ˆ์ง€๋งŒ kubeadm ์—†์ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ RBAC ์ •์ฑ…์„ ํ†ตํ•ด Kubelet TLS ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํ•‘ ์‹œ์Šคํ…œ๊ณผ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌ์ถ•๋˜์—ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ๊ฐœ์š”

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์€ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํŠน์ • ์œ ํ˜•(bootstrap.kubernetes.io/token)์˜ ์‹œํฌ๋ฆฟ(Secret)์œผ๋กœ ์ •์˜๋œ๋‹ค. API ์„œ๋ฒ„์˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ธ์ฆ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์‹œํฌ๋ฆฟ์„ ์ฝ๋Š”๋‹ค. ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๊ฐ€ TokenCleaner ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ œ๊ฑฐํ•œ๋‹ค. ํ† ํฐ์€ BootstrapSigner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด "discovery" ํ”„๋กœ์„ธ์Šค์— ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ์ปจํ”ผ๊ทธ๋งต(ConfigMap)์— ๋Œ€ํ•œ ์„œ๋ช…์„ ๋งŒ๋“œ๋Š” ๋ฐ๋„ ์‚ฌ์šฉ๋œ๋‹ค.

ํ† ํฐ ํ˜•์‹

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์€ abcdef.0123456789abcdef ํ˜•์‹์„ ์ทจํ•œ๋‹ค. ๋” ๊ณต์‹์ ์œผ๋กœ๋Š” ์ •๊ทœ์‹ [a-z0-9]{6}\.[a-z0-9]{16} ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

ํ† ํฐ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ "Token ID" ์ด๋ฉฐ ๊ณต๊ฐœ ์ •๋ณด๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์ธ์ฆ์— ์‚ฌ์šฉํ•˜๋Š” ์‹œํฌ๋ฆฟ์˜ ์ผ๋ถ€๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํ† ํฐ์„ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ "Token Secret"์ด๋ฉฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹น์‚ฌ์ž์™€๋งŒ ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ์ธ์ฆ ํ™œ์„ฑํ™”

API ์„œ๋ฒ„์—์„œ ๋‹ค์Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ์ธ์ฆ์ž๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

--enable-bootstrap-token-auth

ํ™œ์„ฑํ™”๋˜๋ฉด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์„ API ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ „๋‹ฌ์ž ํ† ํฐ ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Authorization: Bearer 07401b.f395accd246ae52d

ํ† ํฐ์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„ system:bootstrap:<token id> ๋กœ ์ธ์ฆ๋˜๋ฉฐ system:bootstrappers ๊ทธ๋ฃน์˜ ๊ตฌ์„ฑ์›์ด๋‹ค. ํ† ํฐ์˜ ์‹œํฌ๋ฆฟ์— ์ถ”๊ฐ€ ๊ทธ๋ฃน์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž์—์„œ tokencleaner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

--controllers=*,tokencleaner

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ์‹œํฌ๋ฆฟ ํ˜•์‹

๊ฐ๊ฐ์˜ ์œ ํšจํ•œ ํ† ํฐ์€ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์‹œํฌ๋ฆฟ์— ์˜ํ•ด ์ง€์›๋œ๋‹ค. ์ „์ฒด ๋””์ž์ธ ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์‹œํฌ๋ฆฟ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
kind: Secret
metadata:
  # Name MUST be of form "bootstrap-token-<token id>"
  name: bootstrap-token-07401b
  namespace: kube-system

# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
  # Human readable description. Optional.
  description: "The default bootstrap token generated by 'kubeadm init'."

  # Token ID and secret. Required.
  token-id: 07401b
  token-secret: f395accd246ae52d

  # Expiration. Optional.
  expiration: 2017-03-10T03:22:11Z

  # Allowed usages.
  usage-bootstrap-authentication: "true"
  usage-bootstrap-signing: "true"

  # Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
  auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress

์‹œํฌ๋ฆฟ ์œ ํ˜•์€ bootstrap.kubernetes.io/token ์ด์–ด์•ผ ํ•˜๊ณ  ์ด๋ฆ„์€ bootstrap-token-<token id>์—ฌ์•ผ ํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋„ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

usage-bootstrap-* ๋ฉค๋ฒ„๋Š” ์ด ์‹œํฌ๋ฆฟ์˜ ์šฉ๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๊ฐ’์„ true ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

  • usage-bootstrap-authentication ์€ ํ† ํฐ์„ API ์„œ๋ฒ„์— ๋ฒ ์–ด๋Ÿฌ ํ† ํฐ์œผ๋กœ ์ธ์ฆํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • usage-bootstrap-signing ์€ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์— ์„ค๋ช…๋œ cluster-info ์ปจํ”ผ๊ทธ๋งต์— ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

expiration ํ•„๋“œ๋Š” ํ† ํฐ์˜ ๋งŒ๋ฃŒ๋ฅผ ์ œ์–ดํ•œ๋‹ค. ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ์ธ์ฆ์— ์‚ฌ์šฉ๋  ๋•Œ ๊ฑฐ๋ถ€๋˜๊ณ  ์ปจํ”ผ๊ทธ๋งต์„œ๋ช… ์ค‘์— ๋ฌด์‹œ๋œ๋‹ค. ๋งŒ๋ฃŒ๋œ ๊ฐ’์€ RFC3339๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ˆ๋Œ€ UTC ์‹œ๊ฐ„์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ๋‹ค. ๋งŒ๋ฃŒ๋œ ํ† ํฐ์„ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด tokencleaner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

kubeadm์„ ์‚ฌ์šฉํ•œ ํ† ํฐ ๊ด€๋ฆฌ

kubeadm ํˆด์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์ค‘์ธ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubeadm token docs ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์ปจํ”ผ๊ทธ๋งต ์„œ๋ช…

ํ† ํฐ์€ ์ธ์ฆ ์™ธ์—๋„ ์ปจํ”ผ๊ทธ๋งต์— ์„œ๋ช…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์„œ๋ฒ„๋ฅผ ์‹ ๋ขฐํ•˜๊ธฐ ์ „์— ํด๋Ÿฌ์Šคํ„ฐ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ”„๋กœ์„ธ์Šค์˜ ์ดˆ๊ธฐ์— ์‚ฌ์šฉ๋œ๋‹ค. ์„œ๋ช…๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๊ณต์œ  ํ† ํฐ์œผ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž์—์„œ bootstrapsigner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ปจํ”ผ๊ทธ๋งต์„œ๋ช…์„ ํ™œ์„ฑํ™” ํ•œ๋‹ค.

--controllers=*,bootstrapsigner

์„œ๋ช…๋œ ์ปจํ”ผ๊ทธ๋งต์€ kube-public ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” cluster-info ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š๊ณ  TLS ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๋™์•ˆ ์ปจํ”ผ๊ทธ๋งต์„ ์ฝ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํ”ผ๊ทธ๋งต์— ํฌํ•จ๋œ ์„œ๋ช…์„ ํ™•์ธํ•˜์—ฌ ์ปจํ”ผ๊ทธ๋งต์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค.

์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ๋‹ค.

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-info
  namespace: kube-public
data:
  jws-kubeconfig-07401b: eyJhbGciOiJIUzI1NiIsImtpZCI6IjA3NDAxYiJ9..tYEfbo6zDNo40MQE07aZcQX2m3EB2rO3NuXtxVMYm9U
  kubeconfig: |
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: <really long certificate data>
        server: https://10.138.0.2:6443
      name: ""
    contexts: []
    current-context: ""
    kind: Config
    preferences: {}
    users: []    

์ปจํ”ผ๊ทธ๋งต์˜ kubeconfig ๋ฉค๋ฒ„๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด๋งŒ ์ž…๋ ฅ๋œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ „๋‹ฌ๋˜๋Š” ํ•ต์‹ฌ์€ certificate-authority-data ์ด๋‹ค.
์ด๋Š” ํ–ฅํ›„ ํ™•๋Œ€๋  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋ช…์€ "detached" ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” JWS ์„œ๋ช…์ด๋‹ค. ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๋Š” JWS ๊ทœ์น™(๋’ค๋กœ ์˜ค๋Š” = ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋™์•ˆ ์ธ์ฝ”๋”ฉ๋œ base64)์— ๋”ฐ๋ผ kubeconfig ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์  ์‚ฌ์ด์— ์‚ฝ์ž…ํ•˜์—ฌ ์ „์ฒด JWS๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ „์ฒด ํ† ํฐ(์˜ˆ:07401b.f395accd246ae52d)์„ ๊ณต์œ  ์‹œํฌ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ HS256 ๋ฐฉ์‹(HMAC-SHA256)์„ ์‚ฌ์šฉํ•จ์œผ๋กœ JWS๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ฐ˜๋“œ์‹œ HS256์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ kubeadm implementation details ์„น์…˜์„ ์ฐธ์กฐํ•˜๋ฉด ๋œ๋‹ค.

์ตœ์ข… ์ˆ˜์ • August 10, 2022 at 4:33 PM PST: [ko] Update links in dev-1.24-ko.3 (9fe9e1b827)