728x90

deployment, replicaset, pod


디플로이먼트 생성

  • 디플로이먼트 생성
vagrant@kube-master1:~/test$ kubectl create deployment myapp --image=c1t1d0s7/myweb

 

 

  • 리소스 확인 (디플로이먼트, 리플리카셋, 파드)
vagrant@kube-master1:~/test$ kubectl get deployments,replicasets,pods
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp   1/1     1            1           18h

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/myapp-79877ddf67   1         1         1       18h

NAME                         READY   STATUS    RESTARTS   AGE
pod/myapp-79877ddf67-f9bp6   1/1     Running   1          18h

 

  • 리소스의 자세한 정보 확인
vagrant@kube-master1:~/test$ kubectl get deployments,replicasets,pods -o wide
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                      SELECTOR
deployment.apps/myapp   1/1     1            1           18h   go-myweb     ghcr.io/c1t1d0s7/go-myweb   app=myapp

NAME                               DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                      SELECTOR
replicaset.apps/myapp-79877ddf67   1         1         1       18h   go-myweb     ghcr.io/c1t1d0s7/go-myweb   app=myapp,pod-template-hash=79877ddf67

NAME                         READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
pod/myapp-79877ddf67-f9bp6   1/1     Running   1          18h   10.233.101.21   kube-node1   <none>           <none>

 

 

  • 내부에서 접속 확인
vagrant@kube-master1:~/test$ curl 10.233.101.21:8080
Hello World!
myapp-79877ddf67-f9bp6

 

  • 외부에서 접속 불가
vagrant@kube-master1:~/test$ curl 192.168.56.11
curl: (7) Failed to connect to 192.168.56.11 port 80: Connection refused

 

서비스 생성

 

  • 서비스 생성
vagrant@kube-master1:~/test$ kubectl expose deployment myapp --port=80 --target-port=8080 --name=myapp-svc --type=LoadBalancer

 

  • 생성된 서비스 확인
vagrant@kube-master1:~/test$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/myapp-79877ddf67-f9bp6   1/1     Running   1          18h

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP      10.233.0.1      <none>        443/TCP        19h
service/myapp-svc    LoadBalancer   10.233.41.197   <pending>     80:30177/TCP   18h

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp   1/1     1            1           18h

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/myapp-79877ddf67   1         1         1       18h

 

  • 외부에서 접속 확인
vagrant@kube-master1:~/test$ curl 192.168.56.11:30177
Hello World!
myapp-79877ddf67-f9bp6

 

파드 스케일

  • 파드 스케일
vagrant@kube-master1:~/test$ kubectl scale deployment myapp --replicas=3
deployment.apps/myapp scaled

 

 

  • 파드 스케일 결과 확인
vagrant@kube-master1:~/test$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/myapp-79877ddf67-f9bp6   1/1     Running   1          18h
pod/myapp-79877ddf67-j2h64   1/1     Running   0          7s
pod/myapp-79877ddf67-v4q8j   1/1     Running   0          7s

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP      10.233.0.1      <none>        443/TCP        19h
service/myapp-svc    LoadBalancer   10.233.41.197   <pending>     80:30177/TCP   18h

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp   3/3     3            3           18h

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/myapp-79877ddf67   3         3         3       18h

 

  • 파드가 삭제되어도 3개를 유지하기 위해서 바로 생성됨
vagrant@kube-master1:~/test$ kubectl delete pods myapp-79877ddf67-j2h64 &
[1] 23693
vagrant@kube-master1:~/test$ kubectl get all
NAME                         READY   STATUS        RESTARTS   AGE
pod/myapp-79877ddf67-5kxt4   1/1     Running       0          6s
pod/myapp-79877ddf67-gqj59   1/1     Running       0          32s
pod/myapp-79877ddf67-j2h64   0/1     Terminating   0          3m3s
pod/myapp-79877ddf67-v4q8j   1/1     Running       0          3m3s

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP      10.233.0.1      <none>        443/TCP        19h
service/myapp-svc    LoadBalancer   10.233.41.197   <pending>     80:30177/TCP   18h

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp   3/3     3            3           18h

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/myapp-79877ddf67   3         3         3       18h

 

 

모든 리소스 삭제

  • 디플로이먼트, 서비스 삭제
vagrant@kube-master1:~/test$ kubectl delete deployments.apps myapp
deployment.apps "myapp" deleted

vagrant@kube-master1:~/test$ kubectl delete service myapp-svc
service "myapp-svc" deleted

vagrant@kube-master1:~/test$ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.233.0.1   <none>        443/TCP   19h
728x90
728x90

핸들러


핸들러란

처리를 도와주는 역할

  • 작업을 도와줌
  • 핸들러를 사용하면 불필요하게 실행되는 태스크를 줄일 수 있음

 

핸들러 동작 조건

  • 전 단계에서 작업이 정상적으로 실행되고
  • 변경 사항이 발생한 경우에 동작

 


 

핸들러 동작 과정

nginx_install_w_handlers.yml

  • nginx 설치를 위한 메인 코드에 핸들러 추가
---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes
  vars:
    lnx_name: "{{ 'CentOS' if ansible_distribution == 'CentOS'
                   else 'Ubuntu' if ansible_distribution == 'Ubuntu'
                   else 'Just Linux' }}"

  tasks:
    - name: nginx for any linux
      include_tasks: "{{ lnx_name }}.yml"

  handlers:
    - name: restart nginx web server
      service: name=nginx state=restarted

 

CentOS.yml

  • nginx 설치에 핸들러의 실행을 요청하는 옵션 추가
  • notify: 핸들러가 동작할 경우 실행되는 명령
- name: install epel-release
  action: "{{ ansible_pkg_mgr }} name=epel-release state=latest"
- name: install nginx web server
  action: "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: upload default index.html for web server
  get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644
  notify:
    - restart nginx web server

 

Ubuntu.yml

  • nginx 설치에 핸들러의 실행을 요청하는 옵션 추가
  • 우분투 노드에서 nginx.com url은 오류가 발생하므로 apache.com으로 변경
- name: install nginx web server
  action: "{{ ansible_pkg_mgr }} name=nginx state=present update_cache=yes"
- name: upload default index.html for web server
  get_url: url=https://www.apache.com dest=/usr/share/nginx/html/ 
           mode=0644 validate_certs=no
  notify:
    - restart nginx web server

 

플레이북 실행

  • 첫 번째 실행
  • 핸들러가 동작함
[vagrant@ansible-server install]$ anp nginx_install_w_handlers.yml

 

 

  • 두 번째 실행
  • 핸들러가 실행되지 않음 > 변경 사항이 없기 때문에

728x90
728x90

네임스페이스


namespace: 네임스페이스

네임스페이스란

  • 오브젝트를 논리적으로 분리할 수 있는 논리적 파티션

 

네임스페이스

  • 기본 네임스페이스
항목 설명
default 기본 네임스페이스
kube-node-lease - 쿠버네티스 노드의 가용성을 체크하기 위한 네임스페이스
- 해당 네임스페이스에는 하트비트를 위한 리스 오브젝트가 있음
- 쿠버네티스 1.14 이상
kube-public - 모든 사용자(인증받지 않은 사용자 포함)가 읽기 권한으로 접근할 수 있음
- 관례적으로 만들어져 있찌만 아무 리소스도 없고, 꼭 사용해야하는 것은 아님
kube-system 쿠버네티스 클러스터의 핵심 리소스 배치

 

  • 추가 네임스페이스
항목 설명
ingress-nginx 쿠버네티스 인그레스 리소스를 위한 Nginx 인그레스 컨트롤러 배치
rook-ceph Rook Ceph 스토리지 관련 리소스 배치

 

네임스페이스 사용

  • 기본 네임스페이스 확인
vagrant@kube-master1:~$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   23h
ingress-nginx     Active   23h
kube-node-lease   Active   23h
kube-public       Active   23h
kube-system       Active   23h

 

  • 네임스페이스 생성
vagrant@kube-master1:~/test$ vi testnamespace.yml

 

 

  • yml 파일을 이용하여 네임스페이스 생성
vagrant@kube-master1:~/test$ kubectl create -f testnamespace.yml
namespace/test-ns created

 

  • 네임스페이스 목록 출력
  • 생성된 test-ns 네임스페이스 확인
vagrant@kube-master1:~/test$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   23h
ingress-nginx     Active   23h
kube-node-lease   Active   23h
kube-public       Active   23h
kube-system       Active   23h
test-ns           Active   34s

 

  • 파드는 같은 이름으로 중복 생성되지 않음
  • 현재 default 네임스페이스에서 testapp-pod가 실행되고 있음
vagrant@kube-master1:~/test$ kubectl create -f testapp-pod.yml
Error from server (AlreadyExists): error when creating "testapp-pod.yml": pods "testapp-pod" already exists

 

  • test-ns 네임스페이스에 testapp-pod 파드 생성
  • 네임스페이스는 논리적으로 격리된 공간이므로 default 네임스페이스에 생성된 파드의 이름과 동일해도 파드가 생성됨 
vagrant@kube-master1:~/test$ kubectl create -f testapp-pod.yml -n test-ns
pod/testapp-pod created

 

 

  • test-ns 네임스페이스에서 실행 중인 testapp-pod 파드 확인
vagrant@kube-master1:~/test$ kubectl get pods -n test-ns
NAME          READY   STATUS    RESTARTS   AGE
testapp-pod   1/1     Running   0          12s

vagrant@kube-master1:~/test$ kubectl get pods testapp-pod -n test-ns1 -o yaml | grep -i namespace
  namespace: test-ns1
  selfLink: /api/v1/namespaces/test-ns1/pods/testapp-pod
  
vagrant@kube-master1:~/test$ kubectl get pods testapp-pod-ns -n test-ns2 -o yaml |
 grep -i namespace
  namespace: test-ns2
  selfLink: /api/v1/namespaces/test-ns2/pods/testapp-pod-ns

 


 

실습


 

namespace 생성

  • yml 파일을 이용하여 myns1 네임스페이스 생성
vagrant@kube-master1:~/exam$ vi exam-ns.yml
apiVersion: v1
kind: Namespace
metadata:
  name: myns1
  
vagrant@kube-master1:~/exam$ kubectl create -f exam-ns.yml
namespace/myns1 created

 

  • 명령을 이용한 myns2 네임스페이스 생성
vagrant@kube-master1:~/exam$ kubectl create namespace myns2
namespace/myns2 created

 

  • 네임스페이스 생성 확인
vagrant@kube-master1:~/exam$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   24h
ingress-nginx     Active   24h
kube-node-lease   Active   24h
kube-public       Active   24h
kube-system       Active   24h
myns1             Active   11m
myns2             Active   6m33s

 

pod 생성

  • default namespace에 exam-pod 생성
vagrant@kube-master1:~/exam$ kubectl create -f exam-pod.yml

 

  • myns1 namespace에 exam-pod 생성
  • 조건: 명령어에 -n 옵션 부여
vagrant@kube-master1:~/exam$ kubectl create -f exam-pod.yml -n myns1
pod/exam-pod created

 

 

  • myns2 namespace에 exam-pod 생성
  • 조건: yml 파일을 이용하여 파드 생성
vagrant@kube-master1:~/exam$ vi exam-pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: exam-pod
  namespace: myns2
spec:
  containers:
  - name: default
    image: c1t1d0s7/myweb
    ports:
    - containerPort: 8081
      protocol: TCP
      
vagrant@kube-master1:~/exam$ kubectl create -f exam-pod.yml
pod/exam-pod created

 

 

실행 중인 파드 정보 확인

  • 네임스페이스: default
vagrant@kube-master1:~/exam$ kubectl get pods -n default
NAME       READY   STATUS    RESTARTS   AGE
exam-pod   1/1     Running   0          9s

 

  • 네임스페이스: myns1
vagrant@kube-master1:~/exam$ kubectl get pods -n myns1
NAME       READY   STATUS    RESTARTS   AGE
exam-pod   1/1     Running   0          7m8s

 

  • 네임스페이스: myns2
vagrant@kube-master1:~/exam$ kubectl get pods -n myns2
NAME       READY   STATUS              RESTARTS   AGE
exam-pod   0/1     ContainerCreating   0          5s

 

리소스 삭제

  • myns2
  • 명령을 이용해 myns2 네임스페이스 삭제
  • & 옵션을 이용해 네임스페이스와 파드가 삭제되는 동안 다른 명령을 수행할 수 있도록 함
  • & 옵션을 사용하지 않으면 리소스가 삭제되는 동안 다른 작업 불가
vagrant@kube-master1:~/exam$ kubectl delete namespaces myns2 &
[1] 11067
vagrant@kube-master1:~/exam$ namespace "myns2" deleted

 

  • myns1
  • myns1 네임스페이스를 생성한 yml 파일을 이용하여 삭제
vagrant@kube-master1:~/exam$ kubectl delete -f exam-ns.yml
namespace "myns1" deleted

 

  • default
  • exam-pod.yml 파일에서 namespace: myns2 부분을 지우고 저장
vagrant@kube-master1:~/exam$ vi exam-pod.yml

vagrant@kube-master1:~/exam$ kubectl get pods
No resources found in default namespace.
728x90
728x90

label


 

label: 레이블

label이란

  • 레이블은 쿠버네티스 클러스터의 모든 오브젝트(파드 포함)에 키/값 쌍으로 리소스를 식별하고 속성을 지정하는 데 사용
  • 오브젝트 갯수가 많아진다면 오브젝트를 식별하는 데 매우 어려울 수 있으며, 오브젝트의 적절한 레이블을 부여하여 성격을 정의하고 검색을 용이하게 할 수 있음
  • 레이블은 사용자에게는 중요하지만, 쿠버네티스 클러스터에 직접적인 의미는 없음

 

label이 포함한 yml 파일로 파드 생성

  • testapp-pod-lable1.yml 파일 생성
vagrant@kube-master1:~/test$ vi testapp-pod-label.yml

apiVersion: v1
kind: Pod
metadata:
  name: testapp-pod-label1
  labels:
    env: dev
    tier: frontend
spec:
  containers:
  - name: testapp
    image: c1t1d0s7/myweb
    ports:
    - containerPort: 8080
      protocol: TCP

 

  • 파드 생성
vagrant@kube-master1:~/test$ kubectl create -f testapp-pod-label.yml
pod/testapp-pod-label1 created

 

  • 실행 중인 파드 확인
vagrant@kube-master1:~/test$ kubectl get pods
NAME                 READY   STATUS              RESTARTS   AGE
testapp-pod          1/1     Running             0          51m
testapp-pod-label1   0/1     ContainerCreating   0          7s

 

  • 레이블 확인
  • LABELS 값 확인
vagrant@kube-master1:~/test$ kubectl get pods --show-labels
NAME                 READY   STATUS    RESTARTS   AGE    LABELS
testapp-pod          1/1     Running   0          53m    <none>
testapp-pod-label1   1/1     Running   0          2m8s   env=dev,tier=frontend

vagrant@kube-master1:~/test$ kubectl get pods --show-labels -l env=dev
NAME                 READY   STATUS    RESTARTS   AGE     LABELS
testapp-pod-label1   1/1     Running   0          3m48s   env=dev,tier=frontend

 

  • 기존 파드에 label 생성
  • name=label 추가
vagrant@kube-master1:~/test$ kubectl label pods testapp-pod-label1 name=label
pod/testapp-pod-label1 labeled

vagrant@kube-master1:~/test$ kubectl get pods --show-labels
NAME                 READY   STATUS    RESTARTS   AGE   LABELS
testapp-pod          1/1     Running   0          65m   <none>
testapp-pod-label1   1/1     Running   0          14m   env=dev,name=label,tier=frontend

 

  • 기존 파드의 label 수정
  • env=dev 값을 env=ops 값으로 수정
vagrant@kube-master1:~/test$ kubectl label pods testapp-pod-label1 env=ops --overwrite
pod/testapp-pod-label1 labeled

vagrant@kube-master1:~/test$ kubectl get pods --show-labels
NAME                 READY   STATUS    RESTARTS   AGE   LABELS
testapp-pod          1/1     Running   0          63m   <none>
testapp-pod-label1   1/1     Running   0          12m   env=ops,name=label,tier=frontend

 


annotation


 

annotation: 어노테이션

어노테이션이란

  • 주석
  • 오브젝트에 비-식별 메타데이터를 지정하여 추가적인 정보를 제공하기 위해 사용
  • 레이블은 레이블 셀렉터를 이용하여 식별 및 검색을 할 수 있지만, 어노테이션은 셀렉터를 가지고 있지 않음
  • 어노테이션 사용 예: 선언적 구성 정보, 타임 스탬프, 릴리즈 ID, 로킹, 모니터링, 디버깅 정보, 책임자, 관리자 정보 등

 

어노테이션을 포함한 yml 파일로 파드 생성

  • testapp-pod-anno.yml 파일 생성
 vagrant@kube-master1:~/test$ vi testapp-pod-anno.yml
 
 apiVersion: v1
kind: Pod
metadata:
  name: testapp-pod-anno
  annotations:
    test: abcde

spec:
  containers:
  - name: testapp
    image: c1t1d0s7/myweb
    ports:
    - containerPort: 8080
      protocol: TCP

 

  • 파드 생성
vagrant@kube-master1:~/test$ kubectl create -f testapp-pod-anno.yml
pod/testapp-pod-anno created

 

  • 실행 중인 파드 확인
vagrant@kube-master1:~/test$ kubectl get pods
NAME                 READY   STATUS    RESTARTS   AGE
testapp-pod          1/1     Running   0          160m
testapp-pod-anno     1/1     Running   0          14s
testapp-pod-label1   1/1     Running   0          109m
testapp-pod-label2   1/1     Running   0          16m

 

  • 어노테이션 값 확인
vagrant@kube-master1:~/test$ kubectl get pods testapp-pod-anno -o yaml | grep -i -A 3 'annotation'
  annotations:
    file: testapp-pod-anno.yml
    subtitle: annotation
  creationTimestamp: "2022-06-22T03:14:44Z"
  managedFields:
  - apiVersion: v1
--
        f:annotations:
          .: {}
          f:file: {}
          f:subtitle: {}

 

  • testapp-pod-anno 파드의 자세한 정보 확인
vagrant@kube-master1:~/test$ kubectl describe pods testapp-pod-anno
~
Annotations:  test: abcde
~

 

  • 실행 중인 파드의 어노테이션 수정
vagrant@kube-master1:~/test$ kubectl annotate pods testapp-pod test="defgh"
pod/testapp-pod annotated

 

  • 변경된 어노테이션 확인
vagrant@kube-master1:~/test$ kubectl get pods testapp-pod -o yaml | less

728x90
728x90

파드


파드 개념

파드란

  • 쿠버네티스의 기본 구성 요소
  • 쿠버네티스의 객체 모델 중에서 생성 및 배포가 가능한 가장 작은 단위
  • 쿠버네티스 클러스터 내에서 애플리케이션을 배포하며 동작하는 프로세스
  • 파드는 컨테이너이며, 한 개 이상의 컨테이너들로 구성됨

 

파드 리소스의 주요 필드

항목 설명
.spec.containers 컨테이너 정의
.spec.containers.image 컨테이너에 사용할 이미지
.spec.containers.name 컨테이너 이름
.spec.containers.ports 노출할 포트 정의
.spec.containers.ports.containerPort 노출할 컨테이너 포트번호
.spec.containers.ports.protocol 노출할 컨테이너 포트의 프로토콜(default: TCP)

 


 

기본 템플릿 사용


yml 파일을 이용한 파드 생성

하나의 컨테이너를 생성하는 템플릿 구성

  • testapp-pod.yml 파일 생성
  • apiVersion: API 버전
  • kind: 생성할 오브젝트 종류
  • metadata.name: 파드 오브젝트의 이름
  • spec.containers.name: 컨테이너 이름
  • spec.containers.image: 컨테이너에 사용할 이미지
  • spec.containers.ports.containerPort, protocol: 노출할 컨테이너 포트, 프로토콜
vagrant@kube-master1:~/test$ vi testapp-pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: testapp-pod
spec:
  containers:
  - name: testapp
    image: c1t1d0s7/myweb
    ports:
    - containerPort: 8080
      protocol: TCP

 

  • 파드 생성
vagrant@kube-master1:~/test$ kubectl create -f testapp-pod.yml
pod/testapp-pod created

 

  • 실행 중인 파드 정의 확인
  • kubectl get pods 파드명 -o yaml
  • kubectl get pods 파드명 -o json
vagrant@kube-master1:~/test$ kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
testapp-pod   1/1     Running   0          45s

vagrant@kube-master1:~/test$ kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE    IP             NODE         NOMINATED NODE   READINESS GATES
testapp-pod   1/1     Running   0          3m9s   10.233.101.7   kube-node1   <none>           <none>

vagrant@kube-master1:~/test$ curl 10.233.101.7:8080
Message: Hello World!
Hostname: testapp-pod
Platform: linux
Uptime: 2134
IP: 10.233.101.7
DNS: 169.254.25.10

 

  • 파드의 자세한 정보 확인
vagrant@kube-master1:~/test$ kubectl describe pods testapp-pod | less

 

  • 파드 로그 확인
vagrant@kube-master1:~/test$ kubectl logs testapp-pod

Tue Jun 21 2022 02:39:58 GMT+0000 (Coordinated Universal Time)
...Start My Node.js Application...
Tue Jun 21 2022 02:43:17 GMT+0000 (Coordinated Universal Time)
Received Request From ::ffff:10.233.89.0

 

728x90
728x90

Docker Compose 설치


전제 조건

  • Docker Compose에는 Docker Engine 필요
  • Docker Compose 플러그인에는 Docker CLI 필요

 


 

Docker Engine, Docker CLI 설치

리포지토리를 사용하여 설치

  • 리포지토리 설정
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

 

 

  • docker engine, containerd, docker-compose 설치
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

 

  • 도커 시작
sudo systemctl start docker

 


 

Compose CLI 플러그인 수동 설치

  • 명령어를 바로 실행할 수 있도록 /usr/local/bin 디렉토리에 docker-compose 설치
curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

 

  • docker-compose 설치 확인
ls -l /usr/local/bin/docker-compose
-rw-r--r--. 1 root root 25968640 Jun 20 22:54 /usr/local/bin/docker-compose

 

 

 

  • /usr/local/bin/docker-compose 디렉토리 권한 변경
  • chmod a+x: 모든 사용자 계정에 대해 실행 권한 추가
chmod a+x /usr/local/bin/docker-compose
ls -l /usr/local/bin/docker-compose
-rwxr-xr-x. 1 root root 25968640 Jun 20 22:54 /usr/local/bin/docker-compose

 

  • docker-compose 명령 실행 확인
docker-compose --help
728x90
728x90
앞에서 kubespray를 이용하여 쿠버네티스 설치를 해보았으므로
이번에는 마스터 노드의 스냅샷을 1로 복원하고 kubeadm을 이용해 쿠버네티스 설치 진행

 

모든 VM에 docker-ce 설치


리포지토리를 이용한 설치

도커 리포지토리 설정

  • HTTPS를 통해 리포지토리를 사용할 수 있도록 패키지 인덱스 업데이트 및 apt 패키지 설치
vagrant@kube-master1:~$ sudo apt-get update
vagrant@kube-master1:~$ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

 

 

  • Docker 공식 GPG 키 추가
vagrant@kube-master1:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

  • 리포지토리 설정
vagrant@kube-master1:~$ echo \
>   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
>   $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

도커 엔진 설치

  • apt 패키지 업데이트 및 Docker Engine, containerd 설치
vagrant@kube-master1:~$ sudo apt-get update
vagrant@kube-master1:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io

 


 

모든 VM에 kubeadm, kubelet, kubectl 설치


 

kubeadm 설치

kubeadm: 클러스터를 부트스트랩하는 명령

kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트

kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티

  • 구글 클라우드의 공개 사이닝 키 다운로드
vagrant@kube-master1:~$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

 

  • 쿠버네티스 apt 리포지토리 추가
vagrant@kube-master1:~$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

 

  • apt 패키지 업데이트 및 kubelet, kubeadm, kubectl 설치
vagrant@kube-master1:~$ sudo apt-get update
vagrant@kube-master1:~$ sudo apt-get install -y kubelet=1.19.11-00 kubeadm=1.19.11-00 kubectl=1.19.11-00
vagrant@kube-master1:~$ sudo apt-mark hold kubelet kubeadm kubectl

 


 

Control-Plane 초기화


 

kubeadm으로 클러스터 생성

  • control-plane 초기화
vagrant@kube-master1:~$ sudo kubeadm init --control-plane-endpoint 192.168.56.11 --pod-network-cidr 10.233.0.0/16 --apiserver-advertise-address 192.168.56.11

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join 192.168.56.11:6443 --token e1s1aa.vnseumbldt9vq4uu \
    --discovery-token-ca-cert-hash sha256:28b7199719f1409880704e77657ec30a527562501ec03870d7738c0aff5188cc \
    --control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.56.11:6443 --token e1s1aa.vnseumbldt9vq4uu \
    --discovery-token-ca-cert-hash sha256:28b7199719f1409880704e77657ec30a527562501ec03870d7738c0aff5188cc

 

  • worker 노드 추가를 위해 명령어 복사
# 실행 결과 마지막 부분
kubeadm join 192.168.56.11:6443 --token e1s1aa.vnseumbldt9vq4uu \
    --discovery-token-ca-cert-hash sha256:28b7199719f1409880704e77657ec30a527562501ec03870d7738c0aff5188cc

 

 

  • 루트 사용자가 아닌 일반 사용자 계정으로 실행
vagrant@kube-master1:~$ mkdir -p $HOME/.kube
vagrant@kube-master1:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
vagrant@kube-master1:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

vagrant@kube-master1:~$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

 

  • 노드 상태 확인
vagrant@kube-master1:~$ kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
kube-master1   Ready    master   12m   v1.19.11

 

 


 

worker 노드 추가


 

각각의 노드에 접속하여 노드를 클러스터에 추가

  • 위에서 복사해 놓은 kubeadm join 명령으로 추가
# kube-node1

vagrant@kube-master1:~$ ssh kube-node1
vagrant@kube-node1:~$ sudo kubeadm join 192.168.56.11:6443 --token e1s1aa.vnseumbldt9vq4uu \
>     --discovery-token-ca-cert-hash sha256:28b7199719f1409880704e77657ec30a527562501ec03870d7738c0aff5188cc

# kube-node2
vagrant@kube-master1:~$ ssh kube-node2
vagrant@kube-node2:~$ sudo kubeadm join 192.168.56.11:6443 --token e1s1aa.vnseumbldt9vq4uu \
>     --discovery-token-ca-cert-hash sha256:28b7199719f1409880704e77657ec30a527562501ec03870d7738c0aff5188cc

# kube-node3
vagrant@kube-master1:~$ ssh kube-node3
vagrant@kube-node3:~$ sudo kubeadm join 192.168.56.11:6443 --token e1s1aa.vnseumbldt9vq4uu \
>     --discovery-token-ca-cert-hash sha256:28b7199719f1409880704e77657ec30a527562501ec03870d7738c0aff5188cc

 

  • 노드 상태 확인
vagrant@kube-master1:~$ kubectl get nodes
NAME           STATUS     ROLES    AGE   VERSION
kube-master1   Ready      master   17m   v1.19.11
kube-node1     Ready      <none>   62s   v1.19.11
kube-node2     Ready      <none>   36s   v1.19.11
kube-node3     NotReady   <none>   12s   v1.19.11
728x90
728x90

암호 없이 ssh 로그인 설정


ssh 키 생성 및 복사

  • ssh 키 생성
vagrant@kube-master1:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:csgTKKowCqnYLPCzPPlZKMumIoe5RgJBXEMKep2uO9k vagrant@kube-master1
The key's randomart image is:
+---[RSA 2048]----+
|+.o+             |
|+....o           |
|.oo + .          |
|.+ o . o         |
|O   . = S        |
|X* . . +         |
|OoB+. .          |
|==B*Eo           |
|*=*+o            |
+----[SHA256]-----+

 

  • 각 노드들에 ssh 키 복사
vagrant@kube-master1:~$ ssh-copy-id vagrant@localhost
vagrant@kube-master1:~$ ssh-copy-id vagrant@kube-node1
vagrant@kube-master1:~$ ssh-copy-id vagrant@kube-node2
vagrant@kube-master1:~$ ssh-copy-id vagrant@kube-node3

 

  • 암호 없이 ssh 로그인 확인
vagrant@kube-master1:~$ ssh kube-node1
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-187-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon Jun 20 05:43:35 UTC 2022

  System load:  0.0               Processes:             99
  Usage of /:   3.4% of 38.71GB   Users logged in:       0
  Memory usage: 4%                IP address for enp0s3: 10.0.2.15
  Swap usage:   0%                IP address for enp0s8: 192.168.56.21


0 updates can be applied immediately.

New release '20.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

 

==> 모든 노드에서 스냅샷 생성: 1

 


 

쿠버네티스 설치


 

python3, python3-pip, git 설치

vagrant@kube-master1:~$ sudo apt update
vagrant@kube-master1:~$ sudo apt install -y python3 python3-pip git

 

kubespray 배포

  • kubespray git repository 클론
vagrant@kube-master1:~$ git clone --single-branch --branch v2.14.2 https://github.com/kubernetes-sigs/kubespray.git
vagrant@kube-master1:~$ ls
kubespray

 

  • requirements.txt 파일에서 의존성 확인 및 설치
vagrant@kube-master1:~$ cd kubespray/
vagrant@kube-master1:~/kubespray$ sudo pip3 install -r requirements.txt

 

 

인벤토리 구성

  • 인벤토리 준비
vagrant@kube-master1:~/kubespray$ cp -rfp inventory/sample inventory/mycluster

 

  • 인벤토리 수정
vagrant@kube-master1:~/kubespray$ vi inventory/mycluster/inventory.ini

# :% d 명령 실행으로 파일 내용 모두 지우기

 

  • 수정 내용
[all]  
kube-master1	ansible_host=192.168.56.11 ip=192.168.56.11 ansible_connection=local
kube-node1      ansible_host=192.168.56.21 ip=192.168.56.21
kube-node2      ansible_host=192.168.56.22 ip=192.168.56.22
kube-node3      ansible_host=192.168.56.23 ip=192.168.56.23

[all:vars]  
ansible_python_interpreter=/usr/bin/python3

[kube-master]  
kube-master1 

[etcd]  
kube-master1  

[kube-node]  
kube-node1  
kube-node2  
kube-node3  

[calico-rr]  

[k8s-cluster:children]  
kube-master  
kube-node  
calico-rr

 

  • 파라미터 확인 및 변경 (false -> true 변경)
vagrant@kube-master1:~/kubespray$ vi inventory/mycluster/group_vars/k8s-cluster/addons.yml

metrics_server_enabled: true
ingress_nginx_enabled: true

 

앤서블 실행

 

  • 앤서블 통신 확인
  • 각 호스트 별로 앤서블 통신이 가능한지 확인하고 success가 뜨면 쿠버네티스 설치 준비 완료
vagrant@kube-master1:~/kubespray$ ansible all -i inventory/mycluster/inventory.ini -m ping

 

  • 플레이북 실행
  • 앤서블을 통한 쿠버네티스 설치 시작 (약 20분 소요)
ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml --become

 

  • 설치 완료

 

 

  • 자격 증명 가져오기
vagrant@kube-master1:~/kubespray$ mkdir ~/.kube
vagrant@kube-master1:~/kubespray$ sudo cp ~root/.kube/config ~/.kube
vagrant@kube-master1:~/kubespray$ sudo chown vagrant:vagrant -R ~/.kube

 

kubectl 실행

  • kubectl 명령 자동 완성
vagrant@kube-master1:~/kubespray$ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
vagrant@kube-master1:~/kubespray$ exec bash

 

  • Kubernetes 클러스터 확인
vagrant@kube-master1:~$ kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
kube-master1   Ready    master   27m   v1.18.10
kube-node1     Ready    <none>   26m   v1.18.10
kube-node2     Ready    <none>   26m   v1.18.10
kube-node3     Ready    <none>   27m   v1.18.10

vagrant@kube-master1:~$ kubectl cluster-info
Kubernetes master is running at https://192.168.56.11:6443

 

==> 모든 노드에서 스냅샷 생성: kubespray 

728x90

+ Recent posts