\ucd5c\uadfc \ucee8\ud14c\uc774\ub108 \uae30\uc220\uc774 \ub5a0\uc624\ub974\uba74\uc11c, \ub3c4\ucee4\uc640 \ucfe0\ubc84\ub124\ud2f0\uc2a4\uac00 \ub9ce\uc740 \uad00\uc2ec\uc744 \ubc1b\uace0 \uc788\ub2e4. \ub3c4\ucee4\ub294 \ucee8\ud14c\uc774\ub108\ud654 \uae30\uc220\uc744 \uc81c\uacf5\ud558\ub294 \ud50c\ub7ab\ud3fc\uc73c\ub85c, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ucee8\ud14c\uc774\ub108\ud654\ud558\uc5ec \uac1c\ubc1c, \ubc30\ud3ec, \uc2e4\ud589\ud558\ub294 \uacfc\uc815\uc744 \uac04\ud3b8\ud558\uac8c \ub9cc\ub4e4\uc5b4\uc900\ub2e4. \ucfe0\ubc84\ub124\ud2f0\uc2a4\ub294 \uc5ec\ub7ec \ub300\uc758 \ud638\uc2a4\ud2b8\uc5d0\uc11c \ub3c4\ucee4 \ucee8\ud14c\uc774\ub108\ub97c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud558\ub294 \uc624\ud508\uc18c\uc2a4 \ud50c\ub7ab\ud3fc\uc774\ub2e4.<\/p>\n
\uc774\ubc88 \uae00\uc5d0\uc11c\ub294 \ub3c4\ucee4\uc640 \ucfe0\ubc84\ub124\ud2f0\uc2a4\ub97c \ud65c\uc6a9\ud558\uc5ec \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\ub97c \ucee8\ud14c\uc774\ub108\ud654\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc0b4\ud3b4\ubcf4\uaca0\ub2e4.<\/p>\n
\ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\ub97c \ucee8\ud14c\uc774\ub108\ud654\ud558\ub294 \uac83\uc5d0\ub294 \uc5ec\ub7ec \uac00\uc9c0 \uc774\uc810\uc774 \uc788\ub2e4.<\/p>\n
\uccab\uc9f8, \ucee8\ud14c\uc774\ub108\ub294 \uac00\uc0c1\ud654 \uae30\uc220\uc744 \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0, \ud638\uc2a4\ud2b8 \uc6b4\uc601\uccb4\uc81c\uc5d0 \ub300\ud55c \uc758\uc874\uc131\uc774 \ub0ae\uc544\uc9c4\ub2e4. \uc774\ub294 \uc11c\ubc84 \uad6c\uc131\uc744 \uac04\uc18c\ud654\ud558\uace0, \uc11c\ubc84 \ud638\ud658\uc131\uc744 \ud5a5\uc0c1\uc2dc\ud0a4\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub41c\ub2e4.<\/p>\n
\ub458\uc9f8, \ucee8\ud14c\uc774\ub108\ub294 \uac00\ubccd\uace0 \ube60\ub974\uac8c \uc0dd\uc131, \ubc30\ud3ec, \uc2e4\ud589\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0, \uac1c\ubc1c, \ubc30\ud3ec, \uc6b4\uc601 \ud504\ub85c\uc138\uc2a4\ub97c \ub354\uc6b1 \ube60\ub974\uace0 \ud6a8\uc728\uc801\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc900\ub2e4.<\/p>\n
\uc14b\uc9f8, \ucee8\ud14c\uc774\ub108\ub294 \ub354\uc6b1 \uc548\uc804\ud558\uac8c \uc11c\ube44\uc2a4\ub97c \uc6b4\uc601\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc900\ub2e4. \ucee8\ud14c\uc774\ub108\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uaca9\ub9ac\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0, \ud558\ub098\uc758 \ucee8\ud14c\uc774\ub108\uc5d0\uc11c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub354\ub77c\ub3c4 \ub2e4\ub978 \ucee8\ud14c\uc774\ub108\uc5d0\ub294 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n
\uba3c\uc800, \ub3c4\ucee4 \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud558\uace0 \ubc30\ud3ec\ud558\ub294 \uacfc\uc815\uc744 \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n
\ub3c4\ucee4 \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud558\uae30 \uc704\ud574\uc11c\ub294 Dockerfile\uc774\ub77c\ub294 \ud30c\uc77c\uc744 \uc791\uc131\ud574\uc57c \ud55c\ub2e4. Dockerfile\uc740 \uc5b4\ub5a4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ucee8\ud14c\uc774\ub108\ud654\ud560 \uac83\uc778\uc9c0, \ucee8\ud14c\uc774\ub108 \uc548\uc5d0 \uc5b4\ub5a4 \ud30c\uc77c\ub4e4\uc774 \ub4e4\uc5b4\uac08 \uac83\uc778\uc9c0 \ub4f1\uc744 \uc815\uc758\ud558\ub294 \ud30c\uc77c\uc774\ub2e4. \ub2e4\uc74c\uc740 \uac04\ub2e8\ud55c Flask \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ucee8\ud14c\uc774\ub108\ud654\ud558\ub294 Dockerfile\uc758 \uc608\uc2dc\uc774\ub2e4.<\/p>\n
# \uc774\ubbf8\uc9c0\uc758 \uae30\ubc18\uc774 \ub420 \uc774\ubbf8\uc9c0\ub97c \uc9c0\uc815\ud55c\ub2e4.\nFROM python:3.8\n\n# \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2e4\ud589\ud560 \ub514\ub809\ud1a0\ub9ac\ub97c \uc9c0\uc815\ud55c\ub2e4.\nWORKDIR \/app\n\n# \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc758\uc874\uc131\uc744 \uc124\uce58\ud55c\ub2e4.\nCOPY requirements.txt requirements.txt\nRUN pip install -r requirements.txt\n\n# \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\ub97c \ubcf5\uc0ac\ud55c\ub2e4.\nCOPY . .\n\n# \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2e4\ud589\ud55c\ub2e4.\nCMD [\"python\", \"app.py\"]<\/code><\/pre>\nDockerfile\uc744 \uc791\uc131\ud55c \ud6c4\uc5d0\ub294, \ub2e4\uc74c\uacfc \uac19\uc740 \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud558\uc5ec \ub3c4\ucee4 \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud560 \uc218 \uc788\ub2e4.<\/p>\n
docker build -t myapp:latest .<\/code><\/pre>\n\uc774\uc81c \ube4c\ub4dc\ub41c \uc774\ubbf8\uc9c0\ub97c Docker Hub\uc640 \uac19\uc740 \uc800\uc7a5\uc18c\uc5d0 \uc5c5\ub85c\ub4dc\ud558\uac70\ub098, \uc9c1\uc811 \ubc30\ud3ec\ud560 \uc218 \uc788\ub2e4.<\/p>\n
docker run -p 5000:5000 myapp:latest<\/code><\/pre>\n\uc704 \uba85\ub839\uc5b4\ub294 myapp:latest \uc774\ubbf8\uc9c0\ub97c \uc2e4\ud589\ud558\uace0, \ud638\uc2a4\ud2b8\uc758 5000\ubc88 \ud3ec\ud2b8\uc640 \ucee8\ud14c\uc774\ub108\uc758 5000\ubc88 \ud3ec\ud2b8\ub97c \ub9e4\ud551\uc2dc\ud0a8\ub2e4. \uc774\uc81c \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c http:\/\/localhost:5000<\/code>\uc744 \uc5f4\uc5b4\uc11c Flask \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc2e4\ud589\ub418\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n
\ucfe0\ubc84\ub124\ud2f0\uc2a4 \ud074\ub7ec\uc2a4\ud130\uc5d0\uc11c \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4 \uad00\ub9ac\ud558\uae30<\/h2>\n\uc774\uc81c \ub3c4\ucee4 \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud558\uace0 \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uc558\uc73c\ub2c8, \uc774\ubc88\uc5d0\ub294 \ucfe0\ubc84\ub124\ud2f0\uc2a4 \ud074\ub7ec\uc2a4\ud130\uc5d0\uc11c \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\ub97c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc790.<\/p>\n
\ucfe0\ubc84\ub124\ud2f0\uc2a4\uc5d0\uc11c\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubc30\ud3ec\ud558\uae30 \uc704\ud574 Pod, Deployment, Service, Ingress \ub4f1\uc758 \ub9ac\uc18c\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4. Pod\ub294 \ud558\ub098 \uc774\uc0c1\uc758 \ucee8\ud14c\uc774\ub108\ub97c \ud3ec\ud568\ud558\ub294 \uac00\uc7a5 \uc791\uc740 \ubc30\ud3ec \ub2e8\uc704\uc774\uba70, Deployment\ub294 Pod\ub97c \uad00\ub9ac\ud558\uace0, Service\ub294 Pod\uc5d0 \uc811\uadfc\ud558\uae30 \uc704\ud55c \ub85c\ub4dc \ubc38\ub7f0\uc11c \uc5ed\ud560\uc744 \ud55c\ub2e4. Ingress\ub294 \ud074\ub7ec\uc2a4\ud130 \uc678\ubd80\uc5d0\uc11c \uc11c\ube44\uc2a4\uc5d0 \uc811\uadfc\ud558\uae30 \uc704\ud55c URL \uacbd\ub85c\uc640 \uc11c\ube44\uc2a4\ub97c \ub9e4\ud551\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4.<\/p>\n
\uba3c\uc800, Deployment \ub9ac\uc18c\uc2a4\ub97c \uc774\uc6a9\ud558\uc5ec \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\ub97c \ubc30\ud3ec\ud574\ubcf4\uc790. \ub2e4\uc74c\uc740 Flask \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubc30\ud3ec\ud558\ub294 Deployment \ub9ac\uc18c\uc2a4\uc758 \uc608\uc2dc\uc774\ub2e4.<\/p>\n
apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n name: myapp\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: myapp\n template:\n metadata:\n labels:\n app: myapp\n spec:\n containers:\n - name: myapp\n image: myregistry\/myapp:latest\n ports:\n - name: http\n containerPort: 5000<\/code><\/pre>\n\uc704 YAML \ud30c\uc77c\uc5d0\uc11c\ub294 myapp\uc774\ub77c\ub294 \uc774\ub984\uc758 Deployment \ub9ac\uc18c\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc788\ub2e4. \uc774 \ub9ac\uc18c\uc2a4\ub294 3\uac1c\uc758 Pod\ub97c \uc0dd\uc131\ud558\uc5ec Flask \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubc30\ud3ec\ud55c\ub2e4. Pod\ub294 app: myapp<\/code> \ub77c\ubca8\uc744 \uac00\uc9c0\uace0 \uc788\uc5b4\uc57c \ud558\uba70, \uac01\uac01\uc758 Pod\ub294 myapp\uc774\ub77c\ub294 \uc774\ub984\uc758 \ucee8\ud14c\uc774\ub108\ub97c \uc2e4\ud589\ud55c\ub2e4.<\/p>\n
\uc774\uc81c \ub2e4\uc74c\uacfc \uac19\uc740 \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud558\uc5ec Deployment \ub9ac\uc18c\uc2a4\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n
kubectl apply -f deployment.yaml<\/code><\/pre>\n\ub2e4\uc74c\uc73c\ub85c, Service \ub9ac\uc18c\uc2a4\ub97c \uc774\uc6a9\ud558\uc5ec \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\uc790. Service \ub9ac\uc18c\uc2a4\ub294 Deployment \ub9ac\uc18c\uc2a4\uc640 \ud568\uaed8 \uc0ac\uc6a9\ub418\uba70, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \ub2e4\uc74c\uc740 Flask \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc704\ud55c Service \ub9ac\uc18c\uc2a4\uc758 \uc608\uc2dc\uc774\ub2e4.<\/p>\n
apiVersion: v1\nkind: Service\nmetadata:\n name: myapp\nspec:\n selector:\n app: myapp\n ports:\n - name: http\n port: 80\n targetPort: http\n type: LoadBalancer<\/code><\/pre>\n\uc704 YAML \ud30c\uc77c\uc5d0\uc11c\ub294 myapp\uc774\ub77c\ub294 \uc774\ub984\uc758 Service \ub9ac\uc18c\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc788\ub2e4. \uc774 \ub9ac\uc18c\uc2a4\ub294 app: myapp<\/code> \ub77c\ubca8\uc744 \uac00\uc9c4 Pod\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\uba70, 80\ubc88 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n
\uc774\uc81c \ub2e4\uc74c\uacfc \uac19\uc740 \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud558\uc5ec Service \ub9ac\uc18c\uc2a4\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n
kubectl apply -f service.yaml<\/code><\/pre>\n\uc774\uc81c \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c http:\/\/<\/code>\ub97c \uc5f4\uc5b4\uc11c Flask \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc2e4\ud589\ub418\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. “\ub294 Service \ub9ac\uc18c\uc2a4\ub97c \uc0dd\uc131\ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ud560\ub2f9\ub41c \uc678\ubd80 IP \uc8fc\uc18c\uc774\ub2e4.<\/p>\n
\uacb0\ub860<\/h2>\n\uc774\ubc88 \uae00\uc5d0\uc11c\ub294 \ub3c4\ucee4\uc640 \ucfe0\ubc84\ub124\ud2f0\uc2a4\ub97c \ud65c\uc6a9\ud558\uc5ec \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\ub97c \ucee8\ud14c\uc774\ub108\ud654\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uc558\ub2e4. \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\ub97c \ucee8\ud14c\uc774\ub108\ud654\ud558\uba74 \uc11c\ubc84 \uad6c\uc131\uc744 \uac04\uc18c\ud654\ud558\uace0, \uac1c\ubc1c, \ubc30\ud3ec, \uc6b4\uc601 \ud504\ub85c\uc138\uc2a4\ub97c \ube60\ub974\uace0 \ud6a8\uc728\uc801\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc904 \ubfd0\ub9cc \uc544\ub2c8\ub77c, \uc548\uc804\ud558\uac8c \uc11c\ube44\uc2a4\ub97c \uc6b4\uc601\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc900\ub2e4. \uc774\ub7ec\ud55c \uc774\uc810\ub4e4\uc744 \uace0\ub824\ud574\ubcf4\uba74, \ucee8\ud14c\uc774\ub108 \uae30\uc220\uc740 \ud604\ub300\uc801\uc778 \uc11c\ube44\uc2a4 \uc6b4\uc601\uc5d0 \uaf2d \ud544\uc694\ud55c \uae30\uc220 \uc911 \ud558\ub098\ub77c\uace0 \ud560 \uc218 \uc788\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"
\ub3c4\ucee4\uc640 \ucfe0\ubc84\ub124\ud2f0\uc2a4\ub97c \uc774\uc6a9\ud55c \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4 \ucee8\ud14c\uc774\ub108\ud654\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc30\ud3ec\uc640 \uad00\ub9ac\uc5d0 \uc788\uc5b4 \ub9e4\uc6b0 \uc720\uc6a9\ud558\ub2e4.<\/p>\n","protected":false},"author":1,"featured_media":12882,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[5898,2076,2105,6171,3724,2291,5979],"class_list":["post-39213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-backend","tag-from","tag-java","tag-msa","tag-python","tag-service","tag-5979"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/39213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/comments?post=39213"}],"version-history":[{"count":1,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/39213\/revisions"}],"predecessor-version":[{"id":39247,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/39213\/revisions\/39247"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media\/12882"}],"wp:attachment":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media?parent=39213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=39213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=39213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}