12-smoke-test

Dante·2024년 6월 2일
0

kubernetes-hard-way

목록 보기
13/13

Smoke Test


이번 랩에서는 Kubernetes Cluster가 올바르게 작동하는지 확인하기 위한 일련의 작업을 수행합니다.

Data Encryption


이 섹션에서는 저장된 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

Deployments


이 섹션에서는 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 Forwarding

이 섹션에서는 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

Logs

이 섹션에서는 컨테이너 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" "-"

EXEC


이 섹션에서는 컨테이너에서 명령을 실행하는 기능을 확인합니다.

https://kubernetes.io/docs/tasks/debug/debug-application/get-shell-running-container/#running-individual-commands-in-a-container

nginx 컨테이너에서 nginx -v 명령을 실행하여 nginx 버전을 출력합니다.

kubectl exec -ti $POD_NAME -- nginx -v
nginx version: nginx/1.27.0

Service


이 섹션에서는 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
profile
it's me.

0개의 댓글

관련 채용 정보