1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| # kubectl describe pods -n kube-system kube-apiserver-controlplane
Command:
kube-apiserver
--advertise-address=192.8.216.9
--allow-privileged=true
--authorization-mode=Node,RBAC
--client-ca-file=/etc/kubernetes/pki/ca.crt
--enable-admission-plugins=NodeRestriction
--enable-bootstrap-token-auth=true
--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
--etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
--etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
--etcd-servers=https://127.0.0.1:2379
--kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
--kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
--proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
--proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
--requestheader-allowed-names=front-proxy-client
--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
--requestheader-extra-headers-prefix=X-Remote-Extra-
--requestheader-group-headers=X-Remote-Group
--requestheader-username-headers=X-Remote-User
--secure-port=6443
--service-account-issuer=https://kubernetes.default.svc.cluster.local
--service-account-key-file=/etc/kubernetes/pki/sa.pub
--service-account-signing-key-file=/etc/kubernetes/pki/sa.key
--service-cluster-ip-range=10.96.0.0/12
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key
#kubectl describe pods -n kube-system etcd-controlplane
Command:
etcd
--advertise-client-urls=https://192.8.216.9:2379
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--client-cert-auth=true
--data-dir=/var/lib/etcd
--experimental-initial-corrupt-check=true
--experimental-watch-progress-notify-interval=5s
--initial-advertise-peer-urls=https://192.8.216.9:2380
--initial-cluster=controlplane=https://192.8.216.9:2380
--key-file=/etc/kubernetes/pki/etcd/server.key
--listen-client-urls=https://127.0.0.1:2379,https://192.8.216.9:2379
--listen-metrics-urls=http://127.0.0.1:2381
--listen-peer-urls=https://192.8.216.9:2380
--name=controlplane
--peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
--peer-client-cert-auth=true
--peer-key-file=/etc/kubernetes/pki/etcd/peer.key
--peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
--snapshot-count=10000
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
|
kube-apiserver์ --etcd-certfile
์ต์
๊ณผ etcd server์ --cert-file
์ต์
์ ๊ฐ์ ๋ณด๋ฉด ์๋ก ๋ค๋ฅธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ ์๋, kube-apiserver๊ฐ etcd server์ ํต์ ํ ๋ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ์๋ฏธํ๊ณ ํ์๋ etcd ์๋ฒ ์์ฒด์ ์ธ์ฆ์๋ฅผ ์๋ฏธํ๋ค.
kube api server ์ ssl/tls ์ธ์ฆ์์ ์ค์ ๋ ‘๊ณตํต ์ด๋ฆ’์ด ๋ฌด์์ธ์ง๋ฅผ ๋ฌผ์ด๋ณด๋ ๊ฒ์ด๋ค. ‘Common Name’์ ์ธ์ฆ์๊ฐ ๋ฐ๊ธ๋ ์๋ฒ์ ๋๋ฉ์ธ ์ด๋ฆ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉํ๋ค.
์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ CN์ kubeapi server๊ฐ ์ฌ์ฉํ๋ ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 4169429065381004709 (0x39dcc9a4f63945a5)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = kubernetes
Validity
Not Before: May 26 06:08:28 2024 GMT
Not After : May 26 06:13:28 2025 GMT
Subject: CN = kube-apiserver
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:a9:e4:03:72:0f:63:ee:57:c2:25:b7:ff:57:6a:
9f:78:37:07:52:11:48:98:d8:b4:a3:ca:4a:05:36:
52:af:0d:50:69:60:60:1d:b9:e7:1a:98:6f:e4:2b:
73:66:aa:9d:77:ce:f3:18:e7:b1:09:83:ec:bb:ce:
5f:fd:88:a1:48:7f:50:94:26:a1:4b:ef:12:bf:92:
25:ce:a5:8d:6c:bb:7a:3e:6f:f5:78:2f:47:8a:e3:
18:b9:14:11:69:f2:a4:0d:4c:f9:c7:1b:e2:b5:ab:
09:7b:7b:3a:cf:37:bf:e6:8b:8e:2f:b1:89:0c:2a:
bc:2a:a1:14:b2:04:61:6c:6e:01:42:52:bb:c9:bf:
f0:a2:cf:53:fd:0a:be:64:34:1a:f0:93:84:57:4f:
f3:9a:b9:02:41:f9:21:3e:4a:a8:a4:4b:ca:41:7b:
8f:ed:98:b1:ef:91:58:20:ba:dd:74:45:a4:13:81:
ba:6f:7b:07:8d:d6:6d:bf:03:15:01:40:4a:e1:52:
1d:ba:a4:5e:80:1a:42:9f:0e:4a:b4:ef:0f:d0:5c:
51:c0:90:e6:44:e5:4e:03:7f:1c:85:6f:b6:26:23:
52:f7:e2:f8:b8:77:6f:81:36:93:ea:42:55:90:7a:
c0:7c:e4:f4:66:5b:a0:45:c2:e0:f3:99:53:1e:aa:
2b:95
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
F3:54:72:08:EE:F6:FC:9A:27:C9:61:F6:37:6D:32:B3:8B:86:A7:9B
X509v3 Subject Alternative Name:
DNS:controlplane, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:192.8.216.9
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
62:9d:43:f9:a8:db:73:5f:36:fe:8e:14:b4:00:9a:27:f5:7f:
76:6a:ab:64:a4:65:7c:2a:ca:43:c7:6a:f3:fd:10:0c:a3:d5:
f8:68:31:23:3a:0a:7e:10:51:1c:1d:9c:36:d0:05:2a:12:97:
6e:8d:29:d4:9b:42:95:54:42:77:b6:cc:72:82:7e:98:f7:8b:
8d:77:f9:cf:ae:4e:1a:d4:3c:a4:67:e5:94:1e:a7:d9:dd:8a:
73:e4:d6:58:32:0e:4d:0e:8c:1b:51:a7:85:06:23:1c:ae:cf:
30:2f:62:24:1c:1c:1b:a8:45:c9:69:59:08:17:c9:0d:b8:08:
99:f4:01:05:76:2a:e7:4c:a2:f1:7e:71:a0:b6:6e:95:c5:55:
3b:8c:67:a6:e1:e5:31:ca:2a:9d:b0:45:df:89:d0:77:2c:d9:
9a:89:ee:35:99๐34:8e:b3:41:a7:f7:3a:6e:83:4f:a1:05:
65:42:7b:db:91:9f:0f:55:36:ec:82:12:78:cf:bf:57:1a:95:
31:18:f2:6e:5a:7b:61:11:cc:06:2b:f0:2c:32:dc:b9:b0:af:
e6:55:44:f8:98:0b:76:02:72:40:a4:7a:1a:84:2a:40:e1:a8:
e2:c2:f4:3a:8c:da:9b:83:ca:05:7b:81:b9:48:ac:6e:58:13:
|
kube api server ์ ssl/tls ์ธ์ฆ์์ ๋ด์ฉ์ ๋ณด๋ฉด, ์ ์ ์๋๊ฒ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
Issuer: CN = kubernetes
: ํด๋น ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ CN ์ kubernetes ์ด๋ค.Subject: CN = kube-apiserver
: ์ธ์ฆ์์ ์ฃผ์ฒด์ CN์ kube-apiserver์ด๋ค.X509v3 Subject Alternative Name
: kube apiserver๋ฅผ ์ธ์ฆํ ๋ ์ฌ์ฉํ๋ ๋ณ์นญ์ด๋ค.Validity
: ์ธ์ฆ์๊ฐ ์ผ๋ง๋ ์ ํจํ์ง
The kube-api server stopped again! Check it out. Inspect the kube-api server logs and identify the root cause and fix the issue.
kubeapi server ๊ฐ ์ค์ง๋์๊ธฐ ๋๋ฌธ์, kubectl ์ ์ด์ฉํ ๋ก๊ทธ๋ ํ์ธํ ์ ์๋ค.
๋ฐ๋ผ์, container id ๋ฅผ ํ์ธํ๊ธฐ ์ํด, ๋ฐํ์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง docker ps -a ๋๋ crictl ps -a ๋ฑ ๋ช
๋ น์ด๋ฅผ ํตํด container id๋ฅผ ๊ฐ์ ธ์จ ํ,
docker logs [container-id]๋ฅผ ํตํด ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ฒผ๋ ์ง ์ดํด๋ณธ๋ค.
1
2
| 127.0.0.1:2379", }. Err: connection error: desc = "transport: authentication handshake failed: tls: failed to verify certificate: x509: certificate signed by unknown authority"
W0526 06:48:05.594458 1 logging.go:59] [core] [Channel #1 SubChannel #3] grpc: addrConn.createTransport failed to connect to {Addr: "127.0.0.1:2379", ServerName: "127.0.0.1:2379", }. Err: connection error: desc = "transport: authentication handshake failed: tls: failed to verify certificate: x509: certificate signed by unknown authority"
|
์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ kube-api server๊ฐ etcd ์๋ฒ์ ํต์ ํ ๋ ์ธ์ฆ์์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฐ์ , kube-apiserver์ ์ค์ ํ์ผ์ ํตํด ca file ์ด ์ด๋์๋ ์ง ํ์ธํ๋ค.
1
2
3
4
5
| cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep "etcd"
- --etcd-cafile=/etc/kubernetes/pki/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:2379
|
์์์ etcd-cafile์ ๊ฒฝ๋ก๋ฅผ ๋ณด๋ฉด, /etc/kubernetes/pki/ca.crt
ํด๋น ๊ฒฝ๋ก๋ ํด๋ฌ์คํฐ ๋ด์์ ๋ค์ํ ๊ตฌ์ฑ์์์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ ๊ฒ์ฆํ ๋ ์ฌ์ฉํ๋ ๋ฃจํธ ์ธ์ฆ์ ๊ฒฝ๋ก์ด๋ค. ์ด ์ธ์ฆ์๋ ์๋ก์ด ๋
ธ๋๋ ์ฌ์ฉ์๊ฐ ํด๋ฌ์คํฐ์ ์ถ๊ฐ๋ ๋, ์ด CA๋ฅผ ์ด์ฉํด์ ํ์ํ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ ํด๋ฌ์คํฐ ์๋น์ค ๋ด ์ํธ ์ธ์ฆ์ ์ํด ์ด CA๊ฐ ์ธ์ฆ๊ธฐ๊ด์ผ๋ก์ ์์ฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก, ํด๋น ๊ฒฝ๋ก๋ฅผ etcd ์๋ฒ์ ca ์ธ์ฆ์๋ก ๊ต์ฒดํ์ฌ์ผ ํ๋ค.
certificate api
์ฟ ๋ฒ๋คํฐ์ค ์ธํ๋ผ ๊ด๋ฆฌ ํ์ ์๋ก์ด ๋ฉค๋ฒ๊ฐ ๋ค์ด์๋ค. ํด๋น ๋ฉค๋ฒ๊ฐ ์ฟ ๋ฒ๋ค์์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํ ์ ์ ํ ๊ถํ์ ๊ฐ์ง ์ธ์ฆ์๋ฅผ ๋ถ์ฌํ๋ ค๊ณ ํ๋ค. ๊ทธ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- csr ํ์ผ / key ํ์ผ ์์ฑ
1
2
3
4
5
| # generate private key
openssl genrsa -out mykey.key 2048
# generate csr
openssl req -new -key mykey.key -out mycsr.csr -sujb "/CN=example.com/O=My organization/C=US"
|
- ์ฟ ๋ฒ๋คํฐ์ค์ CSR(certificate Signing Request) object ๋ฅผ ์์ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # base64 ๋ก ์ธ์ฝ๋ฉ
cat mycsr.csr | base64 -w 0
vi create-csr-object.yaml
# apiVersion: certificates.k8s.io/v1
# kind: CertificateSigningRequest
# metadata:
# name: temp
# spec:
# groups:
# - system:authenticated
# request: <์์์ ์ธ์ฝ๋ฉํ ๊ฐ>
# signerName: kubernetes.io/kube-apiserver-client
# usages:
# - client auth
|
- ์น์ธ ๋๋ ๊ฑฐ์
1
2
| kubectl certificate approve temp
kubectl certificate deny temp
|
RBAC
RBAC ์ ๊ธฐ๊ด ๋ด ๊ฐ์ธ์ ์ ์ ๊ฐ ํด๋ฌ์คํฐ์ ์ ๊ทผํ ๋ ๊ท์ ๋ฅผ ๋ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ ๋งํ๋ค. ๊ถํ์ ๊ฐ์ง ์ฌ๋๋ง ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ํ๋ ค๋ฉด, kube api server๋ฅผ ์คํํ ๋, –authorization-mode ๊ฐ์ RBAC
์ ํฌํจ์์ผ์ฃผ๋ฉด ๋๋ค.
1
2
3
4
5
6
7
8
| kubectl describe role -n kube-system kube-proxy
Name: kube-proxy
Labels: <none>
Annotations: <none>
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
configmaps [] [kube-proxy] [get]
|
์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, kube-system namespace ์๋ kube-proxy๋ผ๋ role์ด ์กด์ฌํ๊ณ , ์ด Role์ ํ ๋น๋ฐ์ ์ ์ ๋ kube-proxy๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ฆฌ์์ค์ ๋ํด get ์์ฒญ๋ง ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์๋๋, kube-proxy๋ผ๋ role์ ๊ฐ์ง ์ฃผ์ฒด๋ฅผ ๋ปํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
| kubectl describe rolebindings.rbac.authorization.k8s.io -n kube-system kube-proxy
Name: kube-proxy
Labels: <none>
Annotations: <none>
Role:
Kind: Role
Name: kube-proxy
Subjects:
Kind Name Namespace
---- ---- ---------
Group system:bootstrappers:kubeadm:default-node-token
|
Role์ ์ด๋ค ๋ฆฌ์์ค์ ๋ํด ์ผ๋งํผ์ ์ ๊ทผ์ ํ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํด์ฃผ๋ ๊ฒ์ ์๋ฏธํ๊ณ , rolebinding ์ user/group/ ๋ฑ ํด๋ฌ์คํฐ์ ์ ๊ทผํ๋ ์ฃผ์ฒด์ role์ ๋ถ์ฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
role/rolebinding ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| kubectl create role developer --verb=list,create,delete --resource=pods
kubectl create rolebinding dev-user-binding --role=developer --user=dev-user
# ์ถ๊ฐ๋ก ์ฌ๋ฌ๊ฐ์ ๋ฆฌ์์ค์ ๋ํ ๊ท์น์ ํ๋์ role์ ๋ถ์ฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
creationTimestamp: "2024-05-26T14:36:47Z"
name: developer
namespace: blue
resourceVersion: "2165"
uid: bd5331df-f342-4d58-88b5-fff760d5b765
rules:
- apiGroups:
- ""
resourceNames:
- blue-app
- dark-blue-app
resources:
- pods
verbs:
- get
- watch
- create
- delete
- apiGroups:
- apps
resources:
- deployments
verbs:
- create
|
Role ์ด ์ ์์ ์ผ๋ก ๋ถ์ฌ๊ฐ ๋์๋ ์ง ํ์ธํ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์์ฑํ๋ฉด ๋๋ค. ์ developer ์ ๋ช
์๋ role์ ๋ณด๋ฉด pods์ ๋ํ ๋ชจ๋ ์ ๊ทผ๊ถํ, deployments์ ๋ํ create๊ถํ๋ง ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์, deployments๋ฅผ ์์ฑํ ๋๋ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋๊ณ , deployment ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ api๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ์คํจํ ๊ฒ์ด๋ค.
1
2
3
4
5
| kubectl create deployment test --image busybox --dry-run=client --as dev-user
deployment.apps/test created (dry run)
kubectl get deployments.apps --as dev-user
Error from server (Forbidden): deployments.apps is forbidden: User "dev-user" cannot list resource "deployments" in API group "apps" in the namespace "default"
|
cluster role binding
์์ role/rolebinding ๊ณผ cluster/cluster role binding ์ ์ฐจ์ด๋ role์ ํน์ namespace๋ด์์๋ง ์์ฉํ๋ ๋ฐ๋ฉด, cluster role์ ํด๋ฌ์คํฐ ์ ์ฒด์ ๊ฑธ์ณ ์์ฉํ๋ค.
service account
service account๋ pod ๋ด์์ ์คํ์ค์ธ ์ดํ๋ฆฌ์ผ์ด์
์ด ์ฟ ๋ฒ๋คํฐ์ค api์ ์ํธ์์ฉํ ๋ ์ฌ์ฉํ๋ค. ์ด ๊ณ์ ์ ํน์ ๋ค์์คํ์ด์ค์ ์ํด์์ผ๋ฉฐ, pod level์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค์ ์ ๊ทผํ๋๋ฐ ์ฌ์ฉ๋๋ค.
deployment์ service account ๋ฅผ ์์ฑํ ๋๋ spec.serviceAccountName ์ผ๋ก service account ์ ๋ฆฌ์์ค ์ด๋ฆ์ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
Specifying imagePullSecrets on a Pod
private registry ์์ ์ด๋ฏธ์ง๋ฅผ pullํ๋ ค๊ณ ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฐ์ docker config์ ์ฌ์ฉํ kubernetes secret ๋ฆฌ์์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
1
2
3
4
5
| kubectl create secret docker-registry <name> \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL
|
secret ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ณ ๋ ํ (literal ๋ก ์ ์ด์ฃผ๋ ๊ฒ์ด ์๋ ํ์ผ์ ์ฐธ์กฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค), private registry ์ ์ ๊ทผ๊ถํ์ ์ฃผ๊ธฐ ์ํด, pod์ ์ค์ ํ์ผ์ imagePullSecrets
ํ๋๋ฅผ ์์ ๋ง๋ค์ด์ค secret ์ด๋ฆ์ผ๋ก ํ ๋นํ๋ค.
1
2
3
4
5
| spec:
imagePullSecrets:
- name : <name>
containers:
...
|
security context
security context๋ pod ๋๋ container ๋ ๋ฒจ์์ ๋ณด์ ์์ค์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค. container ์์ฑ ์ command argument ์ ํน์ ๋ช
๋ น์ ์คํํ๋ ์ฃผ์ฒด๊ฐ ๋๊ตฌ์ธ์ง ์๊ณ ์ถ๋ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
1
| kubectl exec [pod-name] -- whoami
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| apiVersion: v1
kind: Pod
metadata:
name: multi-pod
spec:
securityContext:
runAsUser: 1001
containers:
- image: ubuntu
name: web
command: ["sleep", "5000"]
securityContext:
runAsUser: 1002
- image: ubuntu
name: sidecar
command: ["sleep", "5000"]
|
์์ ๊ฐ์ด specification ์ด ์ ์๋์ด ์์ผ๋ฉด, pod level์์๋ 1001 ๋ก ์๋ํ๋ค. web container์์๋ 1002๋ก pod level์ security context๋ฅผ ๋ฎ์ผ์ฐ๊ฒ ๋๋ค. sidecar์ ๊ฒฝ์ฐ pod level์์ ์ ์ํ 1001์ context๋ฅผ ํ ๋น๋ฐ๊ฒ ๋๋ค.
1
2
3
| securityContext:
capabilities:
add: ["NET_ADMIN", "SYS_TIME"]
|
์ ์ต์
์, ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ ์ปจํ
์ด๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๊ณ ์์ง ์์ linux ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ์๋ค.
๊ฐ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
- NET_ADMIN : ๋คํธ์ํฌ ๊ด๋ จ ์์ ๊ถํ, ip,route table ๋ณ๊ฒฝ์ด ๊ฐ๋ฅ
- SYS_TIME : ์๊ฐ๊ฐ ์์ ๊ถํ
network policy
aws์ security group๊ณผ ๋น์ทํ ๊ฑฐ๋ค. ๋คํธ์ํฌ ํธ๋ํฝ์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: internal-policy
namespace: default
spec:
podSelector:
matchLabels:
name: internal
policyTypes:
- Egress
- Ingress
ingress:
- {}
egress:
- to:
- podSelector:
matchLabels:
name: mysql
ports:
- protocol: TCP
port: 3306
- to:
- podSelector:
matchLabels:
name: payroll
ports:
- protocol: TCP
port: 8080
- ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
|
์ specification ์ ๋ณด๋ฉด, name=internal
label์ ๊ฐ์ง pod์๊ฒ network policy ๋ฅผ ๋ถ์ฌํ๋๋ฐ, ์ธ๋ถ ํธ๋ํฝ์ name=mysql
์ ๊ฐ์ง pod์ 3306
port ๊ทธ๋ฆฌ๊ณ , name=payroll
label์ ๊ฐ์ง pod์ 8080
port ๋ก ๋๊ฐ๋ ํธ๋ํฝ๋ง ํ์ฉํ๋ค.
์ถ๊ฐ๋ก, kube-dns์์ dns resolve ๋ฅผ ํ๊ธฐ ์ํด TCP/UDP 53 ๋ฒ ํธ๋ํฝ์ ํ์ฉํ ๊ฒ์ ๋ณผ ์ ์๋ค.