Contents

K8s Secret

kube apiserver ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ดˆ ๋ฐฉ์–ด์„ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘์†ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด 2๊ฐ€์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ํ•ด์•ผํ•œ๋‹ค. ๋ˆ„๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ์ ‘๊ทผํ•ด์„œ๋Š” ๋ฌด์–ผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€

๊ธฐ๋ณธ์ ์œผ๋กœ ํฌ๋“œ๋“ค ์‚ฌ์ด์—์„  ์„œ๋กœ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. network policy๋ฅผ ์„ธ์›Œ๋‘๋ฉด, ํฌ๋“œ๋“ค ๊ฐ„์— ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ƒ์„œํ•  ์ˆ˜ ์žˆ๋‹ค.

Authentication

kubernetes๋Š” kube apiserver๋ฅผ ์ด์šฉํ•ด์„œ service account ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ service account ๋Š” ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค, ๋ด‡, ์„œ๋“œํŒŒํ‹ฐ ๋ชจ๋“ˆ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. kubectl create serveraccount [service account name]

์œ ์ €๋“ค์˜ ๋Œ€ํ•œ ๊ด€๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒํ•˜๋Š”๊ฐ€? ์—ฌ๊ธฐ์„œ ์œ ์ €๋ผํ•จ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ฆฌ์ž, ๋˜๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์œ ์ €๋“ค์€ kube apiserver ๋ฅผ ํ†ตํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ํŠน์ • ์œ ์ €๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ฒซ๋ฒˆ์žฌ๋กœ ์œ ์ €๋ฅผ ์ธ์ฆํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์–ด๋–ป๊ฒŒ ์œ ์ €๋ฅผ ์ธ์ฆํ•˜๋Š”์ง€?

  1. static password file
  2. static token file
  3. certificates
  4. ldap ๊ฐ™์€ ํƒ€์‚ฌ ์ธ์ฆ ํ”„๋กœ์„ธ์Šค

์ฒซ๋ฒˆ์žฌ๋กœ static password file์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„ , kubeapi server๋ฅผ ์„ค์น˜ํ•  ๋•Œ basic-auth-file ์˜ต์…˜์„ ๋„˜๊ฒจ์ค€๋‹ค. ์ด๋•Œ basic-auth-file์˜ ๊ฐ’์€ csvํŒŒ์ผ์ธ๋ฐ, ํŒจ์Šค์›Œ๋“œ, id, ์œ ์ €id ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์œ„ ์˜ต์…˜์„ ์ง€์ •ํ•˜๊ณ  kubeapi server๋ฅผ ์„ค์น˜ ๋˜๋Š” ์žฌ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด kubeapi server๋กœ ์œ ์ €๋ฅผ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

curl -v -k https://master-node-ip:6443/api/v1/pods -u “user1:12341234”

๋‘ ๋ฒˆ์งธ๋กœ static token file ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  token-auth-file ์„ ์˜ต์…˜์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋˜๊ณ , ํ•ด๋‹น ๊ฐ’์—๋Š” ํ† ํฐ, ์•„์ด๋””, ์œ ์ € id ๋กœ ๊ตฌ์„ฑ๋œ csv ํŒŒ์ผ์„ ๋„˜๊ฒจ์ค€ ํ›„ kubeapi server ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค.

curl -v -k https://master-node-ip:6443/api/v1/pods -h “Authorization: Bearer [token]”

์œ„ ๋ฐฉ๋ฒ•์€ ์ถ”์ฒœ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.19 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” deprecated ๋˜์—ˆ๋‹ค.

TLS certificates

kube api server๋กœ ์ ‘๊ทผํ•˜๋Š” client๋กœ๋Š” cluster๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” admin์ด ๋  ์ˆ˜ ์žˆ๊ณ , ํฌ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•  ์ง€ ๊ฒฐ์ •ํ•˜๋Š” scheduler ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ , controller manager, kube proxy ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ tls ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  kube api server์— ์ž์ฒด์ ์ธ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  client ๋„ ๊ฐ๊ฐ ์ž์‹ ์˜ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

kubeapi server๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์€ etcd server ๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ, ์ด ๋•Œ๋Š” kube api server๊ฐ€ etcd server ์˜ client ๊ฐ€ ๋˜์–ด์•ผํ•˜๊ณ  ์ด๋•Œ tls ํ†ต์‹ ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, etcd server / kubeapi server ๋ชจ๋‘ ์ž์‹ ์˜ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ถ”๊ฐ€๋กœ ์ธ์ฆ์„œ๋ฅผ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๊ด€์ธ ca ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ca๋„ ์ž์‹ ์˜ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋กœ๋Š” easyrsa / openssl / cfssl ๋“ฑ์ด ์žˆ๋‹ค.

  1. generate key openssl genrsa -out admin.key 2048

    • openssl genrsa: RSA ๊ฐœ์ธํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด์•ผ.
    • out admin.key: ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ admin.key๋ผ๋Š” ํŒŒ์ผ์— ์ €์žฅํ•˜๋ผ๋Š” ์˜๋ฏธ์•ผ.
    • 2048: ํ‚ค์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” 2048๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด. ๋ณด์•ˆ ์ˆ˜์ค€์„ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์ง€.
  2. certificate signing request openssl req -new -key admin.key -subj “/CN=kube-admin” -out admin.csr

    -openssl req: ์ธ์ฆ์„œ ์š”์ฒญ์ด๋‚˜ ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ(self-signed certificate) ์ƒ์„ฑ์„ ์œ„ํ•œ ๋ช…๋ น์–ด์•ผ. -new: ์ƒˆ๋กœ์šด CSR์„ ์ƒ์„ฑํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์•ผ. -key admin.key: CSR ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉํ•  ๊ฐœ์ธํ‚ค ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋Š” ๊ฑฐ์•ผ. ์—ฌ๊ธฐ์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ admin.key๋ฅผ ์‚ฌ์šฉํ•ด. -subj “/CN=kube-admin”: CSR์— ํฌํ•จ๋  ์ฃผ์ฒด(subject)์˜ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๋Š” ์˜ต์…˜์ด์•ผ. ์—ฌ๊ธฐ์„œ CN(Common Name)์€ kube-admin์œผ๋กœ ์„ค์ •๋์–ด. -out admin.csr: ์ƒ์„ฑ๋œ CSR์„ admin.csr์ด๋ผ๋Š” ํŒŒ์ผ์— ์ €์žฅํ•˜๋ผ๋Š” ์˜๋ฏธ์•ผ.

  3. openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -out admin.crt -openssl x509: X.509 ์ธ์ฆ์„œ ํ˜•์‹์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด์•ผ. ์—ฌ๊ธฐ์„œ๋Š” ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ผ. -req: CSR(admin.csr)์„ ์‚ฌ์šฉํ•ด ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ๋‹ค๋Š” ์˜ต์…˜์ด์•ผ. -in admin.csr: ์ž…๋ ฅ ํŒŒ์ผ๋กœ admin.csr์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์•ผ. -CA ca.crt: CA(Certificate Authority)์˜ ์ธ์ฆ์„œ ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋Š” ๊ฑฐ์•ผ. ์ฆ‰, ์ด CA ์ธ์ฆ์„œ๋กœ ์„œ๋ช…์„ ํ•˜๊ฒ ๋‹ค๋Š” ๊ฑฐ์ง€. -CAkey ca.key: ์„œ๋ช…์„ ์œ„ํ•ด ์‚ฌ์šฉ๋  CA์˜ ๊ฐœ์ธํ‚ค ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด์•ผ. -out admin.crt: ์ƒ์„ฑ๋œ ์ธ์ฆ์„œ๋ฅผ admin.crt๋ผ๋Š” ํŒŒ์ผ์— ์ €์žฅํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์•ผ.

์œ„ ๋ช…๋ น์–ด๋Š” admin ์œ ์ €์— ๋Œ€ํ•œ ์ธ์ฆ์„ ์œ„ํ•ด ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์ด ๋•Œ admin ์œ ์ €๊ฐ€ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์ธ์ฆํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์–ด๋–ป๊ฒŒ ์ด ์œ ์ €๊ฐ€ admin ์œ ์ €์ธ์ง€ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์šฐํ•ด์„  csr์„ ์ƒ์„ฑํ•  ๋•Œ , “/CN=kube-admin/O=system:master” ์™€ ๊ฐ™์ด master๋ผ๋Š” ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ด์„œ ์„œ๋ช… ์ƒ์„ฑ ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•˜๋ฉด ๋œ๋‹ค.

certificate detail ํ™•์ธํ•˜๊ธฐ

์œ„ configuration ์„ ๋ณด๋ฉด, etcd/ kublet ์„œ๋ฒ„์™€ tls ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฆ์„œ ๋น„๋ฐ€ํ‚ค๊ฐ€ ์ €์žฅ๋œ ๊ณต๊ฐ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์„œ๊ฐ€ ์ด ca์— ์˜ํ•ด ์ธ์ฆ๋œ ์ธ์ฆ์„œ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์˜ ์ธ์ฆ์„œ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€๋กœ, kubeapi server ๊ฐ€ tls ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„์ธก ์ธ์ฆ์„œ/๋น„๋ฐ€ํ‚ค์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด ๋งŒ๋ฃŒ์ผ/ issuer / ๋ณ„์นญ /Common Name ๋“ฑ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

certificate api

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํ•œ๋ช…์ผ ๋•Œ ํ•ด๋‹น ๊ด€๋ฆฌ์ž๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋•Œ ์ƒˆ๋กœ์šด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ ํ•ด๋‹น ๊ด€๋ฆฌ์ž๋Š” ๊ฐœ์ธ์˜ ๋น„๋ฐ€ํ‚ค์™€ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ธ์ฆ์„œ์— ๋Œ€ํ•œ ์„œ๋ช…์š”์ฒญ(csr)์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ธ์ฆ์„œ๋ฅผ ๋ณด๋‚ด๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ca ์„œ๋ฒ„์—์„œ ์ธ์ฆ์„ ๋ฐ›์€ ํ›„ ์ƒˆ๋กœ์šด ๊ด€๋ฆฌ์ž์—๊ฒŒ ca์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์ธ์ฆ๋ฐ›์€ ์ธ์ฆ์„œ๋ฅผ ๊ฑด๋‚ด์ฃผ๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กœ์šด ๊ด€๋ฆฌ์ž๋„ ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

์ธ์ฆ์„œ์—๋Š” ์œ ํšจ๊ธฐ๊ฐ„์ด ์กด์žฌํ•œ๋‹ค. ์œ ํšจ๊ธฐ๊ฐ„์ด ๋๋‚˜๊ฒŒ ๋˜๋ฉด, ์ƒˆ๋กœ์šด ๊ด€๋ฆฌ์ž๋Š” ์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œํ•œ๋ฒˆ ๊ฑฐ์ณ์„œ ca์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์ธ์ฆ๋ฐ›์€ ์ธ์ฆ์„œ๋ฅผ ๋ฐ›์•„์•ผ ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿผ ca๋Š” ์–ด๋””์— ์กด์žฌํ•˜๋Š”๊ฐ€? ca๋Š” ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค์˜ ์Œ์ด๋‹ค. ๋ณดํ†ต์€ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์œ„์น˜ํ•œ๋‹ค.

์œ„ ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณตํ•  ์ˆœ ์—†์œผ๋ฏ€๋กœ, certification api๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ธ์ฆ์„œ๋ฅผ ca์„œ๋ฒ„๊ฐ€ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  1. singing certificate request object ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. review request
  3. approve request
  4. share certs to users

์ฒ˜์Œ์— ์œ ์ €๋Š” key๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. openssl genrsa -out jane.key 2048

๊ทธ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ฆฌ์ž์—๊ฒŒ request ๋ฅผ ๋ณด๋‚ธ๋‹ค. openssl req -new -key jane.key -subj="/CN=jane" -out jane.csr

๊ด€๋ฆฌ์ž๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด์— signingCertificateRequest Object๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (yaml ํŒŒ์ผ๋กœ) ์—ฌ๊ธฐ์— request ํ•„๋“œ์—๋Š” jane.csr ์„ base64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ง‘์–ด๋„ฃ๋Š”๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” csr object ๊ฐ€ ์ƒ์„ฑ์ด๋˜๊ณ , ๊ธฐ์กด ๊ด€๋ฆฌ์ž๋Š” ํ•ด๋‹น csr ์„ ๋‹ค์Œ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์Šน์ธํ•ด์ค€๋‹ค. kubectl certificate approve jane

์œ„์™€ ๊ฐ™์€ ์ธ์ฆ์„œ ๊ด€๋ จ ์ž‘์—…์€ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์˜ controller manager ์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค. ์ธ์ฆ์„œ์— ์ธ์ฆ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฃจํŠธ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ, controller manager ์„œ๋ฒ„๋ฅผ ๊นŒ๋ณด๋ฉด –cluster-signing-cert-file / cluster-signing-key-file ์˜ต์…˜์ด ๋“ค์–ด์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

kube config

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ฆฌ์ž๊ฐ€ ์—ฌ๋Ÿฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์™€์˜ ์—ฐ๊ฒฐ ์ธ์ฆ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก kubeconfig๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ kubectl๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ –kubeconfig ์˜ต์…˜์ด ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ์— ์ •์˜๋˜์–ด ์žˆ๋Š” kubeconfig ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์ธ์ฆ์„œ ์ •๋ณด ๋“ฑ๋“ฑ์„ ๊ฐ€์ ธ์™€ ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

kubeconfig ์—๋Š” 3๊ฐœ์˜ ์„น์…˜์ด ์กด์žฌํ•˜๋Š”๋ฐ, cluster/ context/ user ์„น์…˜์ด ์กด์žฌํ•œ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์„น์…˜์—๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ•˜ ์กด์žฌํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ •์˜์ด๊ณ , ์œ ์ € ์„น์…˜์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘์†ํ•˜๋Š” ์œ ์ €์˜ config๋ฅผ ์ •์˜ํ•œ ๊ณต๊ฐ„์ด๋‹ค. context ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์™€ ์œ ์ €๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ์™€ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์˜ค๊ฐ€๋ฉด ์ž‘์—…ํ•  ๋•Œ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

์ถ”๊ฐ€๋กœ namespace ๊ฐ™์€ ์˜ต์…˜๋„ kubeconfig ์— ์ •์˜ํ•˜์—ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

api groups

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ฆฌ์ž๋Š” api ๋ฅผ ํ†ตํ•ด kube apiserver์™€ ํ†ต์‹ ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด๋ถ€ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” rest api ์ด๋‹ค.

curl https://kube-master:6443/version curl https://kube-master:6443/api/v1/pods

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํŠน์ • ๋ชฉ์ ์— ๋งž๊ฒŒ version, api, metrics, healthz, logs .. ์™€ ๊ฐ™์ด api๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด๋†“๋Š”๋‹ค.

kube apiserver๋กœ api๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ kubectl proxy ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด proxy ์„œ๋ฒ„๊ฐ€ kubeapi server์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํžˆ ์ธ์ฆ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. kube proxy ์—†์ด kube apiserver๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„ , certification / key ํŒŒ์ผ์„ ๊ฑด๋„ค์•ผ ํ•œ๋‹ค.

kube proxy != kubectl proxy

authorization

  • node authorizer kubelet์€ kube apiserver์— ์ ‘๊ทผํ•ด์„œ, pods/nodes/services/endpoints ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ๋˜ pods/node์˜ ์ƒํƒœ๋ฅผ ์“ฐ๊ฑฐ๋‚˜, ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ์“ฐ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ node authorizer ์ด๋‹ค.

  • ABAC (attribute based Access Control) ๊ฐœ๋ฐœ์ž1 ์ด pod์— ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์— ๋Œ€ํ•ด json ํฌ๋งท์œผ๋กœ ์ •์˜ ๊ฐœ๋ฐœ์ž2๊ฐ€ pod์— ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์— ๋Œ€ํ•ด json ํฌ๋งท์œผ๋กœ ์ •์˜ … ์œ„์™€ ๊ฐ™์ด ํŠน์ • ์œ ์ €๊ฐ€ ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์— ๋Œ€ํ•ด json ํฌ๋งท์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ๋˜๋ฏ€๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ํž˜๋“ฌ

  • RBAC role based access control์€ ํŠน์ • ๊ทธ๋ฃน๊ตฐ์— ํŠน์ • ํ–‰๋™์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

  • webhook ์œ„ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด์—์„œ ๊ถŒํ•œ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์™ธ๋ถ€์—์„œ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•˜๊ณ  ์™ธ๋ถ€์—์„œ ์ด๋ฅผ ์Šน์ธํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์›นํ›…์„ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ์ธ์ฆ๋ฐฉ๋ฒ• ๋ชจ๋“œ๋Š” kubeapi server๋ฅผ ์„ค์น˜ํ•  ๋•Œ authorization-mode ์˜ต์…˜์„ ํ†ตํ•ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋”ฐ. ์ด ๋ชจ๋“œ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ ์šฉํ•œ ์ˆœ์„œ๋Œ€๋กœ chaining ๋˜์–ด ๊ถŒํ•œ์„ ์Šน์ธํ• ์ง€ ๊ฑฐ๋ถ€ํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค ๋งŒ์•ฝ node, rbac, webhook ์˜ ์ˆœ์„œ๋กœ ๋˜์–ด ์žˆ์—ˆ๋‹ค๋ฉด, node๋ฅผ ๋จผ์ € ๊ฑฐ์น˜๊ณ  ๊ฑฐ๋ถ€๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋‹ค์Œ rbac์—์„œ ๊ถŒํ•œ์„ ๋ถ€์—ฌ ๋ฐ›๊ณ  ๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ ์Šน์ธ์ด ๋œ๋‹ค๋ฉด ํ•ด๋‹น ์œ ์ €๋Š” ํŠน์ • ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›๊ฒŒ ๋œ๋‹ค.

rbac ๋ชจ๋“œ๋กœ ๊ถŒํ•œ์„ ์Šน์ธํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉด ๋œ๋‹ค.

  1. role ๊ฐ์ฒด ์ƒ์„ฑ
  2. role binding ๊ฐ์ฒด ์ƒ์„ฑ

ํŠน์ • ์œ ์ €๊ฐ€ ํŠน์ • ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. kubectl auth can-i create deployments kubectl auth can-i create pods –as dev-user –namespace test

cluster role

service account

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—๋Š” 2๊ฐ€์ง€์˜ account๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ user account /service account ์ด๋‹ค. user account ๋Š” ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๊ณ , service account ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•œ๋‹ค. user account์—๋Š” admin / developer ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  service account๋Š” prometheus, jenkins ๊ฐ™์€ ๊ฒƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

service account ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด kubectl create serviceaccount [service account name] service account ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ํ† ํฐ์ด ์ƒ์„ฑ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์ด kube apiservier๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์„œ ์ธ์ฆ์„ํ•˜๊ฒŒ ๋œ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋งˆ๋‹ค default service account ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํฌ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋งˆ๋‹ค default service account ๊ณผ ํ† ํฐ์ด ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋กœ ์ž๋™์œผ๋กœ ๋งˆ์šดํŠธ๋œ๋‹ค.

ํ† ํฐ์€ pod ๋‚ด์— /var/run/secrets/kubernetes.io/serviceaccount ์— ์ƒ์„ฑ๋œ๋‹ค. ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊นŒ๋ณด๋ฉด, ca.crt namespace token ์ด ์กด์žฌํ•˜๊ณ  token์„ ์ด์šฉํ•ด์„œ kube apiserver ์™€ ์ธ์ฆ์„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ฏธ ์ƒ์„ฑ๋œ pod์˜ service account๋ฅผ ์ƒˆ๋กœ ๋“ฑ๋กํ•˜๋ ค๋ฉด pod๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žฌ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ deployment์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด service account๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ์ƒˆ๋กœ์šด rollout์ด ๋ฐœ์ƒํ•˜๊ณ  ํ•ด๋‹น rollout์— ์ƒˆ๋กญ๊ฒŒ ๋“ฑ๋ก๋œ service account ๊ฐ€ ๋“ฑ๋ก๋œ์ฑ„๋กœ ๋ฐฐํฌ๋œ๋‹ค. (1.24 ๋ฒ„์ „ ๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ token์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ)

์ด์ œ๋Š” tokenrequest api๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

secure image