본문 바로가기
서버인프라/kubernetes

[제 2강] 컨테이너 생성을 조금더 깊이있게

by techwold ted 2022. 12. 16.

오늘은 컨테이너 생성 방법에 대해 좀더 심도 있게 생성해 보려 합니다.

지난 시간에는 kubectl run 하여 nginx컨테이너를 생성했는데요 이번 시간에는 같은 컨테이너 여러개 생성하기와 yaml 파일을 활용하여 컨테이너 생성 하는 법에 대해 알아 보려 합니다.

 

지난시간에 컨테이너 1개를 생성한게 있었는데 일단 삭제를 해보겠습니다.

컨테이너 삭제는 delete 명령어를 사용합니다.

# kubectl delete pods [pod name]
kubectl delete pods nginx

위와 같은 명령어로 삭제 할 경우도 있지만 우리가 만약 전체 다 삭제를 하는 경우가 발생 한다면 하나씩 삭제 할 수는 없겠죠?

그래서 이번에는 전체 삭제 하는 명령어도 한번 사용해 보겠습니다

kubectl delete pods --all

이렇게 하면 전체 pods가 삭제 됩니다 혹여 테스가 아닌 실제 망에 사용하시지 마세요~ 명령어가 단순해서 편할 수는 있지만 전체 삭제할 거라고 다시한번 확인 조차 하지 않고 삭제 합니다 그러니 테스트에서만 삭제하는 것으로~

 

이번에는 여러개의 nginx web pod를 만들어 보겠습니다.

1개 생성할때의 명령어와는 조금 다르죠? run 이라는 명령어를 사용했었는데 create라는 명령어가 새로 등장했습니다

거기에 deployment라는 녀석도 나왔구요 그리고 replicas라는 녀석도 나왔네요

create deployment 는 지정한 이름으로  그러니까 web이라는 이름으로 2개의 pod를 생성한다는 것입니다.

kubectl create deployment web --image=nginx:latest --replicas=2

저는 생성해 보니까 아래와 같이 생성이 됐네요. web-어떤 값 이렇게 생성이 되었고 node-2, node-1 로 분배되어 들어갔습니다.

여기서 궁금하지 않으세요 일단 포트를 지정하지 않았기 때문에 80 포트로 되어 있을거 같아요.

그리고 여기서 똑같은 명령어로 더 생성 하면 생성이 될 것인지, 생성이 된다면 포트는 어떻게 될 것인지. 우선 80 으로 되어 있는지 확인해 보겠습니다.

Containers:
  nginx:
    Container ID:   cri-o://9a6230db4ccc28005ad10e8b68ebdcbf180443a183f18a2429fb7ba73f627fda
    Image:          nginx:latest
    Image ID:       docker.io/library/nginx@sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Fri, 16 Dec 2022 11:57:07 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-v7f26 (ro)

오잉 port가 none네요 그럼 curl 명령어로 한번 생성된 pod를 호출 해 보겠습니다.

root@master:~# curl 192.168.84.140
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

호출해 봤더니 결과 값은 잘 나오네요 그럼 여기서 궁금증 생기는게 몇개 더 있습니다. 일단 위에서 했던 명령어로 2개더 만들어서 호출이 어떻게 되는지 까지 한번 확인해 봐야 할거 같아요. 일단 생성되지 않네요 web으로 구분을 해서 그런거 같습니다 그럼 다 지우고 4개를 만들어서 확인해 보도록 하겠습니다.

root@master:~# kubectl create deployment web --image=nginx:latest --replicas=2
error: failed to create deployment: deployments.apps "web" already exists

이렇게 하면 다들 error가 발생하실 거에요.. deploymenst의 동작 방식이 달라서 그런데.. 그럼 어떻게 추가하는 지 보겠습니다.

kubectl edit deployment.apps/web

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2022-12-16T03:35:49Z"
  generation: 2
  labels:
    app: web
  name: web
  namespace: default
  resourceVersion: "601847"
  uid: 7ef40082-3fc8-46c4-a941-87be252da7da
spec:
  progressDeadlineSeconds: 600
  replicas: 4 # 여기 2개 였을 건데 4로 바꿔 줍니다.
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: web
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

replicas: 부분을 수정해 주면 됩니다.

보시면 4개의 pod가 생성된 것을 보실 수 있어요. 그리고 삭제를 해보죠. replicas로 생성된 pod는 kubectl delete pod 해서 사용하면 지워지지 않을거에요 계속 살아날 겁니다. replication contoller가 계속 살릴거에요 그리너 replicas에 맞게 삭제 하면 됩니다.

kubectl delete deployment.apps/web

이렇게 삭제하시면 삭제된 pod를 확인 하실 수 있습니다.

 

이번에는 yaml 파일을 만들어서 pod를 생성해 보겠습니다. 다들 깨끗하게 지워져서 pod가 없는 상태겠죠?

우선 --dry-run 이라는 새로운 명령어가 나옵니다. 아래와 같이 명령어를 입력하면 yaml 형태로 출력 되는 것을 보실 수 있습니다. json으로 입렵하면 json형태로 출력됩니다 그럼 출력된 값을 가지고 pod를 생성해 보겠습니다.

root@master:~# kubectl run web1 --image=nginx:latest --dry-run --port=80 -o yaml
W1216 12:47:48.095581  321488 helpers.go:663] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: web1
  name: web1
spec:
  containers:
  - image: nginx:latest
    name: web1
    ports:
    - containerPort: 80
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
# nginx-web1.yaml 이란 파일을 만들어 줍니다.
kubectl run web1 --image=nginx:latest --dry-run --port=80 -o yaml > nginx-web1.yam

그리고 나서 nginx-web1.yaml을 실행 할 것 입니다.

kubectl create -f nginx-web1.yaml

1개의 생성된 pod가 보이시나요?

이런식으로 만들어서 생성 가능합니다. 그럼 우리가 사용한 --dry-run은 무엇이였을 까요. k8s 사이트에 가보면

--dry-run은 실제로 제출하지 않고 클러스터로 보낼 오브젝트를 미리 볼 수 있다.

라고 되어 있습니다. 그러니까 다시 얘기 하자면 사용될 오브젝트를 미리 출력만 하고 제출되지는 않는 것 입니다. 사용될 내용을 미리 가져와 내가 사용 하고 싶은 방향으로 사용 할 수 있게 해주는 것 이지요

 

오늘도 잘따라 오셨나요???

'서버인프라 > kubernetes' 카테고리의 다른 글

[제 4강] ReplicaSet  (0) 2022.12.21
[제 3강] Resource Management  (0) 2022.12.19
[제 1강] 쿠버네티스 명령어 사용 및 pod 생성  (0) 2022.12.14
쿠버네티스 설치  (0) 2022.12.13
쿠버네티스를 공부해요~  (6) 2022.12.12

댓글