-
[쿠버네티스] 학습/요약 - 디플로이먼트 생성하기SW 개발/쿠버네티스 2021. 9. 9. 23:34
쿠버네티스 클러스터에 애플리케이션을 배포하려면 Deployment 설정을 만들어야 한다. Deployment가 만들어지면 Control plane이 Deployment에 명시된 애플리케이션 인스턴스가 클러스터의 노드에서 실행되도록 스케쥴한다.
애플리케이션 인스턴스가 생성되면, 쿠버네티스 Deployment 컨트롤러가 지속적으로 인스턴스를 모니터링한다. 인스턴스를 구동중인 노드가 다운되거나 삭제되면, Deployment 컨트롤러가 다른 노드의 인스턴스로 교체시켜준다. (self-healing)
kubectl CLI 명령으로 Deployment를 생성하고 관리할 수 있다. Kubectl은 쿠버네티스 API를 통해 클러스터와 상호작용한다. Deployment 에는 애플리케이션의 컨테이너 이미지와 복제 수를 지정해야한다.
[실습] kubernetes-bootcamp라는 이름으로 deployment 를 만든다.
$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 deployment.apps/kubernetes-bootcamp created
- application이 실행 가능한 node를 찾는다
- application 이 node에서 실행되도록 스케쥴한다
- 필요하면 새로운 노드에 재스케쥴되도록 cluster를 환경설정한다.
deployment를 확인한다.
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1/1 1 1 3m25s
앱을 외부로 노출해야한다. pods들은 kubernetes 내부의 private하게 격리된 네트워크에서 동작한다. 같은 cluster내의 다른 pods와 services에게는 보이지만, 밖에선 보이지 않는다. kubectl 명령으로 cluster 내부로 통신을 전달하는 proxy를 만들 수 있다.
$ kubectl proxy Starting to serve on 127.0.0.1:8001
proxy를 만들고나면, API 통신이 가능해진다. 이 API 서버는 각 pod에 자동적으로 생성되고, pod 이름으로 접근가능하다.
$ curl http://localhost:8001/version { "major": "1", "minor": "20", "gitVersion": "v1.20.2", "gitCommit": "faecb196815e248d3ecfb03c680a4507229c2a56", "gitTreeState": "clean", "buildDate": "2021-01-13T13:20:00Z", "goVersion": "go1.15.5", "compiler": "gc", "platform": "linux/amd64" }
kubectl get pods 결과에서 template 옵션을 사용해서 이름을 뽑아낸다. (신기하고 복잡한 명령어)
$ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetest-bootcamp-84c57fff94-k4wb8 1/1 Running 0 20m $ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.meadata.name}}{{"\n"}}{{end}}') $ echo Name of the Pod: $POD_NAME Name of the Pod: kubernetes-bootcamp-84c57fff94-k4wb8
이름을 가지고 해당 pod에게 API 통신을 시도한다.
pod에 대한 여러가지 다양한 정보가 나온다.
모두 이해하면 좋겠지만, 일단 대략 훑고 넘어가는게 정신건강에 좋을 것 같다.
결과 json이 너무 길니 줄여서 보도록 하자.전체가 보고 싶으면 펼쳐서 보길...
더보기$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/ { "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "kubernetes-bootcamp-84c57fff94-k4wb8", "generateName": "kubernetes-bootcamp-84c57fff94-", "namespace": "default", "uid": "335027cd-d300-4c11-87df-96a767e8c9a3", "resourceVersion": "638", "creationTimestamp": "2021-09-09T14:07:52Z", "labels": { "app": "kubernetes-bootcamp", "pod-template-hash": "84c57fff94" }, "ownerReferences": [ { "apiVersion": "apps/v1", "kind": "ReplicaSet", "name": "kubernetes-bootcamp-84c57fff94", "uid": "c5694700-448f-4f1e-b279-2e21b87fa3d7", "controller": true, "blockOwnerDeletion": true } ], "managedFields": [ { "manager": "kube-controller-manager", "operation": "Update", "apiVersion": "v1", "time": "2021-09-09T14:07:52Z", "fieldsType": "FieldsV1", "fieldsV1": {"f:metadata":{"f:generateName":{},"f:labels":{".":{},"f:app":{},"f:pod-template-hash":{}},"f:ownerReferences":{".":{},"k:{\"uid\":\"c5694700-448f-4f1e-b279-2e21b87fa3d7\"}":{".":{},"f:apiVersion":{},"f:blockOwnerDeletion":{},"f:controller":{},"f:kind":{},"f:name":{},"f:uid":{}}}},"f:spec":{"f:containers":{"k:{\"name\":\"kubernetes-bootcamp\"}":{".":{},"f:image":{},"f:imagePullPolicy":{},"f:name":{},"f:resources":{},"f:terminationMessagePath":{},"f:terminationMessagePolicy":{}}},"f:dnsPolicy":{},"f:enableServiceLinks":{},"f:restartPolicy":{},"f:schedulerName":{},"f:securityContext":{},"f:terminationGracePeriodSeconds":{}}} }, { "manager": "kubelet", "operation": "Update", "apiVersion": "v1", "time": "2021-09-09T14:07:56Z", "fieldsType": "FieldsV1", "fieldsV1": {"f:status":{"f:conditions":{"k:{\"type\":\"ContainersReady\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Initialized\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Ready\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{}}},"f:containerStatuses":{},"f:hostIP":{},"f:phase":{},"f:podIP":{},"f:podIPs":{".":{},"k:{\"ip\":\"172.18.0.6\"}":{".":{},"f:ip":{}}},"f:startTime":{}}} } ] }, "spec": { "volumes": [ { "name": "default-token-glmbl", "secret": { "secretName": "default-token-glmbl", "defaultMode": 420 } } ], "containers": [ { "name": "kubernetes-bootcamp", "image": "gcr.io/google-samples/kubernetes-bootcamp:v1", "resources": { }, "volumeMounts": [ { "name": "default-token-glmbl", "readOnly": true, "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" } ], "terminationMessagePath": "/dev/termination-log", "terminationMessagePolicy": "File", "imagePullPolicy": "IfNotPresent" } ], "restartPolicy": "Always", "terminationGracePeriodSeconds": 30, "dnsPolicy": "ClusterFirst", "serviceAccountName": "default", "serviceAccount": "default", "nodeName": "minikube", "securityContext": { }, "schedulerName": "default-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", "operator": "Exists", "effect": "NoExecute", "tolerationSeconds": 300 }, { "key": "node.kubernetes.io/unreachable", "operator": "Exists", "effect": "NoExecute", "tolerationSeconds": 300 } ], "priority": 0, "enableServiceLinks": true, "preemptionPolicy": "PreemptLowerPriority" }, "status": { "phase": "Running", "conditions": [ { "type": "Initialized", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2021-09-09T14:07:53Z" }, { "type": "Ready", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2021-09-09T14:07:56Z" }, { "type": "ContainersReady", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2021-09-09T14:07:56Z" }, { "type": "PodScheduled", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2021-09-09T14:07:53Z" } ], "hostIP": "172.17.0.108", "podIP": "172.18.0.6", "podIPs": [ { "ip": "172.18.0.6" } ], "startTime": "2021-09-09T14:07:53Z", "containerStatuses": [ { "name": "kubernetes-bootcamp", "state": { "running": { "startedAt": "2021-09-09T14:07:55Z" } }, "lastState": { }, "ready": true, "restartCount": 0, "image": "jocatalin/kubernetes-bootcamp:v1", "imageID": "docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af", "containerID": "docker://fb154c802981b16e5adc576eec65cd2bc7b7ea175a3f396ecf6a5ce4a258260a", "started": true } ], "qosClass": "BestEffort" } }
'SW 개발 > 쿠버네티스' 카테고리의 다른 글
[쿠버네티스] 모듈3 - Explore your app 튜토리얼 요약 (0) 2021.09.15 [쿠버네티스] 파드 Pod 와 노드 Node (1) 2021.09.15 [쿠버네티스] 튜토리얼 요약 - 클러스터 생성하기 (0) 2021.09.09 [쿠버네티스] 개념 학습/요약 - 클러스터, 노드, 컨트롤 플레인 (0) 2021.09.09