Kubernetes/쿠버네티스 입문

쿠버네티스로 컨테이너 실행하기

막이86 2023. 11. 21. 19:46
728x90

쿠버네티스 입문을 요약한 내용입니다.

3.1 Kubectl

3.1.1 설치

3.1.2 기본 사용법

kubectl [command] [type] [name] [flags]
  • command: 자원에 실행하려는 동작, create, get, delete 등을 사용할 수 있습니다.
  • type: 자원 타입, pod, service, ingress 등을 사용할 수 있습니다.
  • name: 자원 이름
  • flag: 부가적으로 설정할 옵션을 입력

간단한 에코 서버를 동작시키는 예제 실습

  • echoserver 라는 이름의 파드를 하나 생성
  • $ kubectl run echoserver --generator=run-pod/v1 --image="k8s.gcr.id/echoserver:1.10" --port=8080 ## k8s v1.18 이후에서 생성하기 $ kubectl run echoserver --image="k8s.gcr.io/echoserver:1.10" --port=8080
  • 파드에 접근할 때 필요한 echoserver라는 이름의 서비스 생성
  • $ kubectl expose po echoserver --type=NodePort
  • echoserver 상태를 확인하기
    • NAME: 파드의 이름을 표시
    • READY: 파드의 준비 상태를 표시1/1이면 파드가 생성되었고 사용할 준비가 끝났다는 뜻
    • 0/1 이면 현재 파드는 생성되었으나 사용할 준비가 되지 않았다는 뜻
    • STATUS: 파드의 현재 상태를 표시Terminating: 컨테이너 접속 중
    • ContainerCreating: 컨테이너 생성 중
    • Running: 파드가 실행 중
    • RESTARTS: 해당 파드가 몇 번 재시작했는지를 표시
    • AGE: 파드를 생성한 후 얼마나 시간이 지났는지 표시
  • $ kubectl get pods NAME READY STATUS RESTARTS AGE echoserver 1/1 Running 0 7m40s my-nginx-pod 1/1 Running 2 3d20h
  • 서비스 실행 상태 확인
    • NAME: 서비스의 이름 표시
    • TYPE: 서비스 타입
    • CLUSTER-IP: 현재 클러스터 안에서 사용된는 IP
    • EXTERNAL-IP: 클러스터 외부에서 접속할 때 사용하는 IP로 현재는 별도로 생성하지 않았으므로 <none>
    • PORT(S): 해당 서비스에 접속하는 포트 표시
    • AGE: 자원을 생성한 후 얼마나 시간이 지났는지 표시
    <aside> ⚠️ kubernetes 서비스는 kube-apiserver 관련 파드들을 가르킴
  • </aside>
  • $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echoserver NodePort 10.105.134.81 <none> 8080:30183/TCP 5m42s kubernetes ClusterIP 10.96.0.1 <none>
  • echoserver에 접근할 수 있도록 로컬 컴퓨터로 포트포워딩
  • $ kubectl port-forward svc/echoserver 8080:8080 Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080 Handling connection for 8080 Handling connection for 8080
  • http://localhost:8080/ 접속
  • !https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bd041e5f-e043-49e4-9b19-3d6da4333694/_2021-06-18__2.58.59.png
  • 다른 셸을 추가하여 curl http://localhost:8080 명령 실행
  • $ curl <http://localhost:8080> Hostname: echoserver Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=127.0.0.1 method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=http://localhost:8080/ Request Headers: accept=*/* host=localhost:8080 user-agent=curl/7.64.1 Request Body: -no body in request-
  • echoserver의 실행 중 로그를 수집할 때는 kubectl logs -f 파드 이름 명령 실행
    • 시간, HTTP 버전, 웹 브라우져와 운영체제 버전 등의 정보를 알 수 있음
    $ kubectl logs -f echoserver
    Generating self-signed cert
    Generating a 2048 bit RSA private key
    .................................................................................................................................+++
    ....................................................................................................................................+++
    writing new private key to '/certs/privateKey.key'
    -----
    Starting nginx
    127.0.0.1 - - [18/Jun/2021:05:54:27 +0000] "GET / HTTP/1.1" 200 1129 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36"
    127.0.0.1 - - [18/Jun/2021:05:54:27 +0000] "GET /favicon.ico HTTP/1.1" 200 1083 "<http://localhost:8080/>" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36"
    127.0.0.1 - - [18/Jun/2021:06:01:39 +0000] "GET / HTTP/1.1" 200 416 "-" "curl/7.64.1"
    
  • 실습했던 파드 삭제 kubectl delete pod 파드 이름
  • $ kubectl delete pod echoserver pod "echoserver" deleted
  • 실습했던 서비스 삭제 kubectl delete service 서비스 이름
  • $ kubectl delete service echoserver service "echoserver" deleted

3.1.3 POSIX/GUN 스타일의 명령 작성 규칙

  • kubectl은 기본적으로 POSIX/GNU 스타일의 명령 작성 규칙을 따름
    • -과 함께 사용하는 옵션은 다일 알파벳/숫자 문자 인자는 짧은 옵션
    • 일부 옵션은 이자를 필요로 함
    • —과 함께 사용하는 옵션은 알파벳 두 글자 이상으로 구성한 긴 옵션
    • — 이후에 작성하는 인자가 있다면 쿠버네티스 관련 옵션들을 모두 옵션을 종료???
$ kubectl -n default exec my-pod -c my-container -- ls /
  • -n default: -n 네임스페이스를 지정하는 옵션
    • 짧은 옵션은 -n, 긴 옵션은 —namespace
    • default는 default 네임스페이스를 뜻함
  • exec my-pod: my-pod라는 이름의 파드에 해당 명력을 실행(필수 인자)
  • -c my-container: 컨테이너를 지정하는 옵션
    • 짧은 옵션은 -c, 긴 옵션은 —containe
    • 파드 안에 여러 개 컨테이너가 실행되었을 때 특정 컨테이너를 지정
  • — ls /: 쿠버네티스 관련 옵션들을 모두 종료한다는 뜻
    • — 이후 컨테이너에서 실행할 명령을 설정 할 수 있음

3.1.4 플래그

  • kubectl은 플래그는 모든 명령에서 사용할 수 있는 전역 플래그와 개별 명령에서만 사용할 수 있는 개별 플래그로 구분
  • 전역 플래그는 kubectl options, 명령별 플래그는 명력 각각의 도움마에서 확인
    • -h(—help): kubectl [command] —help 형태로 사용
    • -v [log level]: 명령을 실행하는 과정의 로그를 출력하거나 로그 래벨을 설정

3.1.5 Kubeconfig 환경 변수

  • kubectl은 기본적으로 $HOME/.kube/config 파일에서 클러스터, 인증, 컨텍스트 정보를 읽음
  • 클러스터 구성 정보를 kubeconfig라고 칭함
  • 클러스터에서 사용할 수 있는 자원들은 kubectl api-resources 명령으로 확인 가능
    • SHORTNAMES: 자원의 단축 이름
    • APIGROUP: 함께 노출되는 자원 집합
    • NAMESPACED: 특정 네임스페이스에 속하는 지원인지
    • KIND: 객체 스키마
    • —kubeconfig 옵션으로 다른 설정 파일을 지정 할 수 있음
      • 다중 클러스터에 다른 인증/클러스터 정보로 접근할때 사용
      $ kubectl -kubeconfig-AWSconfig get pods
      $ kubectl -kubeconfig-GCPconfig get pods 
      
    3.1.6 자동 완성
    • kubectl 은 bash, Z 셸에서의 자동 완성을 공식적으로 지원
    • # bash 셸 echo `source <(kubectl completion bash)` >>~/.bashrc # Z 셸 echo `source <(kubectl compleion zsh)` >>~/.zshrc
    3.1.7 다양한 사용 예
    • kubectl은 단순히 명령을 실행하는 것뿐만 아니라, 셸 스크립트의 일부분으로 사용하여 클러스터의 많은 동작을 자동화 할수 있습니다.
    • 클러스터 노드들의 내부 IP 정보를 얻을 수 있다.
    • $ kubectl get nodes -o wide --no-headers | awk '{print $6}' 192.168.65.4
    • 명령의 출력 결과를 JSON 포멧으로 지정하고 json 파일을 다루는데 유요한 jq를 이요해서 원하는 값을 얻을 수 있다.(단, jq가 설치되어 있어야함)<aside> ❓ 잘 안됨...
    • </aside>
    • kubectl get nodes -o json | jq -r '.items[].status.addresses[] | select(.type=="InternalIP") | .address)'
    • JSON 템플릿으로 지정하기<aside> ❓ 잘 안됨...
    • </aside>
    • kubectl get nodes -o jsonpath='.items[].status.addresses[] | select(.type=="InternalIP") | .address)'
$ kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume
pods                              po           v1                                     true         Pod
podtemplates                                   v1                                     true         PodTemplate
replicationcontrollers            rc           v1                                     true         ReplicationController
resourcequotas                    quota        v1                                     true         ResourceQuota
secrets                                        v1                                     true         Secret
serviceaccounts                   sa           v1                                     true         ServiceAccount
services                          svc          v1                                     true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io/v1        false        MutatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io/v1        false        ValidatingWebhookConfiguration
customresourcedefinitions         crd,crds     apiextensions.k8s.io/v1                false        CustomResourceDefinition
apiservices                                    apiregistration.k8s.io/v1              false        APIService
controllerrevisions                            apps/v1                                true         ControllerRevision
daemonsets                        ds           apps/v1                                true         DaemonSet
deployments                       deploy       apps/v1                                true         Deployment
replicasets                       rs           apps/v1                                true         ReplicaSet
statefulsets                      sts          apps/v1                                true         StatefulSet
tokenreviews                                   authentication.k8s.io/v1               false        TokenReview
localsubjectaccessreviews                      authorization.k8s.io/v1                true         LocalSubjectAccessReview
selfsubjectaccessreviews                       authorization.k8s.io/v1                false        SelfSubjectAccessReview
selfsubjectrulesreviews                        authorization.k8s.io/v1                false        SelfSubjectRulesReview
subjectaccessreviews                           authorization.k8s.io/v1                false        SubjectAccessReview
horizontalpodautoscalers          hpa          autoscaling/v1                         true         HorizontalPodAutoscaler
cronjobs                          cj           batch/v1                               true         CronJob
jobs                                           batch/v1                               true         Job
certificatesigningrequests        csr          certificates.k8s.io/v1                 false        CertificateSigningRequest
leases                                         coordination.k8s.io/v1                 true         Lease
endpointslices                                 discovery.k8s.io/v1                    true         EndpointSlice
events                            ev           events.k8s.io/v1                       true         Event
ingresses                         ing          extensions/v1beta1                     true         Ingress
flowschemas                                    flowcontrol.apiserver.k8s.io/v1beta1   false        FlowSchema
prioritylevelconfigurations                    flowcontrol.apiserver.k8s.io/v1beta1   false        PriorityLevelConfiguration
ingressclasses                                 networking.k8s.io/v1                   false        IngressClass
ingresses                         ing          networking.k8s.io/v1                   true         Ingress
networkpolicies                   netpol       networking.k8s.io/v1                   true         NetworkPolicy
runtimeclasses                                 node.k8s.io/v1                         false        RuntimeClass
poddisruptionbudgets              pdb          policy/v1                              true         PodDisruptionBudget
podsecuritypolicies               psp          policy/v1beta1                         false        PodSecurityPolicy
clusterrolebindings                            rbac.authorization.k8s.io/v1           false        ClusterRoleBinding
clusterroles                                   rbac.authorization.k8s.io/v1           false        ClusterRole
rolebindings                                   rbac.authorization.k8s.io/v1           true         RoleBinding
roles                                          rbac.authorization.k8s.io/v1           true         Role
priorityclasses                   pc           scheduling.k8s.io/v1                   false        PriorityClass
csidrivers                                     storage.k8s.io/v1                      false        CSIDriver
csinodes                                       storage.k8s.io/v1                      false        CSINode
csistoragecapacities                           storage.k8s.io/v1beta1                 true         CSIStorageCapacity
storageclasses                    sc           storage.k8s.io/v1                      false        StorageClass
volumeattachments                              storage.k8s.io/v1                      false        VolumeAttachment

3.2 디플로이먼트를 이용해 컨테이너 실행하기

  • 쿠버네티스를 이용해 컨테이너를 실행하는 방법은 크게 2가지가 있음
    • kubectl run 명령으로 직접 컨테이너를 실행
    • 템플릿으로 컨테이너를 실행
      • YAML 형식으로 되어 있어 버전 관리가 되는 장점이 있음

3.2.1 kubectl run으로 컨테이너 실행하기

  • 디플로이먼트를 사용해 nginx 컨테이너 실행
    • kubectl run 명령 다음에 생성하려는 디플로이먼트 이름을 입력
    • —image 옵션에 실행한 컨테이너 이미지 입력
    • —port 옵션은 해당 컨테이너가 사용할 포트
  • $ kubectl run nginx-app --image nginx --port=80 pod/nginx-app created # 아래 명령이 맞는거 아닌가? $ kubectl create deployment nginx-app --image=nginx
  • nginx 컨테이너가 제대로 실행 됬는지 확인
  • $ kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-pod 1/1 Running 82 146d nginx-app 1/1 Running 0 17m nginx-app-d6ff45774-8x4jp 1/1 Running 0 32s
  • 디플로이먼트 상태를 확인
  • $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx-app 1/1 1 1 74s # 네임스페이스를 지정하지 않고 전부 보기 $ kubectl get deployments --all-namespaces NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE ingress-nginx ingress-nginx-controller 1/1 1 1 143d kube-system coredns 2/2 2 2 149d
  • 디플로이먼트를 이용해 실행 중인 파드 갯수를 늘리기
  • $ kubectl scale deploy nginx-app --replicas=2 deployment.apps/nginx-app scaled
  • 파드 갯수 확인
  • $ kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-pod 1/1 Running 82 146d nginx-app 1/1 Running 0 20m nginx-app-d6ff45774-8x4jp 1/1 Running 0 3m4s nginx-app-d6ff45774-gj5vw 1/1 Running 0 64s
  • 디플로이먼트 확인
  • $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx-app 2/2 2 2 4m52s
  • 디플로이먼트 삭제
  • $ kubectl delete deployment nginx-app deployment.apps "nginx-app" deleted

3.2.2 템플릿으로 컨테이너 실행하기

  • 디플로이먼트 설정이 담긴 템플릿(yaml 파일)로 컨테이너를 실행하는 방법
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginx-app
        image: nginx
        ports:
        - containerPort: 80
  • 실행
$ kubectl apply -f nginx-app.yaml
deployment.apps/nginx-app created
  • 상태 확인
$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
nginx-app-6b4fc78cbf-qhtk9   1/1     Running   0          13m

$ kubectl get deployments
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-app   1/1     1            1           13m



3.3 클러스터 외부에서 클러스터 안 앱에 접근하기

  • nginx-app을 80포트로 설정하고 실행하였지만 localhost에서 접속하면 사이트에 연결할 수 없다는 메시지만 볼수 있을 뿐이다.
  • 쿠버네티스 내부에서 사용하는 네트워크가 분리가 되어 있어 외부에서 접근하려고 하면 쿠버네티스의 서비스를 사용해야함
  • 서비스 타입에는 ClusterIP, NodePort, LoadBalancer, ExteralName이 있음
  • 서비스 하나에 모든 노드의 지정된 포트를 할당하는 NodePort를 설정
$ kubectl expose deployment nginx-app --type=NodePort
service/nginx-app exposed
  • 서비스 확인
    • 80:32592/TCP 쿠버네티스 내부의 80포트가 32592라는 외부 포트와 연결되어 있다는 뜻
$ kubectl get service                                
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
echoserver   NodePort    10.104.85.191   <none>        8080:31031/TCP   101m
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          149d
nginx-app    NodePort    10.99.85.244    <none>        80:32592/TCP     95s
  • 컨테이너 명령으로 좀더 상세한 내용을 확인 할 수 있다.
$ kubectl describe service
Name:                     nginx-app
Namespace:                default
Labels:                   app=nginx-app
Annotations:              <none>
Selector:                 app=nginx-app
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.99.85.244
IPs:                      10.99.85.244
LoadBalancer Ingress:     localhost
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32592/TCP
Endpoints:                10.1.1.224:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

728x90

'Kubernetes > 쿠버네티스 입문' 카테고리의 다른 글

쿠버네티스 설치하기  (1) 2023.11.21
쿠버네티스 소개  (0) 2023.11.21