이번 랩에서는 Kubernetes Cluster가 올바르게 작동하는지 확인하기 위한 일련의 작업을 수행합니다.
이 섹션에서는 저장된 secret 데이터를 암호화 하는 기능을 확인합니다.
(https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#verifying-that-data-is-encrypted)
generic secret을 생성합니다.
kubectl create secret generic kubernetes-the-hard-way \
--from-literal="mykey=mydata"
hexdump를 통해 etcd에 저장 된 kubernetes-the-hard-way
secret 데이터를 확인합니다.
ssh root@controlplane-1 \
'etcdctl get /registry/secrets/default/kubernetes-the-hard-way | hexdump -C'
00000000 2f 72 65 67 69 73 74 72 79 2f 73 65 63 72 65 74 |/registry/secret|
00000010 73 2f 64 65 66 61 75 6c 74 2f 6b 75 62 65 72 6e |s/default/kubern|
00000020 65 74 65 73 2d 74 68 65 2d 68 61 72 64 2d 77 61 |etes-the-hard-wa|
00000030 79 0a 6b 38 73 3a 65 6e 63 3a 61 65 73 63 62 63 |y.k8s:enc:aescbc|
00000040 3a 76 31 3a 6b 65 79 31 3a 99 40 67 50 33 67 56 |:v1:key1:.@gP3gV|
00000050 8f c4 46 65 68 49 c3 06 13 46 5f be c1 16 4a 98 |..FehI...F_...J.|
00000060 59 f5 35 fc a9 bd 54 67 19 63 3a e9 48 93 94 ac |Y.5...Tg.c:.H...|
00000070 a2 5a 30 ca 14 4c 4d 44 6a 66 5f ec 69 91 d8 a9 |.Z0..LMDjf_.i...|
00000080 a2 91 ac 51 0f ba b8 e2 c2 33 b8 61 c3 a7 33 96 |...Q.....3.a..3.|
00000090 ed 28 45 94 7c 03 5c 9e 8e b4 36 45 52 61 f1 c3 |.(E.|.\...6ERa..|
000000a0 72 ce 22 41 12 58 3c 9b b9 a5 c4 c1 c0 02 da 09 |r."A.X<.........|
000000b0 cc 7e ff 3d 8a a1 58 d7 40 c9 40 7e dd fd 0a a1 |.~.=..X.@.@~....|
000000c0 65 40 94 b5 35 41 88 3f e9 64 37 e9 4b c5 9f eb |e@..5A.?.d7.K...|
000000d0 8b 6b 53 91 6f f2 4c 7b 48 3d 59 90 e6 49 49 20 |.kS.o.L{H=Y..II |
000000e0 e8 6b 0e 06 ac 34 1c 82 d7 fe a2 86 e3 d7 b2 e4 |.k...4..........|
000000f0 dc 5a 7d f7 ca 06 7a a8 b5 c3 ef b5 1a 2d 48 e2 |.Z}...z......-H.|
00000100 bf cf 91 b5 dd 0b 97 0a 7c b6 3b ac 16 ee 06 c6 |........|.;.....|
00000110 cd 4b bf 17 51 26 c5 8d b6 25 b9 27 c1 73 8c 86 |.K..Q&...%.'.s..|
00000120 23 58 20 2c 71 5a 0d 79 da db cc 0d d4 3c 3e 68 |#X ,qZ.y.....<>h|
00000130 17 f8 0c 7a e7 cb 45 8a 13 4f 0a 58 bf 8b 64 75 |...z..E..O.X..du|
00000140 09 73 9a 07 35 56 33 ba a6 3d a1 aa a1 ea 2e 71 |.s..5V3..=.....q|
00000150 03 f3 a2 62 ee 3a 0c 41 31 0a |...b.:.A1.|
0000015a
etcd 키에는 k8s:enc:aescbc:v1:key1
접두사가 붙어야합니다. aescbc
공급자가 key1
암호화 키로 데이터를 암호하는데 사용되었음을 나타냅니다.
etcd 암호화를 안했을 경우 이와 같이 secret 데이터가 평문으로 저장된 값을 확인할 수 있습니다.
00000000 2f 72 65 67 69 73 74 72 79 2f 73 65 63 72 65 74 |/registry/secret|
00000010 73 2f 64 65 66 61 75 6c 74 2f 6b 75 62 65 72 6e |s/default/kubern|
00000020 65 74 65 73 2d 74 68 65 2d 68 61 72 64 2d 77 61 |etes-the-hard-wa|
00000030 79 0a 6b 38 73 00 0a 0c 0a 02 76 31 12 06 53 65 |y.k8s.....v1..Se|
00000040 63 72 65 74 12 dd 01 0a c1 01 0a 17 6b 75 62 65 |cret........kube|
00000050 72 6e 65 74 65 73 2d 74 68 65 2d 68 61 72 64 2d |rnetes-the-hard-|
00000060 77 61 79 12 00 1a 07 64 65 66 61 75 6c 74 22 00 |way....default".|
00000070 2a 24 35 64 39 30 64 38 36 62 2d 36 61 36 62 2d |*$5d90d86b-6a6b-|
00000080 34 33 39 66 2d 61 30 34 37 2d 64 61 35 37 34 36 |439f-a047-da5746|
00000090 37 65 62 62 63 62 32 00 38 00 42 08 08 cf ba f0 |7ebbcb2.8.B.....|
000000a0 b2 06 10 00 7a 00 8a 01 62 0a 0e 6b 75 62 65 63 |....z...b..kubec|
000000b0 74 6c 2d 63 72 65 61 74 65 12 06 55 70 64 61 74 |tl-create..Updat|
000000c0 65 1a 02 76 31 22 08 08 cf ba f0 b2 06 10 00 32 |e..v1".........2|
000000d0 08 46 69 65 6c 64 73 56 31 3a 2e 0a 2c 7b 22 66 |.FieldsV1:..,{"f|
000000e0 3a 64 61 74 61 22 3a 7b 22 2e 22 3a 7b 7d 2c 22 |:data":{".":{},"|
000000f0 66 3a 6d 79 6b 65 79 22 3a 7b 7d 7d 2c 22 66 3a |f:**mykey**":{}},"f:|
00000100 74 79 70 65 22 3a 7b 7d 7d 42 00 12 0f 0a 05 6d |type":{}}B.....m|
00000110 79 6b 65 79 12 06 6d 79 64 61 74 61 1a 06 4f 70 |ykey..**mydata**..Op|
00000120 61 71 75 65 1a 00 22 00 0a |aque.."..|
00000129
이 섹션에서는 Deployment 리소스를 생성하고 관리하는 기능을 확인합니다.
nginx web server의 deployment 리소스를 생성합니다.
kubectl create deployment nginx \
--image=nginx:latest
nginx
deployment에서 생성된 pod를 확인합니다.
kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-7584b6f84c-j7x9m 1/1 Running 0 2m20s
이 섹션에서는 port forward를 사용하여 원격으로 어플리케이션에 접근하는 기능을 확인합니다.
Use Port Forwarding to Access Applications in a Cluster
nginx
pod의 이름을 검색합니다.
POD_NAME=$(kubectl get pods -l app=nginx \
-o jsonpath="{.items[0].metadata.name}")
local machine의 port 8080을 nginx
pod의 port 80으로 forward 합니다.
kubectl port-forward $POD_NAME 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
새로운 터미널 창에서 HTTP 요청을 보내봅니다.
curl --head http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.27.0
Date: Sun, 02 Jun 2024 07:51:09 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 May 2024 13:22:30 GMT
Connection: keep-alive
ETag: "6655da96-267"
Accept-Ranges: bytes
이전 터미널로 다시 돌아와서 nginx
pod로의 port forward를 중지합니다.
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
^C
이 섹션에서는 컨테이너 log를 검색하는 기능을 확인합니다.
https://kubernetes.io/docs/concepts/cluster-administration/logging/
nginx
pod의 로그를 출력합니다.
kubectl logs $POD_NAME
...
127.0.0.1 - - [02/Jun/2024:07:51:09 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.81.0" "-"
이 섹션에서는 컨테이너에서 명령을 실행하는 기능을 확인합니다.
nginx
컨테이너에서 nginx -v
명령을 실행하여 nginx 버전을 출력합니다.
kubectl exec -ti $POD_NAME -- nginx -v
nginx version: nginx/1.27.0
이 섹션에서는 Service 리소스를 활용하여 어플리케이션을 노출하는 기능을 확인합니다.
NodePort
서비스를 사용해 nginx
deployment를 노출합니다.
kubectl expose deployment nginx \
--port 80 --type NodePort
LoadBalancer
서비스 타입은 cloud provider intergration
환경에서 Kubernetes Cluster를 구성하지 않았기에 사용할 수 없습니다.
(https://kubernetes.io/docs/setup/#cloud-provider)
nginx
서비스에 할당된 Node Port를 검색합니다.
NODE_PORT=$(kubectl get svc nginx \
--output=jsonpath='{range .spec.ports[0]}{.nodePort}')
노드의 IP 주소와 노드포트를 사용해 HTTP 요청을 보내봅니다.
curl -I http://node-2:${NODE_PORT}
HTTP/1.1 200 OK
Server: nginx/1.27.0
Date: Sun, 02 Jun 2024 08:11:33 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 May 2024 13:22:30 GMT
Connection: keep-alive
ETag: "6655da96-267"
Accept-Ranges: bytes