{"id":6927,"date":"2022-10-31T22:17:03","date_gmt":"2022-10-31T13:17:03","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6927"},"modified":"2023-01-12T15:40:49","modified_gmt":"2023-01-12T06:40:49","slug":"kubernetes-local-storage","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6927","title":{"rendered":"Kubernetes &#8211; local-storage"},"content":{"rendered":"<h1>Kubernetes &#8211; local-storage<\/h1>\n<p>\uc6b0\uc120 <a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=7441\">\uc5ec\uae30<\/a> \ub97c \ucc38\uc870\ud558\uc5ec,<br \/>\nlocal-storage \uc5d0 \uc5b4\ub5a4 \uc81c\uc57d\uc0ac\ud56d\uc774 \uc788\uace0,<br \/>\n\ud68c\ud53c\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc5b4\ub5a4 \uc870\uce58\ub97c \ucde8\ud574\uc57c \ud558\ub294\uc9c0 \ud655\uc778\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798 \ub0b4\uc6a9\uc740 \ub370\uc774\ud0c0\ub97c \uc800\uc7a5\ud558\uae30 \uc704\ud55c \uc6a9\ub3c4\ub85c <code>local-storage<\/code> \ub97c \uc0ac\uc6a9\ud588\uace0,<br \/>\n\uc81c\uc57d\uc0ac\ud56d\uc744 \ud68c\ud53c\ud558\uae30 \uc704\ud574,<br \/>\n\uac01 node \uc5d0 \uac01\uac01 \ud558\ub098\uc758 PV \ub97c \uc0dd\uc131\ud558\uace0,<br \/>\n\ub610 node \uc5d0 Pod \ub3c4 \ud558\ub098\uc529\ub9cc \uc0dd\uc131\ub418\ub3c4\ub85d \ud558\ub294 \uc124\uc815\uc785\ub2c8\ub2e4.<\/p>\n<h2>StorageClass \uc0dd\uc131<\/h2>\n<p>StorageClass \uc5d0\ub294 namespace \ub97c \uc9c0\uc815\ud560 \uc218 \uc5c6\ub2e4.<\/p>\n<pre><code class=\"language-bash\">vi local-storage-class.yaml\n---------------------------\nkind: StorageClass\napiVersion: storage.k8s.io\/v1\nmetadata:\n  name: local-storage\nprovisioner: kubernetes.io\/no-provisioner\nvolumeBindingMode: WaitForFirstConsumer\n---------------------------<\/code><\/pre>\n<pre><code class=\"language-bash\">kubectl create -f local-storage-class.yaml<\/code><\/pre>\n<h2>\ub514\ub809\ud1a0\ub9ac \uc0dd\uc131<\/h2>\n<p>\ubaa8\ub4e0 \ub178\ub4dc\uc5d0 \ub3d9\uc77c\ud55c \ub514\ub809\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/data\/my-app\n\n# docker image \uc0c1\uc758 \uacc4\uc815 user\/group \uc774 \ud544\uc694\ud558\ub2e4.\n# ex : 472:472 for grafana\n# sudo chown -R \uc720\uc800:\uadf8\ub8f9 \/data\/my-app\n# chmod 755 \/data\/my-app\n\nchmod 777 \/data\/my-app<\/code><\/pre>\n<h2>PV \uc0dd\uc131<\/h2>\n<p>PV \ub97c \uc5ec\ub7ec\uac1c \uc0dd\uc131\ud574\uc57c \ud558\uba74,<br \/>\nmy-app-pv-0, my-app-pv-1, my-app-pv-2 &#8230; \ub85c \ub9cc\ub4e4\uc5b4\uc90d\ub2c8\ub2e4.<\/p>\n<p>claimRef \ub294 {volumeClaimTemplate \uc774\ub984}-{statefulset \uc774\ub984}-\uc22b\uc790 \ud615\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: my-app-pv-0\n  namespace: my-app\nspec:\n  capacity:\n    storage: 5Gi\n  accessModes:\n  - ReadWriteOnce\n  claimRef:\n    name: myappvol-my-app-0\n    namespace: my-app\n  persistentVolumeReclaimPolicy: Retain\n  storageClassName: local-storage\n  local:\n    path: \/data\/my-app          # \ud638\uc2a4\ud2b8 \ud3f4\ub354\uacbd\ub85c\n  nodeAffinity:\n    required:\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: kubernetes.io\/hostname\n          operator: In\n          values:\n          - mynode-0            # \ub178\ub4dc \uc774\ub984(hostname, \uc18c\ubb38\uc790\ub85c \uc785\ub825)\n\n---\n\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: my-app-pv-1\n  namespace: my-app\nspec:\n  capacity:\n    storage: 5Gi\n  accessModes:\n  - ReadWriteOnce\n  claimRef:\n    name: myappvol-my-app-1\n    namespace: my-app\n  persistentVolumeReclaimPolicy: Retain\n  storageClassName: local-storage\n  local:\n    path: \/data\/my-app          # \ud638\uc2a4\ud2b8 \ud3f4\ub354\uacbd\ub85c\n  nodeAffinity:\n    required:\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: kubernetes.io\/hostname\n          operator: In\n          values:\n          - mynode-1            # \ub178\ub4dc \uc774\ub984(hostname, \uc18c\ubb38\uc790\ub85c \uc785\ub825)<\/code><\/pre>\n<h2>StatefulSet \uc0dd\uc131<\/h2>\n<p>volumeClaimTemplates \uc5d0 \uc758\ud574,<br \/>\nmyappvol-my-app-0, myappvol-my-app-1 \ud615\uc2dd\uc758 PVC \ub97c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>replicas \uac2f\uc218 \uc774\uc0c1\uc758 PV \ub97c \ubbf8\ub9ac \ub9cc\ub4e4\uc5b4 \ub450\uc5b4\uc57c \ud569\ub2c8\ub2e4.<br \/>\n\ubd80\uc871\ud55c \uacbd\uc6b0 pending \uc774 \ub429\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">apiVersion: apps\/v1\nkind: StatefulSet\nmetadata:\n  name: my-app                ## Statefulset \uc774\ub984\n  namespace: my-app\nspec:\n  selector:\n    matchLabels:\n      app: nginx\n  serviceName: &quot;nginx&quot;\n  replicas: 2\n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      terminationGracePeriodSeconds: 10\n      containers:\n      - name: nginx\n        image: k8s.gcr.io\/nginx-slim:0.8\n        ports:\n        - containerPort: 80\n          name: web\n        volumeMounts:\n        - name: myappvol\n          mountPath: \/usr\/share\/nginx\/html\n  volumeClaimTemplates:\n  - metadata:\n      name: myappvol          # volumeClaimTemplate \uc774\ub984\n    spec:\n      accessModes: [ &quot;ReadWriteOnce&quot; ]\n      storageClassName: local-storage\n      resources:\n        requests:\n          storage: 100Gi<\/code><\/pre>\n<h2>Headless Service<\/h2>\n<p>\ub9cc\uc57d \uc678\ubd80\uc5d0 \uc11c\ubc84\ub97c \uc624\ud508\ud574\uc57c \ud55c\ub2e4\uba74,<br \/>\n\uc544\uc774\ud53c \ub300\uc2e0 \ub3c4\uba54\uc778\uc744 \uc774\uc6a9\ud574 \uc811\uadfc\ud558\ub3c4\ub85d \ubcc0\uacbd\ud574 \uc8fc\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n<p>\uac01\uac01\uc758 Pod \uc5d0 \uac01\uac01 \ub2e4\ub978 \ub370\uc774\ud0c0\uac00 \uc800\uc7a5\ub418\ubbc0\ub85c,<br \/>\n\ud2b9\uc815\uc11c\ubc84\ub85c \uc811\uc18d\ud574\uc57c \ud558\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes &#8211; local-storage \uc6b0\uc120 \uc5ec\uae30 \ub97c \ucc38\uc870\ud558\uc5ec, local-storage \uc5d0 \uc5b4\ub5a4 \uc81c\uc57d\uc0ac\ud56d\uc774 \uc788\uace0, \ud68c\ud53c\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc5b4\ub5a4 \uc870\uce58\ub97c \ucde8\ud574\uc57c \ud558\ub294\uc9c0 \ud655\uc778\ud574\uc57c \ud569\ub2c8\ub2e4. \uc544\ub798 \ub0b4\uc6a9\uc740 \ub370\uc774\ud0c0\ub97c \uc800\uc7a5\ud558\uae30 \uc704\ud55c \uc6a9\ub3c4\ub85c local-storage \ub97c \uc0ac\uc6a9\ud588\uace0, \uc81c\uc57d\uc0ac\ud56d\uc744 \ud68c\ud53c\ud558\uae30 \uc704\ud574, \uac01 node \uc5d0 \uac01\uac01 \ud558\ub098\uc758 PV \ub97c \uc0dd\uc131\ud558\uace0, \ub610 node \uc5d0 Pod \ub3c4 \ud558\ub098\uc529\ub9cc \uc0dd\uc131\ub418\ub3c4\ub85d \ud558\ub294 \uc124\uc815\uc785\ub2c8\ub2e4. StorageClass \uc0dd\uc131 StorageClass \uc5d0\ub294 namespace \ub97c\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6927\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-6927","post","type-post","status-publish","format-standard","hentry","category-kubernetes"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6927"}],"version-history":[{"count":5,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6927\/revisions"}],"predecessor-version":[{"id":7446,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6927\/revisions\/7446"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}