티스토리 뷰

1탄!! 쿠버네티스 구성준비/Master & Node

2탄!! 쿠버네티스와 컨테이너를 쉽게 이해하기

3탄!! Kubernetes 구성도 알아보자!

4탄!! NFS 설정입니다.

5탄!! helm install 방법

6탄 !! 도커 컴포즈 VS 쿠버네티스 컴포즈

7탄!! 쿠버네티스에 pod 올리자! pod? 뭐에요?

8탄!! K8S 대시보드 설치

9탄!! 쿠버네티스 오토스케일링(kubernetes autoscaling)

10탄!! K8S Namespace 생성방법

11탄!! 쿠버네티스 용어 정리

12탄!! 도커 깔끔히 삭제하기

# 부록!! 쿠버네티스 장애 처리5탄부록!! 쿠버네티스 장애 처리

#기타 참고하기  

마이크로 쿠버네티스 설치 해보기

쿠버네티스(컨테이너) 환경 구축의 어려운점~!

쿠버네티스(튜토리얼 실습)

쿠버네티스 초기설치및  볼트 디비 올리기[샘플]

헬름챠트로 올리기[샘플]11) 쿠버네티스 가상스토리지(Ceph) 설치

K8S Namespace 생성

 

Cluster 란, 물리 또는 가상 머신들이 묶여서 하나의 시스템처럼 동작하는 집합을 의미합니다.
물리 클러스터 안에서 논리적으로 하나의 시스템처럼 동작하는 집합을 Namespace 라고 합니다.

간단하게 테스트 해보기 위해 powershell 에서 진행 해봅니다.

1. dev.yaml  생성

apiVersion: v1
kind: Namespace
metadata:
  name: dev

kubectl apply -f dev.yaml


또는........ 아래와 같이...참 쉿죠잉~

kubectl create namespace dev
kubectl create namespace stg
kubectl create namespace prd

 



 

 

------------------------------------------------------------------------------------------------------------------------------

3. Namespace 확인

kubectl get namespace

kubectl get namespace 

 

사용자가 쿠버네티스를 사용할때는 명령어를 입력하고 이 명령어를 입력받은 apiserver가 해당 명령어를 수행한다.

기본적인 명령어 형식은 kubectl [COMMAND] [TYPE] {NAME] {FLAGS] 이다.



- COMMAND : create, get, describe 와 같은 operation 종류
- TYPE : pods, nodes 등의 타입 ( https://kubernetes.io/docs/reference/kubectl/overview/#resource-types 참고 )
- NAME : 특정 리소스의 이름 선언
- FLAGS : 추가적인 옵션 선언

******************

네임스페이스에 대한 메모리 및 CPU 쿼터 구성

이 페이지는 네임스페이스에서 실행 중인 모든 컨테이너가 사용할 수 있는 총 메모리 및 CPU 양에 대한 쿼터를 설정하는 방법을 보여준다. 리소스쿼터(ResourceQuota) 오브젝트에 쿼터를 지정한다.

 

버전 확인을 위해서, 다음 커맨드를 실행 kubectl version.

클러스터의 각 노드에는 최소 1GiB의 메모리가 있어야 한다.

 

네임스페이스 생성

이 연습에서 생성한 리소스가 클러스터의 나머지와 격리되도록 네임스페이스를 생성한다.

kubectl create namespace quota-mem-cpu-example

kubectl create namespace quota-mem-cpu-example

리소스쿼터 생성

다음은 리소스쿼터 오브젝트의 구성 파일이다.

quota-mem-cpu.yaml 

apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi

 

리소스쿼터를 생성한다.

kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example

리소스쿼터에 대한 자세한 정보를 본다.

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

 

리소스쿼터는 이러한 요구 사항을 quota-mem-cpu-example 네임스페이스에 배치한다.

  • 모든 컨테이너에는 메모리 요청량(request), 메모리 상한(limit), CPU 요청량 및 CPU 상한이 있어야 한다.
  • 모든 컨테이너에 대한 총 메모리 요청량은 1GiB를 초과하지 않아야 한다.
  • 모든 컨테이너에 대한 총 메모리 상한은 2GiB를 초과하지 않아야 한다.
  • 모든 컨테이너에 대한 총 CPU 요청량은 1 cpu를 초과해서는 안된다.
  • 모든 컨테이너에 대한 총 CPU 상한은 2 cpu를 초과해서는 안된다.

파드 생성

파드의 구성 파일은 다음과 같다.

quota-mem-cpu-pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo
spec:
  containers:
  - name: quota-mem-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
        cpu: "800m"
      requests:
        memory: "600Mi"
        cpu: "400m"

파드를 생성한다.

kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example

파드의 컨테이너가 실행 중인지 확인한다.

 

kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example

다시 한 번, 리소스쿼터에 대한 자세한 정보를 본다.

 

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

출력 결과는 쿼터와 사용된 쿼터를 함께 보여준다. 파드의 메모리와 CPU 요청량 및 상한이 쿼터를 초과하지 않은 것을 볼 수 있다.

status:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
  used:
    limits.cpu: 800m
    limits.memory: 800Mi
    requests.cpu: 400m
    requests.memory: 600Mi

두 번째 파드 생성 시도

다음은 두 번째 파드의 구성 파일이다.

quota-mem-cpu-pod-2.yaml 

 

apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo-2
spec:
  containers:
  - name: quota-mem-cpu-demo-2-ctr
    image: redis
    resources:
      limits:
        memory: "1Gi"
        cpu: "800m"
      requests:
        memory: "700Mi"
        cpu: "400m"

구성 파일에서, 파드의 메모리 요청량이 700MiB임을 알 수 있다. 사용된 메모리 요청량과 이 새 메모리 요청량의 합계가 메모리 요청량 쿼터를 초과한다. 600MiB + 700MiB > 1GiB

파드 생성을 시도한다.

kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example

두 번째 파드는 생성되지 않는다. 출력 결과는 두 번째 파드를 생성하면 메모리 요청량의 총 합계가 메모리 요청량 쿼터를 초과함을 보여준다.

Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml": pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi

토론

이 연습에서 보았듯이, 리소스쿼터를 사용하여 네임스페이스에서 실행 중인 모든 컨테이너에 대한 메모리 요청량의 총 합계를 제한할 수 있다. 메모리 상한, CPU 요청량 및 CPU 상한의 총 합계를 제한할 수도 있다.

모든 컨테이너에 대한 합계 대신 개별 컨테이너를 제한하려면, 리밋레인지(LimitRange)를 사용한다.

정리

네임스페이스를 삭제한다.

kubectl delete namespace quota-mem-cpu-example

 

***************

내가 생성한. 파드 

아 귀찮아 나중에 정리 하자 ㅠㅠ

Examples:
  # List all pods in ps output format.
  kubectl get pods

  # List all pods in ps output format with more information (such as node name).
  kubectl get pods -o wide

  # List a single replication controller with specified NAME in ps output format.
  kubectl get replicationcontroller web

  # List deployments in JSON output format, in the "v1" version of the "apps" API group:
  kubectl get deployments.v1.apps -o json

  # List a single pod in JSON output format.
  kubectl get -o json pod web-pod-13je7

  # List a pod identified by type and name specified in "pod.yaml" in JSON output format.
  kubectl get -f pod.yaml -o json

  # List resources from a directory with kustomization.yaml - e.g. dir/kustomization.yaml.
  kubectl get -k dir/

  # Return only the phase value of the specified pod.
  kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}}

  # List resource information in custom columns.
  kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image

  # List all replication controllers and services together in ps output format.
  kubectl get rc,services

  # List one or more resources by their type and names.
  kubectl get rc/web service/frontend pods/web-pod-13je7

Options:
  -A, --all-namespaces=false: If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.
      --allow-missing-template-keys=true: If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats.
      --chunk-size=500: Return large lists in chunks rather than all at once. Pass 0 to disable. This flag is beta and may change in the future.
      --field-selector='': Selector (field query) to filter on, supports '=', '==', and '!='.(e.g. --field-selector key1=value1,key2=value2). The server only supports a limited number of field queries per type.
  -f, --filename=[]: Filename, directory, or URL to files identifying the resource to get from a server.
      --ignore-not-found=false: If the requested object does not exist the command will return exit code 0.
  -k, --kustomize='': Process the kustomization directory. This flag can't be used together with -f or -R.
  -L, --label-columns=[]: Accepts a comma separated list of labels that are going to be presented as columns. Names are case-sensitive. You can also use multiple flag options like -L label1 -L label2...
      --no-headers=false: When using the default or custom-column output format, don't print headers (default print headers).
  -o, --output='': Output format. One of: json|yaml|wide|name|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See custom columns [http://kubernetes.io/docs/user-guide/kubectl-overview/#custom-columns], golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://kubernetes.io/docs/user-guide/jsonpath].
      --output-watch-events=false: Output watch event objects when --watch or --watch-only is used. Existing objects are output as initial ADDED events.
      --raw='': Raw URI to request from the server.  Uses the transport specified by the kubeconfig file.
  -R, --recursive=false: Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.
  -l, --selector='': Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
      --server-print=true: If true, have the server return the appropriate table output. Supports extension APIs and CRDs.
      --show-kind=false: If present, list the resource type for the requested object(s).
      --show-labels=false: When printing, show all labels as the last column (default hide labels column)
      --sort-by='': If non-empty, sort list types using this field specification.  The field specification is expressed as a JSONPath expression (e.g. '{.metadata.name}'). The field in the API resource specified by this JSONPath expression must be an integer or a string.
      --template='': Template string or path to template file to use when -o=go-template, -o=go-template-file. The template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].
  -w, --watch=false: After listing/getting the requested object, watch for changes. Uninitialized objects are excluded if no object name is provided.
      --watch-only=false: Watch for changes to the requested object(s), without listing/getting first.

Usage:
  kubectl get [(-o|--output=)json|yaml|wide|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags] [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

PS C:\Users\root> kubectl get pods -o wide --all-namespaces
NAMESPACE               NAME                                        READY   STATUS    RESTARTS   AGE    IP             NODE             NOMINATED NODE   READINESS GATES
docker                  compose-78f95d4f8c-pxcxp                    1/1     Running   0          3h     10.1.0.6       docker-desktop   <none>           <none>
docker                  compose-api-6ffb89dc58-fn55k                1/1     Running   0          3h     192.168.65.3   docker-desktop   <none>           <none>
kube-system             coredns-5644d7b6d9-4kx6g                    1/1     Running   0          3h1m   10.1.0.2       docker-desktop   <none>           <none>
kube-system             coredns-5644d7b6d9-hww77                    1/1     Running   0          3h1m   10.1.0.3       docker-desktop   <none>           <none>
kube-system             etcd-docker-desktop                         1/1     Running   0          3h     192.168.65.3   docker-desktop   <none>           <none>
kube-system             kube-apiserver-docker-desktop               1/1     Running   0          3h     192.168.65.3   docker-desktop   <none>           <none>
kube-system             kube-controller-manager-docker-desktop      1/1     Running   0          3h     192.168.65.3   docker-desktop   <none>           <none>
kube-system             kube-proxy-qfx2w                            1/1     Running   0          3h1m   192.168.65.3   docker-desktop   <none>           <none>
kube-system             kube-scheduler-docker-desktop               1/1     Running   0          3h     192.168.65.3   docker-desktop   <none>           <none>
kube-system             storage-provisioner                         1/1     Running   0          3h     10.1.0.4       docker-desktop   <none>           <none>
kube-system             vpnkit-controller                           1/1     Running   0          3h     10.1.0.5       docker-desktop   <none>           <none>
kubernetes-dashboard    dashboard-metrics-scraper-c79c65bb7-z5qlx   1/1     Running   0          40m    10.1.0.9       docker-desktop   <none>           <none>
kubernetes-dashboard    kubernetes-dashboard-55fd8c78bd-227fh       1/1     Running   0          40m    10.1.0.10      docker-desktop   <none>           <none>
quota-mem-cpu-example   quota-mem-cpu-demo                          1/1     Running   0          12m    10.1.0.11      docker-desktop   <none>           <none>
PS C:\Users\root> kubectl get pods --field-selector=spec.nodeName=prd
No resources found in default namespace.
PS C:\Users\root> kubectl get pods --field-selector=spec.nodeName=prd kubectl describe pods^C
PS C:\Users\root>  kubectl describe pods
PS C:\Users\root>  kubectl logs
error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'.
POD or TYPE/NAME is a required argument for the logs command
See 'kubectl logs -h' for help and examples
PS C:\Users\root>  kubectl.exe get pod
No resources found in default namespace.
PS C:\Users\root>  kubectl.exe get pod --namespace=prd
No resources found in prd namespace.
PS C:\Users\root>  kubectl.exe get pods --namespace=prd
No resources found in prd namespace.
PS C:\Users\root>
PS C:\Users\root> kubectl get namespace
NAME                    STATUS   AGE
default                 Active   3h6m
dev                     Active   28m
docker                  Active   3h4m
kube-node-lease         Active   3h6m
kube-public             Active   3h6m
kube-system             Active   3h6m
kubernetes-dashboard    Active   44m
metallb-system          Active   174m
prd                     Active   26m
quota-mem-cpu-example   Active   19m
stg                     Active   27m
PS C:\Users\root> notepad.exe podsample.yaml
PS C:\Users\root> kubectl apply -f podsample.yaml -n prd.3
error: error parsing podsample.yaml: error converting YAML to JSON: yaml: mapping values are not allowed in this context
PS C:\Users\root> ^C
PS C:\Users\root>
PS C:\Users\root> kubectl apply -f podsample.yaml -n prd3
error: error parsing podsample.yaml: error converting YAML to JSON: yaml: mapping values are not allowed in this context
PS C:\Users\root> .^C
PS C:\Users\root> kubectl apply -f podsample.yaml -n prd
error: error parsing podsample.yaml: error converting YAML to JSON: yaml: mapping values are not allowed in this context
PS C:\Users\root> notepad.exe podsample.yaml
PS C:\Users\root> kubectl apply -f podsample.yaml -n prd
error: error parsing podsample.yaml: error converting YAML to JSON: yaml: line 10: mapping values are not allowed in this context
PS C:\Users\root> kubectl apply -f podsample.yaml -n prd
pod/springboot-web created
PS C:\Users\root> kubectl get namespace
NAME                    STATUS   AGE
default                 Active   3h15m
dev                     Active   38m
docker                  Active   3h14m
kube-node-lease         Active   3h15m
kube-public             Active   3h15m
kube-system             Active   3h15m
kubernetes-dashboard    Active   54m
metallb-system          Active   3h4m
prd                     Active   36m
quota-mem-cpu-example   Active   29m
stg                     Active   37m
PS C:\Users\root> kubectl get pod
No resources found in default namespace.
PS C:\Users\root> kubectl get pod -n prd
NAME             READY   STATUS    RESTARTS   AGE
springboot-web   1/1     Running   0          51s
PS C:\Users\root> kubectl get pod -n kube-sample
No resources found in kube-sample namespace.
PS C:\Users\root>
PS C:\Users\root> kubectl get pod -n prd
NAME             READY   STATUS    RESTARTS   AGE
springboot-web   1/1     Running   0          103s
PS C:\Users\root> kubectl get pod -n prd
NAME             READY   STATUS    RESTARTS   AGE
springboot-web   1/1     Running   0          2m28s
PS C:\Users\root> notepad.exe  Dockerfile
PS C:\Users\root> docker build -t 1223yys/springboot-web:0.1.6
"docker build" requires exactly 1 argument.
See 'docker build --help'.

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile
PS C:\Users\root>
PS C:\Users\root> 출처: https://coding-start.tistory.com/308 [코딩스타트]ku^C
PS C:\Users\root> .\kube-state-metrics\^C
PS C:\Users\root> kubectl get nodes --show-labels
NAME             STATUS   ROLES    AGE     VERSION          LABELS
docker-desktop   Ready    master   3h20m   v1.16.6-beta.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=docker-desktop,kubernetes.io/os=linux,node-role.kubernetes.io/master=
PS C:\Users\root> kubectl get pods -o wide
No resources found in default namespace.
PS C:\Users\root> kubectl get pods -o wide
No resources found in default namespace.
PS C:\Users\root> kubectl get pods -o wide -n=all
No resources found in all namespace.
PS C:\Users\root>  kubectl logs
error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'.
POD or TYPE/NAME is a required argument for the logs command
See 'kubectl logs -h' for help and examples
PS C:\Users\root>
PS C:\Users\root>
PS C:\Users\root>  kubectl.exe logs
error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'.
POD or TYPE/NAME is a required argument for the logs command
See 'kubectl logs -h' for help and examples
PS C:\Users\root> kubectl exec -it  /bin/bash
error: you must specify at least one command for the container
PS C:\Users\root> kubectl get pod -n prd
NAME             READY   STATUS    RESTARTS   AGE
springboot-web   1/1     Running   0          7m22s
PS C:\Users\root> kubectl exec -it springboot-web  /bin/bash
Error from server (NotFound): pods "springboot-web" not found
PS C:\Users\root> kubectl exec -it springboot-web -n prd  /bin/bash
root@springboot-web:/#
root@springboot-web:/# ps
  PID TTY          TIME CMD
   31 pts/0    00:00:00 bash
   37 pts/0    00:00:00 ps
root@springboot-web:/# ls
app  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@springboot-web:/# ls 0-al
ls: cannot access '0-al': No such file or directory
root@springboot-web:/# ls -al
total 76
drwxr-xr-x   1 root root 4096 Jul  9 15:52 .
drwxr-xr-x   1 root root 4096 Jul  9 15:52 ..
-rwxr-xr-x   1 root root    0 Jul  9 15:52 .dockerenv
drwxr-xr-x   1 root root 4096 Nov 19  2019 app
drwxr-xr-x   1 root root 4096 Oct 17  2019 bin
drwxr-xr-x   2 root root 4096 Sep  8  2019 boot
drwxr-xr-x   5 root root  360 Jul  9 15:52 dev
drwxr-xr-x   1 root root 4096 Jul  9 15:52 etc
drwxr-xr-x   2 root root 4096 Sep  8  2019 home
drwxr-xr-x   1 root root 4096 Oct 14  2019 lib
drwxr-xr-x   2 root root 4096 Oct 14  2019 lib64
drwxr-xr-x   2 root root 4096 Oct 14  2019 media
drwxr-xr-x   2 root root 4096 Oct 14  2019 mnt
drwxr-xr-x   2 root root 4096 Oct 14  2019 opt
dr-xr-xr-x 196 root root    0 Jul  9 15:52 proc
drwx------   1 root root 4096 Oct 18  2019 root
drwxr-xr-x   1 root root 4096 Jul  9 15:52 run
drwxr-xr-x   1 root root 4096 Oct 17  2019 sbin
drwxr-xr-x   2 root root 4096 Oct 14  2019 srv
dr-xr-xr-x  12 root root    0 Jul  9 15:52 sys
drwxrwxrwt   5 root root 4096 Jul  9 15:52 tmp
drwxr-xr-x   1 root root 4096 Oct 14  2019 usr
drwxr-xr-x   1 root root 4096 Oct 14  2019 var
root@springboot-web:/#
deployments.v1.appsdeployments.v1.apps

댓글