๐Ÿš—์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ„ฐ๋”” PKOS 3์ฃผ์ฐจ Ingress & Storage

Burstยท2023๋…„ 2์›” 27์ผ
0

๐Ÿ˜ŽPKOS์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
3/7

๋ชฉํ‘œ

์ด๋ฒˆ 3์ฃผ์ฐจ์—๋Š” 2์ฃผ์ฐจ์— ์ด์–ด ๋กœ๋“œ๋ฐธ๋Ÿฐ์Šค์ปจํŠธ๋กค๋Ÿฌ์™€ Ingress(ALB) ์„ค์ •์— ๋Œ€ํ•ด์„œ ์‹ค์Šต ํ•  ์˜ˆ์ •์ด๋‹ค. ๋˜ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ์–ด๋– ํ•œ ์ข…๋ฅ˜์˜ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

Ingress

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ ์„œ๋น„์Šค(ClusterIP, NodePort, Loadbalancer)๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ(HTTP/HTTPS) - Web Proxy ์—ญํ• 

๊ธฐ๋ณธ ์„ค์ •

kops edit cluster
-----
spec:
  certManager:
    enabled: true
  awsLoadBalancerController:
    enabled: true
  externalDns:
    provider: external-dns
-----

# ์—…๋ฐ์ดํŠธ ์ ์šฉ
kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster

์„œ๋น„์Šค/ํŒŒ๋“œ ๋ฐฐํฌ with Ingress(ALB)

#ingress1.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: game-2048
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 2
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:     
      containers:
      - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
        imagePullPolicy: Always
        name: app-2048
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: app-2048
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: service-2048
              port:
                number: 80
# ๊ฒŒ์ž„ ํŒŒ๋“œ์™€ Service, Ingress ๋ฐฐํฌ
kubectl apply -f ~/pkos/3/ingress1.yaml

# ์ƒ์„ฑ ํ™•์ธ
kubectl get-all -n game-2048
kubectl get ingress,svc,ep,pod -n game-2048
kubectl get targetgroupbindings -n game-2048

# Ingress ํ™•์ธ
kubectl describe ingress -n game-2048 ingress-2048

# ๊ฒŒ์ž„ ์ ‘์† : ALB ์ฃผ์†Œ๋กœ ์›น ์ ‘์†
kubectl get ingress -n game-2048 ingress-2048 -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Game URL = http://"$1 }'




Storage

EC2 ์ธ์Šคํ„ด์Šค ์Šคํ† ์–ด(์ž„์‹œ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€)

์ฐธ๊ณ 

  • AWS Instance๊ฐ€ EBS๊ฐ€ ์•„๋‹Œ HOST ์„œ๋ฒ„์˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€.
  • Instance ์ž…์žฅ์—์„œ๋Š” ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฆ„.
  • ๋ฐ์ดํ„ฐ ์†์‹ค : ๊ธฐ๋ณธ ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ ์˜ค๋ฅ˜, ์ธ์Šคํ„ด์Šค๊ฐ€ ์ค‘์ง€๋จ, ์ธ์Šคํ„ด์Šค๊ฐ€ ์ตœ๋Œ€ ์ ˆ์ „ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋จ, ์ธ์Šคํ„ด์Šค๊ฐ€ ์ข…๋ฃŒ๋จ
  • ์ธ์Šคํ„ด์Šค ์Šคํ† ์–ด๋Š” ์Šคํ† ๋ฆฌ์ง€ ์ •๋ณด์— ์ถœ๋ ฅ๋˜์ง€๋Š” ์•Š์Œ
  • ์žฌ๋ถ€ํŒ… ํ›„์—๋„ ์—ฐ๊ฒฐ๋œ ๋ณผ๋ฅจ์„ ์ž๋™์œผ๋กœ ํƒ‘์žฌ ์„ค์ • ๊ฐ€๋Šฅ(fstab)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€

  • ํŒŒ๋“œ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋Š” ํŒŒ๋“œ๊ฐ€ ์ •์ง€๋˜๋ฉด ๋ชจ๋‘ ์‚ญ์ œ๋จ(ํœ˜๋ฐœ์„ฑ)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(ํŒŒ๋“œ)์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ๋ณด์กด์ด ํ•„์š”
    โ†’ ๋กœ์ปฌ ๋ณผ๋ฅจ(hostPath) โ‡’ ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ(Persistent Volume, PV) - ์–ด๋Š ๋…ธ๋“œ์—์„œ๋„ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ์˜ˆ์‹œ) NFS, AWS EBS, Ceph ๋“ฑ
    (์ถœ์ฒ˜: https://kubetm.github.io/k8s/03-beginner-basic-resource/volume/)

๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์˜ ์ž„์‹œ ๋””์Šคํฌ ์‚ฌ์šฉ ์˜ˆ์‹œ

# ํŒŒ๋“œ ๋ฐฐํฌ
# date ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ ์‹œ๊ฐ„์„ 10์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ /home/pod-out.txt ํŒŒ์ผ์— ์ €์žฅ
cat ~/pkos/3/date-busybox-pod.yaml | yh
kubectl apply -f ~/pkos/3/date-busybox-pod.yaml

# ํŒŒ์ผ ํ™•์ธ
kubectl get pod
kubectl exec busybox -- tail -f /home/pod-out.txt
Sat Jan 28 15:33:11 UTC 2023
Sat Jan 28 15:33:21 UTC 2023
...

# ํŒŒ๋“œ ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์ƒ์„ฑ ํ›„ ํŒŒ์ผ ์ •๋ณด ํ™•์ธ > ์ด์ „ ๊ธฐ๋ก์ด ๋ณด์กด๋˜์–ด ์žˆ๋Š”์ง€?
kubectl delete pod busybox
kubectl apply -f ~/pkos/3/date-busybox-pod.yaml
kubectl exec busybox -- tail -f /home/pod-out.txt

AWS EBS Controller

EBS CSI driver ๋™์ž‘ : ๋ณผ๋ฅจ ์ƒ์„ฑ ๋ฐ ํŒŒ๋“œ์— ๋ณผ๋ฅจ ์—ฐ๊ฒฐ

PV์ƒ์„ฑ ํ…Œ์ŠคํŠธ

# kOps ์„ค์น˜ ์‹œ ๊ธฐ๋ณธ ๋ฐฐํฌ๋จ
kubectl get pod -n kube-system -l app.kubernetes.io/instance=aws-ebs-csi-driver
# ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค ํ™•์ธ
kubectl get sc kops-csi-1-21 kops-ssd-1-17

# PVC, ํŒŒ๋“œ ํ™•์ธ
kubectl get pvc,pv,pod
kubectl df-pv

# ์ถ”๊ฐ€๋œ EBS ๋ณผ๋ฅจ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ 
aws ec2 describe-volumes --volume-ids $(kubectl get pv -o jsonpath="{.items[0].spec.csi.volumeHandle}") | jq

# ํŒŒ์ผ ๋‚ด์šฉ ์ถ”๊ฐ€ ์ €์žฅ ํ™•์ธ
kubectl exec app -- tail -f /data/out.txt

# ํŒŒ๋“œ ๋‚ด์—์„œ ๋ณผ๋ฅจ ์ •๋ณด ํ™•์ธ
kubectl exec -it app -- sh -c 'df -hT --type=ext4'
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/nvme1n1   ext4  3.9G   16M  3.8G   1% /data
/dev/root      ext4  124G  4.9G  120G   4% /etc/hosts





๋ณผ๋ฅจ ์ฆ๊ฐ€(๊ฐ์†Œ๋Š” ์•ˆ๋Œ!)

# ํ˜„์žฌ pv ์˜ ์ด๋ฆ„์„ ๊ธฐ์ค€ํ•˜์—ฌ 4G > 10G ๋กœ ์ฆ๊ฐ€ : .spec.resources.requests.storage์˜ 4Gi ๋ฅผ 10Gi๋กœ ๋ณ€๊ฒฝ
kubectl get pvc ebs-claim -o jsonpath={.spec.resources.requests.storage} ; echo
kubectl get pvc ebs-claim -o jsonpath={.status.capacity.storage} ; echo
kubectl patch pvc ebs-claim -p '{"spec":{"resources":{"requests":{"storage":"10Gi"}}}}'

# ํ™•์ธ : ์ˆ˜์น˜ ๋ฐ˜์˜์ด ์กฐ๊ธˆ ๋Š๋ฆด์ˆ˜ ์žˆ๋‹ค
kubectl exec -it app -- sh -c 'df -hT --type=ext4'
kubectl df-pv  
aws ec2 describe-volumes --volume-ids $(kubectl get pv -o jsonpath="{.items[0].spec.csi.volumeHandle}") | jq



AWS Volume SnapShots Controller

์Šค๋ƒ…์ƒท ๊ธฐ๋Šฅ ์ œ๊ณต!

์„ค์น˜

# kOps ํด๋Ÿฌ์Šคํ„ฐ ํŽธ์ง‘
kops edit cluster
-----
spec:
  snapshotController:
    enabled: true

# ์—…๋ฐ์ดํŠธ ์ ์šฉ
kops update cluster --yes && sleep 3 && kops rolling-update cluster

kubectl get crd | grep volumesnapshot



[๊ณผ์ œ1]: Ingress(with ๋„๋ฉ”์ธ, ๋‹จ์ผ ALB ์‚ฌ์šฉ)์— PATH /mario ๋Š” mario ๊ฒŒ์ž„ ์ ‘์†ํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ณ , /tetris ๋Š” tetris ๊ฒŒ์ž„์— ์ ‘์†ํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ณ , SSL ์ ์šฉ ํ›„ ๊ด€๋ จ ์Šค์ƒท ์˜ฌ๋ ค์ฃผ์„ธ์š”.

#ํ˜ธ์ŠคํŠธ ๋„๋ฉ”์ธ: albweb.burst89.com
#ํ…ŒํŠธ๋ฆฌ์Šค: albweb.burst89.com/tetris / ๋งˆ๋ฆฌ์˜ค: albweb.burst89.com/mario
#์ธ์ฆ์„œ ์ •๋ณด
#ALB ์ •๋ณด / ๋ฆฌ์Šค๋„ˆ ์ •๋ณด
#ALB ๋ฆฌ์Šคํ„ฐ ๋ฃฐ ์ •๋ณด
#TG ์ •๋ณด
๋ฃฐ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๋ฉด, /mario์˜ ๊ฒฝ์šฐ k8s-game2048-servicet-ca0f338cf8 TG(mario TG)๋กœ ํฌ์›Œ๋”ฉ์„ ํ•˜๊ณ 
/tetirs์˜ ๊ฒฝ์šฐ k8s-game2048-servicem-39ab8f8d1a TG(tetris TG)๋กœ ํฌ์›Œ๋”ฉ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๊ฐ TG์˜ ๊ฒฝ์šฐ Pod๊ฐ€ ๋‹ค์ด๋ ‰ํŠธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
#Pod ๋ฐ ingress, service ์ •๋ณด

[๊ณผ์ œ2]: ํ˜ธ์ŠคํŠธ Path(local-path-provisioner) ์‹ค์Šต ๋ฐ ๋ฌธ์ œ์  ํ™•์ธ๊ณผ ์„ฑ๋Šฅ ์ธก์ • ํ›„ ๊ด€๋ จ ์Šค์ƒท ์˜ฌ๋ ค์ฃผ์„ธ์š”.

#local-path-provisioner ๋ฐฐํฌ(ํ˜„์žฌ Node1์— Pod ์ƒ์„ฑ)
#ํŒŒ๋“œ๊ฐ€ ๋ฐฐํฌ๋œ ์›Œ์ปค๋…ธ๋“œ drainํ•ด์„œ ๋ฌธ์ œ ํ™•์ธ
1. ์›Œ์ปค๋…ธ๋“œ ๋ณ€์ˆ˜ ์ง€์ •
2. Pod draing
3. ์ƒํƒœํ™•์ธ
4. local-path ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋˜๋Š” PV ์— Node Affinity ์„ค์ • ํ™•์ธ
5. ํŒŒ๋“œ๊ฐ€ ๋ฐฐํฌ๋œ ์›Œ์ปค๋…ธ๋“œ์— ์žฅ์• ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์™„๋ฃŒ ํ›„ uncordon ์ •์ƒ ์ƒํƒœ๋กœ ์›๋ณต Failback
6. ๋ฐ์ดํ„ฐ ํ™•์ธ

#์„ฑ๋Šฅ์ธก์ •
1. Read IOPS 3000 ํ™•์ธ
2. Write IOPS 3000 ํ™•์ธ

[๊ณผ์ œ3]: AWS EBS๋ฅผ PVC๋กœ ์‚ฌ์šฉ ํ›„ ์˜จ๋ผ์ธ ๋ณผ๋ฅจ ์ฆ๊ฐ€ ํ›„ ๊ด€๋ จ ์Šค์ƒท ์˜ฌ๋ ค์ฃผ์„ธ์š”.

#ํ˜„์žฌ ์ ์šฉ๋œ PVC ์šฉ๋Ÿ‰ ํ™•์ธ(4Gi)
#AWS console์—์„œ ์ƒ์„ฑ๋œ 4Gi ๋ณผ๋ฅจ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ.
#์˜จ๋ผ์ธ ์ƒ์—์„œ ๋ณผ๋ฅจ ํ™•์žฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๊ฐ€ ๋ณผ๋ฅจ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ.
#k edit pvc ebs-claim์œผ๋กœ ์ŠคํŽ™ ๋ณ€๊ฒฝ(30Gi)
#30Gi ๋ณ€๊ฒฝ ํ™•์ธ

[๊ณผ์ œ4]: AWS Volume SnapShots ์‹ค์Šต ํ›„ ๊ด€๋ จ ์Šค์ƒท ์˜ฌ๋ ค์ฃผ์„ธ์š”.

#์Šค๋ƒ…์ƒท ์ปจํŠธ๋กค๋Ÿฌ ์„ค์น˜ ํ™•์ธ

#์Šค๋ƒ…์ƒท ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ ํ™•์ธ
#์ƒ์„ฑ

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/classes/snapshotclass.yaml

#ํ™•์ธ

#์Šค๋ƒ…์ƒท ์ƒ์„ฑ(์ƒ์„ฑํ•œ ๋ณผ๋ฅจ์Šค๋ƒ…์ƒทํด๋ž˜์Šค์™€, ์Šค๋ƒ…์ƒท์„ ์ง„ํ–‰ ํ•  pvc๋ช… ์ž‘์„ฑ)

#์Šค๋ƒ…์ƒท ์ƒ์„ฑ ํ™•์ธ

#์žฅ์• ๋ฐœ์ƒ(pvc, pod ์‚ญ์ œ) / Pod ๋ฐ pvc, ์ƒ์„ฑ๋œ ๋ณผ๋ฅจ์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ.

#์Šค๋ƒ…์ƒท ๋ณต์›
#pv,pvc, pod ์ƒ์„ฑ ๋ฐ pv bound ํ™•์ธ!!

๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ 3์ฃผ์ฐจ ์Šคํ„ฐ๋””์—์„œ๋Š” ingress์™€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•ด์„œ ํ•™์Šต์„ ํ•˜์˜€๋‹ค.
์ด๋ฒˆ ์ฃผ์ฐจ ๊ณผ์ œ 1๋ฒˆ์„ ํ•ด๊ฒฐํ•˜๋Š๋ผ ๊ฑฐ์˜ ์ฃผ์ค‘ ๋‚ด๋‚ด ์‹œ๋„ํ–ˆ๋˜๊ฑฐ ๊ฐ™๋‹ค.... ๋‹คํ–‰์ด ์Šคํ„ฐ๋””๋ฅผ ๊ฐ™์ด ํ•˜์‹œ๋Š” ๊ฐ•์žฌ๋ฏผ๋‹˜๊ป˜์„œ ์กฐ๊ธˆ ๋„์›€์„ ์ฃผ์…”์„œ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค..
์ ์  ์Šคํ„ฐ๋””๊ฐ€ ์–ด๋ ค์›Œ ์ง€๋Š”๊ฑฐ ๊ฐ™๋‹ค... !! ๊ทธ๋ž˜๋„ ๊ผญ ์™„์ฃผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋” ์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ๋‹ค!

profile
Cloud Developer

0๊ฐœ์˜ ๋Œ“๊ธ€