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

[제 1강] 쿠버네티스 명령어 사용 및 pod 생성

by techwold ted 2022. 12. 14.

오늘은 쿠버네티스 명령어에 익숙해지기 위해서 몇가지 명령을 학습해 보고, 컨터이너를 만들어서 잘 동작 하는지 확인해 보는 작업을 해보기로 하겠습니다.

 

1. node 확인

  • 쿠버네티스에 join되어 있는 노드를 확인 하는 방법을 확인해 보겠습니다
  • 아래와 같이 간단하게 한줄의 명령어로 확인 할 수 있습니다.
root@master:~# kubectl get nodes
NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   2d13h   v1.26.0
node-1   Ready    <none>          2d13h   v1.26.0
node-2   Ready    <none>          2d13h   v1.26.0

헌데 조금 부족한 내용입니다. 아이피도 확인이 안되고 OS 확인도 안되고 아주 간략한 정보만 제공 합니다. 그럼 조금더 많은 정보를 보기위한 명령어를 살펴보겠습니다. -o wide라고 추가해서 입력하면 아래와 같이 CONTAINER-RUNTIME 정보 IP, OS-IMAGE 등 많은 정보들이 더 보이게 됩니다.

root@master:~# kubectl get nodes -o wide
NAME     STATUS   ROLES           AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
master   Ready    control-plane   2d13h   v1.26.0   10.0.1.180    <none>        Ubuntu 20.04.5 LTS   5.4.0-135-generic   cri-o://1.25.1
node-1   Ready    <none>          2d13h   v1.26.0   10.0.1.181    <none>        Ubuntu 20.04.5 LTS   5.4.0-135-generic   cri-o://1.25.1
node-2   Ready    <none>          2d13h   v1.26.0   10.0.1.182    <none>        Ubuntu 20.04.5 LTS   5.4.0-135-generic   cri-o://1.25.1

하지만 우린 이거보다 더 많은 정보를 확인해야 할 경우도 있습니다.

kubectl get nodes master -o yaml
kubectl get nodes master -o json

위 명령어 내용은 너무 길어서 첨부하지 않겠습니다. 다들 한번씩 명령어를 사용해 보신다면 어렵지 않다는 것을 이해하실 수 있습니다.

그럼 이제 pod 하나를 만들어 보도록 하겠습니다.

root@master:~# kubectl run nginx-web-1 --image=nginx --port 8081
pod/nginx-web-1 created

잘 실행 되었다고 나오네요 그럼 이제 잘 생성 되었는지 확인하는 pod 확인 명령어를 실행해 보겠습니다.

위에서 node 확인할때와 비슷하죠? -o wide 를 사용하면 pod 역시 조금더 많은 정보를 확인할 수 있습니다. 그리고 pod 역시 yaml, json으로 확인 가능 합니다.

root@master:~# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
nginx-web-1   1/1     Running   0          58s
root@master:~# kubectl get pod -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nginx-web-1   1/1     Running   0          62s   192.168.247.14   node-2   <none>           <none>

아래와 같은 명령어로 yaml형태의 정보를 확인 할 수 있습니다.

root@master:~# kubectl get pod nginx-web-1 -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/containerID: a19683974f805708bc5e39a7339bd6ff742a7094cf125fee580ad0c4c4eb4696
    cni.projectcalico.org/podIP: 192.168.247.14/32
    cni.projectcalico.org/podIPs: 192.168.247.14/32
  creationTimestamp: "2022-12-14T02:44:23Z"
  labels:
    run: nginx-web-1
  name: nginx-web-1
  namespace: default
  resourceVersion: "336944"
  uid: 88b075fc-b7d0-47e6-b9c3-79b5b920d2c0
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx-web-1
    ports:
    - containerPort: 8081
      protocol: TCP
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-d6lxd
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: node-2
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-d6lxd
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2022-12-14T02:44:23Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2022-12-14T02:44:34Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2022-12-14T02:44:34Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2022-12-14T02:44:23Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: cri-o://aa2ad8432fab43cf578cad2a6d1ca87fbe5e4fe95674423c4d73ad2367d9b626
    image: docker.io/library/nginx:latest
    imageID: docker.io/library/nginx@sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3
    lastState: {}
    name: nginx-web-1
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2022-12-14T02:44:33Z"
  hostIP: 10.0.1.182
  phase: Running
  podIP: 192.168.247.14
  podIPs:
  - ip: 192.168.247.14
  qosClass: BestEffort
  startTime: "2022-12-14T02:44:23Z"

정말 많은 정보가 나오죠? 나중에 저 정보를 활용해서 yaml 파일을 만들어 보겠습니다.

그럼 이 많은 정보들을 이렇게 보는게 힘들고, 우리는 보고 싶은 정보만 보고 싶을 때도 있으니 아래와 같은 명령어로 확인해 보겠습니다

우선 jq 를 설치 해서 사용해 보도록 하겠습니다

apt install -y jq
get pod nginx-web-1 -o json
{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "annotations": {
            "cni.projectcalico.org/containerID": "a19683974f805708bc5e39a7339bd6ff742a7094cf125fee580ad0c4c4eb4696",
            "cni.projectcalico.org/podIP": "192.168.247.14/32",
            "cni.projectcalico.org/podIPs": "192.168.247.14/32"
        },
        "creationTimestamp": "2022-12-14T02:44:23Z",
        "labels": {
            "run": "nginx-web-1"
        },
        "name": "nginx-web-1",
        "namespace": "default",
        "resourceVersion": "336944",
        "uid": "88b075fc-b7d0-47e6-b9c3-79b5b920d2c0"
    },
    "spec": {
        "containers": [
            {
                "image": "nginx",
                "imagePullPolicy": "Always",
                "name": "nginx-web-1",
                "ports": [
                    {
                        "containerPort": 8081,
                        "protocol": "TCP"
                    }
                ],
                "resources": {},
                "terminationMessagePath": "/dev/termination-log",
                "terminationMessagePolicy": "File",
                "volumeMounts": [
                    {
                        "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
                        "name": "kube-api-access-d6lxd",
                        "readOnly": true
                    }
                ]
            }
        ],
        "dnsPolicy": "ClusterFirst",
        "enableServiceLinks": true,
        "nodeName": "node-2",
        "preemptionPolicy": "PreemptLowerPriority",
        "priority": 0,
        "restartPolicy": "Always",
        "schedulerName": "default-scheduler",
        "securityContext": {},
        "serviceAccount": "default",
        "serviceAccountName": "default",
        "terminationGracePeriodSeconds": 30,
        "tolerations": [
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/not-ready",
                "operator": "Exists",
                "tolerationSeconds": 300
            },
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/unreachable",
                "operator": "Exists",
                "tolerationSeconds": 300
            }
        ],
        "volumes": [
            {
                "name": "kube-api-access-d6lxd",
                "projected": {
                    "defaultMode": 420,
                    "sources": [
                        {
                            "serviceAccountToken": {
                                "expirationSeconds": 3607,
                                "path": "token"
                            }
                        },
                        {
                            "configMap": {
                                "items": [
                                    {
                                        "key": "ca.crt",
                                        "path": "ca.crt"
                                    }
                                ],
                                "name": "kube-root-ca.crt"
                            }
                        },
                        {
                            "downwardAPI": {
                                "items": [
                                    {
                                        "fieldRef": {
                                            "apiVersion": "v1",
                                            "fieldPath": "metadata.namespace"
                                        },
                                        "path": "namespace"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        ]
    },
    "status": {
        "conditions": [
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2022-12-14T02:44:23Z",
                "status": "True",
                "type": "Initialized"
            },
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2022-12-14T02:44:34Z",
                "status": "True",
                "type": "Ready"
            },
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2022-12-14T02:44:34Z",
                "status": "True",
                "type": "ContainersReady"
            },
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2022-12-14T02:44:23Z",
                "status": "True",
                "type": "PodScheduled"
            }
        ],
        "containerStatuses": [
            {
                "containerID": "cri-o://aa2ad8432fab43cf578cad2a6d1ca87fbe5e4fe95674423c4d73ad2367d9b626",
                "image": "docker.io/library/nginx:latest",
                "imageID": "docker.io/library/nginx@sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3",
                "lastState": {},
                "name": "nginx-web-1",
                "ready": true,
                "restartCount": 0,
                "started": true,
                "state": {
                    "running": {
                        "startedAt": "2022-12-14T02:44:33Z"
                    }
                }
            }
        ],
        "hostIP": "10.0.1.182",
        "phase": "Running",
        "podIP": "192.168.247.14",
        "podIPs": [
            {
                "ip": "192.168.247.14"
            }
        ],
        "qosClass": "BestEffort",
        "startTime": "2022-12-14T02:44:23Z"
    }
}

엄청 길죠? 우린 여기서 status안에 있는 containerStatuses정보 중 imageID의 값을 보려 합니다. 어떻게 사용하는지 확인해 봅시다.

root@master:~# kubectl get pod nginx-web-1 -o json | jq .status.containerStatuses
[
  {
    "containerID": "cri-o://aa2ad8432fab43cf578cad2a6d1ca87fbe5e4fe95674423c4d73ad2367d9b626",
    "image": "docker.io/library/nginx:latest",
    "imageID": "docker.io/library/nginx@sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3",
    "lastState": {},
    "name": "nginx-web-1",
    "ready": true,
    "restartCount": 0,
    "started": true,
    "state": {
      "running": {
        "startedAt": "2022-12-14T02:44:33Z"
      }
    }
  }
]
root@master:~# kubectl get pod nginx-web-1 -o json | jq .status.containerStatuses[].imageID
"docker.io/library/nginx@sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3"
root@master:~#

위와 같이 다들 나오셨나요.  위 내용을 잘 활용하시면 다양하게 확인 가능 합니다.

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

[제 4강] ReplicaSet  (0) 2022.12.21
[제 3강] Resource Management  (0) 2022.12.19
[제 2강] 컨테이너 생성을 조금더 깊이있게  (4) 2022.12.16
쿠버네티스 설치  (0) 2022.12.13
쿠버네티스를 공부해요~  (6) 2022.12.12

댓글