kubernetes

20210824 (화) kubectl 활용

gusalstm 2021. 8. 24. 16:50
반응형

9:40 review

 Kubernetes : Google Borg project → CNCF Foundation 

 Kubernetes Architecture

   Control Plane : Kubernetes를 제어하는 메인 서버

   API Server : Kubernetes 구성요소들이 API 통신을 사용하여 API 서버와 통신

                   Kubernetes 구성요소를 관리 감독하는 역할을 수행함

   Key-Value Storage (etcd)

     Kubernetes 상태 정보를 저장하는 Key-Value Storage. API Server와 동일한 정보를 가지고 있음

   Scheduler 

     새로 생성되는 파드(Pod)를 감지하고 적절한 노드에 할당

   Controller Manager

     API Server를 통해 지속적으로 Kubernetes Cluster를 감시하고 필요한 상태로 이행하는 역할 수행

   - Node Controller : 노드 관리

   - Replication Controller : Replication Controller를 사용하는 모든 Object를 관리

   - Endpoint Controller : Service와 Pod를 연결함

   - Service Account, Token Controller : Kubernetes의 Namespace, Account, Token 담당

 

   Cloud Controller Manager

     Cloud환경을 지원하기 위한 Controller

   Node

     Kubernetes Cluster에서 컨테이너의 실행 런타임 환경을 제공하고 동작중인 Pod를 유지하는 역할을 수행

   Kubelet

     각 노드에 위치하는 에이전트로 Control Plane으로부터 제공 받은 Pod의 구성정보를 바탕으로 컨테이너를 실행

   Kube-proxy   

     Host레벨의 네트워크 규칙을 구성하고 외부 연결과 Pod를 연결하는 역할 수행

   Container Runtime

     컨테이너를 실행시키는 구성요소

   - Docker

   - containerd

   - CRI-O 등...

   Add-On : Kubernetes Cluster에 추가할 수 있는 확장기능 제공

   Cluster DNS

     Kubernetes Cluster 내의 여러 오브젝트에 대한 DNS 레코드 제공하여 DNS주소기반으로 탐색이 가능

     (Object : Pod, Container, Service 등)

     **컨테이너 환경에서 IP기반으로 찾으면 IP 할당이 변경되었을 시, 찾아갈 수가 없음 (비고정)

 

    Kubernetes API 버전 종류

    - Alpha Version API

      실험적인 기능을 포함하는 API 버전

      버전 이름에 alpha가 포함됨

      지원이 별도의 공지없이 중단될 가능성이 있음

    - Beta Version API

      버전 이름에 beta가 포함됨

      alpha보다 성숙된 API Version

      다음 버전에서 호환성이 깨지는 형태로 변경될 수 있으나 마이그레이션을 지원

    - Stable Version API

      버전 이름이 vX 형태임 (X가 정수)

   Kubernetes API 그룹

     Kubernetes 에서 기능을 추가할 때 확장할 수 있도록 함

   Core 그룹 :

     YAML - apiVersion : API_VER

     HTTP REST API - /api/API_VER

   Core 이외의 그룹 :    

     YAML - apiVersion:Group/API_VER

     HTTP REST API - /api/GROUP/API_VER

 

 Kubernetes 오브젝트 관리

 - 명령형 커맨드

     kubectl 명령어에 인수나 옵션을 사용하여 애플리케이션을 관리함

     일회성 작업

     개발환경에서 사용하며 가장 단순한 작업

 - 명령형 오브젝트 구성

   오브젝트를 VAML 파일이나 JSON 파일에 저장

 

vagrant@kube-control1:~/.kube$ kubectl get nodes -o wide
NAME            STATUS   ROLES    AGE   VERSION    INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
kube-control1   Ready    master   19h   v1.19.11   192.168.200.11   <none>        Ubuntu 20.04.3 LTS   5.4.0-81-generic   docker://20.10.8
kube-node1      Ready    <none>   19h   v1.19.11   192.168.200.21   <none>        Ubuntu 20.04.2 LTS   5.4.0-81-generic   docker://20.10.8
kube-node2      Ready    <none>   19h   v1.19.11   192.168.200.22   <none>        Ubuntu 20.04.2 LTS   5.4.0-81-generic   docker://20.10.8
kube-node3      Ready    <none>   18h   v1.19.11   192.168.200.23   <none>        Ubuntu 20.04.2 LTS   5.4.0-81-generic   docker://20.10.8
vagrant@kube-control1:~/.kube$ kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
kube-control1   Ready    master   19h   v1.19.11
kube-node1      Ready    <none>   19h   v1.19.11
kube-node2      Ready    <none>   19h   v1.19.11
kube-node3      Ready    <none>   19h   v1.19.11
vagrant@kube-control1:~/.kube$ kubectl get nodes -o json
vagrant@kube-control1:~/.kube$ kubectl version
vagrant@kube-control1:~/.kube$ kubectl cluster-info
vagrant@kube-control1:~/.kube$ kubectl create -f nginx.yaml
vagrant@kube-control1:~/.kube$ kubectl delete -f nignx.yaml
vagrant@kube-control1:~/.kube$ kubectl delete -f apps/

728x90
##### 명령어로 컨테이너 애플리케이션 배포 #####

vagrant@kube-control1:~/.kube$ kubectl create deployment nginx --image nginx
vagrant@kube-control1:~/.kube$ kubectl get deployments,replicasets,pods
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           3m6s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-6799fc88d8   1         1         1       3m6s

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx                    1/1     Running   0          51m
pod/nginx-6799fc88d8-pjzrr   1/1     Running   0          3m6s

vagrant@kube-control1:~/.kube$ kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE   READINESS GATES
nginx                    1/1     Running   0          50m     192.168.233.193   kube-node2   <none>           <none>
nginx-6799fc88d8-pjzrr   1/1     Running   0          2m39s   192.168.9.66      kube-node1   <none>           <none>
vagrant@kube-control1:~/.kube$ curl http://192.168.9.66


##### p50 컨테이너 애플리케이션 : 매니페스트 파일로 컨테이너 애플리케이션 배포 #####

vagrant@kube-control1:~$ cat test-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: photoview-deployment

spec:
  replicas: 5 → replica 5개 생성
  selector:
    matchLabels:
      app: photo-view

  template:
    metadata:
      labels:
        app: photo-view
        env: stage
    spec:
      containers:
      - image: asashiho/photoview-image
        name: photoview-container
        ports:
        - containerPort: 80
vagrant@kube-control1:~$ kubectl create -f test-deployment.yml  → manifest 파일 실행(생성)
deployment.apps/photoview-deployment created

##### kubectl scale 명령 실습 #####


vagrant@kube-control1:~$ kubectl get pod -o wide → replica 5개 생성확인
NAME                                   READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE   READINESS GATES
my-nginx-pod                           1/1     Running   0          80m     192.168.233.195   kube-node2   <none>           <none>
nginx-label                            1/1     Running   0          20m     192.168.119.134   kube-node3   <none>           <none>
nginx-port                             1/1     Running   0          38m     192.168.119.133   kube-node3   <none>           <none>
photoview-deployment-f75796b47-7jpzl   1/1     Running   0          2m21s   192.168.9.74      kube-node1   <none>           <none>
photoview-deployment-f75796b47-dn86b   1/1     Running   0          2m21s   192.168.9.73      kube-node1   <none>           <none>
photoview-deployment-f75796b47-dx2ch   1/1     Running   0          2m21s   192.168.233.199   kube-node2   <none>           <none>
photoview-deployment-f75796b47-tgkv6   1/1     Running   0          2m21s   192.168.119.137   kube-node3   <none>           <none>
photoview-deployment-f75796b47-z5mfk   1/1     Running   0          2m21s   192.168.233.198   kube-node2   <none>           <none>

vagrant@kube-control1:~$ kubectl scale deployment photoview-deployment --replicas=6 → replica 6개로 스케일업
deployment.apps/photoview-deployment scaled

vagrant@kube-control1:~$ kubectl get pod -o wide → 추가 확인
NAME                                   READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE   READINESS GATES
my-nginx-pod                           1/1     Running   0          85m     192.168.233.195   kube-node2   <none>           <none>
nginx-label                            1/1     Running   0          25m     192.168.119.134   kube-node3   <none>           <none>
nginx-port                             1/1     Running   0          43m     192.168.119.133   kube-node3   <none>           <none>
photoview-deployment-f75796b47-7jpzl   1/1     Running   0          7m47s   192.168.9.74      kube-node1   <none>           <none>
photoview-deployment-f75796b47-dn86b   1/1     Running   0          7m47s   192.168.9.73      kube-node1   <none>           <none>
photoview-deployment-f75796b47-dx2ch   1/1     Running   0          7m47s   192.168.233.199   kube-node2   <none>           <none>
photoview-deployment-f75796b47-jz7fv   1/1     Running   0          12s     192.168.119.138   kube-node3   <none>           <none>
photoview-deployment-f75796b47-tgkv6   1/1     Running   0          7m47s   192.168.119.137   kube-node3   <none>           <none>
photoview-deployment-f75796b47-z5mfk   1/1     Running   0          7m47s   192.168.233.198   kube-node2   <none>           <none>


##### 로드밸런서 설정 및 서비스 동작 확인 #####

vagrant@kube-control1:~$ cat test-service.yml
apiVersion: v1
kind: Service
metadata:
  name: webserver

spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP

  selector:
    app: photo-view

vagrant@kube-control1:~$ kubectl apply -f test-service.yml
service/webserver created
vagrant@kube-control1:~$ kubectl apply -f test-service.yml
service/webserver created
vagrant@kube-control1:~$ kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>            443/TCP        24h
webserver    LoadBalancer   10.102.202.200   192.168.200.200   80:32462/TCP   6s

▶ external-ip로 서비스 접속 가능 : 192.168.200.200


vagrant@kube-control1:~$ kubectl delete -f test-deployment.yml
deployment.apps "photoview-deployment" deleted

 

https://metallb.universe.tf/

퍼블릭 클라우드의 경우 벤더사의 로드밸런서가 설정되겠지만

on-premise 환경에서는 로드밸런서가 따로 준비되지 않으므로 metallb를 통해 로드밸런서 설정을 할 수 있다.

##### manifestfile을 이용한 metallb namespace 생성 #####

vagrant@kube-control1:~$ kubectl create -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace
.yaml
namespace/metallb-system created
vagrant@kube-control1:~$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   22h
kube-node-lease   Active   22h
kube-public       Active   22h
kube-system       Active   22h
metallb-system    Active   11s

vagrant@kube-control1:~$ kubectl create -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
(wget을 통해 다운로드 후 실행해도 됨)

##### manifestfile을 이용한 metallb 설정 #####

vagrant@kube-control1:~$ mkdir -p work/metallb
vagrant@kube-control1:~$ cd work/metallb
vagrant@kube-control1:~/work/metallb$ vim metallb-config.yaml
vagrant@kube-control1:~/work/metallb$ cat metallb-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.200.200-192.168.200.210  → worker노드들과 겹치지 않는 범위 지정필요
vagrant@kube-control1:~/work/metallb$ kubectl create -f metallb-config.yaml
configmap/config created
vagrant@kube-control1:~/work/metallb$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   22h
kube-node-lease   Active   22h
kube-public       Active   22h
kube-system       Active   22h
metallb-system    Active   7m5s
vagrant@kube-control1:~/work/metallb$ kubectl get pods -n metallb-system
NAME                          READY   STATUS    RESTARTS   AGE
controller-6b78bff7d9-9wsnz   1/1     Running   0          4m48s
speaker-bvsnw                 1/1     Running   0          4m48s
speaker-ffbhd                 1/1     Running   0          4m48s
speaker-pcsgr                 1/1     Running   0          4m48s
speaker-xc4st                 1/1     Running   0          4m48s

반응형

 

application 배포단위 : pod

 Kubernetes 에서 컨테이너를 실행하고 배포할 수 있는 가장 작은 단위

 pod ≠ container

 

##### manifests 파일을 통한 pod 생성 #####

vagrant@kube-control1:~/work/20210824$ cat nginx-pod.yaml

apiVersion: v1  → Kubernetes API Version 지정
kind: Pod        → 생성할 Kubernetes Object 종류
metadata:        → Object 정의 내용 (Object 이름) 
  name: my-nginx-pod → Pod 이름
spec:              → Object Spec 정의
  containers:    → Container 정의
  - name: my-nginx-container   → Container 이름
    image: nginx:latest             → Container 이미지
    ports:                              → Port 정의
    - containerPort: 80             → Container에서 여는 포트 지정
      protocol: TCP                  → Protocol 지정

vagrant@kube-control1:~/work/20210824$ kubectl create -f nginx-pod.yaml
vagrant@kube-control1:~/work/20210824$ kubectl get pods -o wide
vagrant@kube-control1:~/work/20210824$ kubectl describe pod POD(my-nginx-pod)
 → 상세 정보 출력
vagrant@kube-control1:~/work/20210824$ kubectl logs POD(my-nginx-pod)
 → 파드 로그 확인


##### port-foward #####

vagrant@kube-control1:~/work/20210824$ kubectl port-forward nginx-port 1234:80
Forwarding from 127.0.0.1:1234 -> 80
Forwarding from [::1]:1234 -> 80  
 → 쉘프롬프트가 없이 프로세스가 동작중일때만 포트포워딩이 실행됨. Ctrl+C로 중단되면 포트포워딩이 종료됨.

https://kubernetes.io/ko/docs/tasks/access-application-cluster/port-forward-access-application-cluster/

##### Label #####

vagrant@kube-control1:~/work/20210824$ cat label.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-label
  labels:
    env: test   → env,apn  등은 customize 가능
    apn: web-pub
spec:
  containers:
  - name: my-nginx-label
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
vagrant@kube-control1:~/work/20210824$ kubectl create -f label.yaml
pod/nginx-label created
vagrant@kube-control1:~/work/20210824$ kubectl get pods --show-labels → get pod를 하면서 레이블 출력 옵션
NAME           READY   STATUS    RESTARTS   AGE    LABELS
my-nginx-pod   1/1     Running   0          62m    <none>
nginx-label    1/1     Running   0          106s   apn=web-pub,env=test
nginx-port     1/1     Running   0          19m    run=nginx-port
vagrant@kube-control1:~/work/20210824$ kubectl get pods -L apn,env → apn,env에 label에 속한 pod 정렬
NAME           READY   STATUS    RESTARTS   AGE     APN       ENV
my-nginx-pod   1/1     Running   0          63m
nginx-label    1/1     Running   0          3m24s   web-pub   test
nginx-port     1/1     Running   0          21m
vagrant@kube-control1:~/work/20210824$ kubectl label pods my-nginx-pod env=test → 기존 pod에 label 추가
pod/my-nginx-pod labeled
vagrant@kube-control1:~/work/20210824$ kubectl get pods --show-labels
NAME           READY   STATUS    RESTARTS   AGE    LABELS
my-nginx-pod   1/1     Running   0          67m    env=test
nginx-label    1/1     Running   0          7m9s   apn=web-pub,env=test
nginx-port     1/1     Running   0          25m    run=nginx-port

 

728x90