반응형

 


작성일: 2024년 1월 9일

 

Intel CPU를 사용하는 Macbook을 사용했을 때는 아래와 같이 CPU 온도를 확인했었다.

$ sudo powermetrics -n 1 --samplers smc

 

그런데 m1 CPU를 사용하는 Macbook을 구입한 뒤로는 위 명령이 쓸모없게 되었다. 

왜냐하면 아래처럼 에러가 발생하기 때문이다.

$ powermetrics -n 1 --samplers smc

powermetrics: unrecognized sampler: smc

$

 

 

M1, M2 CPU를 장착한 Mac에서 CPU 온도 확인하는 방법.

 

 

그렇다면, m1 CPU를 장착한 Macbook에서는 어떻게 CPU 온도를 확인할까?

아래처럼 Hot 이라는 앱을 설치하면 된다.

 

$ brew install --cask hot
참고로 자세한 설명은 아래 공식 홈페이지를 읽어볼 것 !
  https://formulae.brew.sh/cask/hot

 

brew 명령으로 hot 앱이 설치되었다면, hot 앱을 구동한다. 아래 화면과 같이 m1 cpu 온도가 짠~하고 보여질 것이다.

 

macOS m1 CPU 온도 정보 확인 (Hot 앱)

 

macOS m1 CPU 온도 확인을 위한 Hot 앱

 

Parallels로 Windows 11 구동하고, 이것저것 업무에 필요한 앱을 많이 구동했는데 섭씨 31도 밖에 안 되네.

M1 CPU를 좋아할 수 밖에 없는 이유가 바로 이런 것 때문 ^^

 


 

'MacOS' 카테고리의 다른 글

macOS에 설치할 App (앱, 프로그램)  (0) 2023.11.23
macOS Sonoma에서 Parallels 17 비정상 동작  (0) 2023.11.03
Mac M1 프린터 드라이버 설치  (0) 2022.02.21
Mac 에서 기본 앱 설정 변경  (0) 2022.02.21
Mac에서 연말정산  (0) 2022.01.29
반응형

 



설치 및 테스트한 날짜: 2023년 4월 12일
Harbor version: v2.7.0

 

아래 문서에 준비 작업, 설정, 설치 과정이 자세히 설명되어 있다. 세부적인 설정이 필요하다면 아래 문서를 읽어보는 것이 좋다.

 

https://goharbor.io/docs/2.7.0/install-config/

 

Harbor – Harbor Installation and Configuration

Harbor Installation and Configuration

goharbor.io

 

 

1) 사전 준비 작업

아래 Web docs에 Harbor 운영에 필요한 HW 스펙 및 Software, Network port 정보가 있다.

 

https://goharbor.io/docs/2.7.0/install-config/installation-prereqs/

 

특별한 내용이 없으니까, 간단하게 읽고 패쑤~

 

 

2) Harbor Installer 다운로드 받기

아래 Web docs에 Harbor installer를 다운로드할 수 있는 절차가 설명되어 있다.

특별한 내용이 없으니까, 설명되어 있는 명령을 따라서 수행하면 된다.

 

  - 다운로드에 대한 설명 : https://goharbor.io/docs/2.7.0/install-config/download-installer/

  - 설치 파일 저장소:  https://github.com/goharbor/harbor/releases/tag/v2.7.0  (이 페이지의 제일 밑에 있는 링크를 사용)

  - 실제 다운로드한 파일: https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-offline-installer-v2.7.0.tgz

 

나는 여러 설치 파일 중에서 'harbor-offline-installer-v2.7.0.tgz' 파일을 다운로드 받았다.

그리고 이 tgz 압축 파일을 풀어준다.  (파일을 설정하고 실행하는 것은 뒤에서 다시 설명함)

 

3) Harbor 서버에 HTTPS Access하기 위한 인증서 만들기

OpenSSL 명령 도구를 잘 사용하는 사람이라면, 아래 Web docs의 예제 명령어를 조금 수정해서 수행하면 된다.

그런데 SSL 지식이 없거나 OpenSSL 명령 도구가 생소한 사람이라면, SSL을 공부하고 아래 Web docs 예제를 따라가는 것이 좋다.

 

https://goharbor.io/docs/2.7.0/install-config/configure-https/

 

내 경우, 위 문서의 예제 명령에서 "yourdomain.com" 부분만 실제 나의 internet domain name으로 변경하고 인증서를 만들었다.

 

 

4) 설정 파일 harbor.yaml 작성하기

위에서 다운로드한 'harbor-offline-installer-v2.7.0.tgz' 파일에 harbor.yml.tmpl 파일이 있다.

이 설정 파일을 내 상황에 맞게 편집하면 되는데, 솔직히 항목이 많고 설명을 읽어도 아리송한 부분이 있다.

내 경우는 전체 설정 항목 중에서 아래 예시와 같이 몇 개만 수정했다.

 

##
## 설정 Template 파일을 복사
##

$  cp  harbor.yml.tmpl  harbor.yml



##
## 설정 파일을 편집하기
##

$  vi  harbor.yml

... 중간 생략 ...

hostname: registry.sejong-world.kr

... 중간 생략 ...

https:
  port: 443
  certificate: /data/cert/sejong-world.kr.crt
  private_key: /data/cert/sejong-world.kr.key

harbor_admin_password: MyNewPass56789


$

 

 

 

5) 설치 Script 실행하기

아래 Web docs에 설명이 잘 되어 있어서 따라 하기만 해도 잘 설치된다.

 

https://goharbor.io/docs/2.7.0/install-config/run-installer-script/

 

단, 설치하는 방식에 따라 여러 옵션을 사용할 수 있는데 나는 Chart repository 서비스도 사용할 거라서

아래와 같이  --with-chartmuseum 옵션을 추가했다.

이 옵션으로 설치하면, container image registry와 chart repository 서비스를 모두 사용할 수 있다.

 

$ sudo ./install.sh --with-chartmuseum

 

 

위 옵션을 지정한 것 외에는 나머지 모든 설치 및 기동 종료 절차는 Web docs와 완전히 동일하게 수행했다.

문서의 설명이 간단했고, 따라만 해도 에러없이 설치가 술술 잘 되어서 부연 설명할 부분이 없다.

 

##
## Harbor 서버 종료하기  
##  (옵션 '-v'는 데이터 볼륨을 삭제하라는 뜻)
##

$  docker compose down -v


##
## Harbor 서버 시작하기 
##  (옵션 '-d'는 백그라운드에서 데몬 프로세스로 구동하라는 뜻)
##
$ docker compose up -d

 

 

 

 

 

 

 


 

반응형

 

 


 

Network Programming을 하다보면, curl을 이용해서 간단하게 테스트할 일이 종종 있다.

맨날 사용하는 개발자라면, 머릿속에 curl 사용법이 있어서 금방 명령어를 만들어서 사용하겠지만 나처럼 1년에 5번 정도 사용하는 사람은 매번 검색하는 것도 일이고 시간 낭비이다. 

그래서 자주 사용하는 명령 패턴을 메모를 좀 남겨놓고 필요할 때마다 Copy & Paste 해볼까 한다.

 

설치

아래 명령처럼 설치한다.

##
## Ubuntu 리눅스
##

$ apt install curl


## CentOS, RedHat Linux(RHEL)

$ yum install curl

 

 

CURL 명령의 주요 옵션

-X  (--request)

    HTTP Method.

    예를 들어 GET(조회), POST(데이터 생성), PUT(전체 내용 변경), DELETE, PATCH(일부 내용 변경)

 

-d  (--data)

   POST, PUT 메소드로 요청시 HTTP Body에 담아서 보낼 데이터

 

-H  (--header)

   HTTP Header 항목과 값을 정의

 

 

CURL 명령 예제

 

GET Method 예제

 

##
## Example - OCP에서 Node 정보를 가져오는 명령
##

TOKEN=$(oc whoami -t)
ENDPOINT="https://api.ocp.mycluster.io:6443"
NAME="worker1.ocp.mycluster.io"

curl -k \
    -H "Authorization: Bearer $TOKEN" \
    -H 'Accept: application/json' \
    -X GET  $ENDPOINT/api/v1/nodes/$NAME/status  
    
    
##
## Example - 요청 메시지에 Data를 포함하여 전송하기
##

curl -d "mykey1=myvalue1&mykey2=myvalue2" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -X GET http://mywebserver.example/api/v1
     
     
     
##
## Example - Query Parameter 형태로 요청 메시지를 전송하는 경우
##           이 때는 특수문자 또는 공백 문자 때문에 urlencode 처리를 해야 한다.
##
## 참고로, 아래 예시는 OCP Pod의 Memory 사용량 조회하는 API를 Call하는 것이다.
##

RESPONSE_FILE=curl-metric-node-cpu.json

curl -s -k -o $RESPONSE_FILE\
    -H "Authorization: Bearer $TOKEN" \
    -H 'Accept: application/json' \
    --data-urlencode "query=instance:node_memory_utilisation:ratio{job=\"node-exporter\", instance=\"worker4.ocp.mycluster.io\", cluster=\"\"} != 0" \
    $ENDPOINT/api/v1/query

 

POST Method 예제

 

##
## Example - URL 형식의 Data 전송
##

$  curl -d "mykey1=myvalue1&key2=myvalue2" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -X POST  http://my.webserver.example/api


##
## Example - JSON 형식의 Data 전송
##
$  curl -d '{"mykey1":"myvalue1", "mykey2":"myvalue2"}' \
        -H "Content-Type: application/json" \
        -X POST  http://my.webserver.example/api

 

 

 

반응형

 


 

 

이 블로그 내용을 테스트한 날짜: 2023년 02월 17일

 

 

아래 예시처럼 따라하면, Kubernetes 자원에 대한 Metrics 정보를 볼 수 있다.

단, 아래 절차에서 "NOTE:" 라고 표시된 부분을 추가해야 한다.

 

##
## 아래 명령을 수행해서 metrics-server를 설치하기 위한 manifest file을 download한다.
##
$  curl -L https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -o components.yaml


## 
## 다운로드한 components.yaml 파일에
## "--kubelet-insecure-tls=true" 옵션을 추가한다.
##  (아래 예제를 따라하면 된다)
$  vi components.yaml
... 중간 생략 ...
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-insecure-tls=true     ## <-- NOTE: 이 부분을 추가한다.
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2
... 중간 생략 ...        


$  kubectl apply -f components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
$

$  kubectl  get  -n kube-system  pod  -l k8s-app=metrics-server
NAME                             READY   STATUS    RESTARTS   AGE
metrics-server-ddfcd777b-lktxx   1/1     Running   0          67s

$ kubectl  top  node
NAME      CPU(cores)   CPU%   MEMORY(bytes)    MEMORY%
node-69   219m         5%     23607Mi          24%
node-73   202m         5%     48753Mi          50%
node-75   173m         4%     51048Mi          52%
... 중간 생략 ...

$ kubectl  top  -n istio-system  pod --containers
POD                                     NAME                                 CPU(cores)   MEMORY(bytes)
grafana-68cc7d6d78-7kjw8                grafana                              3m           51Mi
istio-egressgateway-6cb7bdc7fb-2wg57    istio-proxy                          3m           47Mi
istio-ingressgateway-694d8d7656-fk4tw   istio-proxy                          7m           62Mi
istiod-6c68579c55-xk6cm                 discovery                            2m           80Mi
jaeger-5d44bc5c5d-rb4v6                 jaeger                               10m          3612Mi
kiali-fd9f88575-z4wrm                   kiali                                1m           131Mi
prometheus-77b49cb997-zvjm8             prometheus-server                    9m           454Mi
prometheus-77b49cb997-zvjm8             prometheus-server-configmap-reload   1m           6Mi
... 중간 생략 ...
$

 

위에서 "--kubelet-insecure-tls=true" 라고 설정을 추가했는데, 자세한 설명은 아래 원문을 참고할 것~~~

Metrics Server Pod랑 Kubelet 이랑 API 연동할 때, CA(Certificate Authority)를 검사하지 말고 연동하라는 뜻이다.

 

kubelet-insecure-tls 옵션에 대한 설명

 

 

Reference

딱히 어려운 내용이 없어서, 아래 원문을 읽고 따라해도 잘 설치되고, 동작한다.

 

GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in aut

Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. - GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container reso...

github.com

 

반응형

Concept

  • Control node: Ansible을 실행하는 Node
  • Managed node: Ansible 관리 대상이 되는 Node

 

Installation

$ sudo yum install epel-release
$ sudo yum install ansible

## Adding Ansible command shell completion
##  -> 이것은 편의를 위한 기능이니, 꼭 설치할 필요는 없다
$ sudo yum install python-argcomplete
$ sudo activate-global-python-argcomplete

## Let's check the version
$  ansible --version
ansible 2.9.25
...

## host inventroy file을 편집
$ cat /etc/ansible/hosts
...
[kubeworker]
10.10.12.64
10.10.12.71

[mynode]
10.10.12.64
...
$

##
## TEST for installation
##

$ ansible all --list-hosts
  hosts (2):
    10.10.12.64
    10.10.12.71
    
$ ansible all -m ping
10.10.12.64 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
10.10.12.71 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 10.10.12.71 port 22: No route to host",
    "unreachable": true
}
$

 

Run example playbook - 1

##
## Run this playbook on control node
##

$  cat  playbook-example.yaml
---
- name: Add_sample_contents_to_file
  hosts: mynode

  tasks:
  - name: Add sample contents to file
    blockinfile:
      path: /root/sample_a.txt
      block: |
        [my test section]
        best contents
        greeting=hello       
$
$  ansible-playbook playbook-example.yaml

PLAY [Add_sample_file] ************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************
ok: [10.10.12.64]

TASK [Add sample file] ************************************************************************************************************
changed: [10.10.12.64]

PLAY RECAP ************************************************************************************************************************
10.10.12.64                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$

##
## Check result of test on managed node(10.10.12.64)
##

$  cat  /root/sample_a.txt
# BEGIN ANSIBLE MANAGED BLOCK
[my test section]
best contents
greeting=hello
# END ANSIBLE MANAGED BLOCK
$

 

Run example playbook - 2

##
## Run this playbook on control node
##

$  cat  playbook-example-2.yaml
---
- name: Install pkg and create a file
  hosts: mynode

  tasks:
  - name: Install kubernetes pkg
    yum: name=tree state=present
    when: ansible_distribution == 'CentOS'
  - name: Run my command
    command: "touch /root/mydate.txt"
    when: ansible_distribution == 'CentOS'     
$
$  ansible-playbook playbook-example-2.yaml
...
$

##
## Check result of test on managed node(10.10.12.64)
##

$  which tree
/usr/bin/tree

$  ls /root/mydate.txt
/root/mydate.txt

 

Tip:   특정 User로 Ansible 실행

managed node에서 특정 user(예: root)로 실행되길 원한다면, 아래와 같이 설정 파일을 작성한다.

$  cat  /etc/ansible/ansible.cfg
...

[privilege_escalation]
become=True
become_method=sudo
become_user=root        ## Root user로 명령을 수행한다.
become_ask_pass=False   ## password를 묻지 않고 명령을 수행한다.

...

$

 

 

 

Reference

https://young-dev.com/infra/ansible_02/#

 

[Ansible] Ansible-Playbook 사용하기 #2

Ansible-Playbook 활용

young-dev.com

 

 

 

 

'CentOS' 카테고리의 다른 글

CPU Pinning 예제 코드  (0) 2022.06.17
Install Ansible AWX (version 17.1.0)  (0) 2021.11.16
Install OS with PXE and kickstart  (0) 2021.11.12
Samba(SMB) on CentOS  (0) 2021.07.10
Network config on CentOS 8  (0) 2021.07.10
반응형

 

 

사람의 개입을 최소화하면서 OS를 자동 설치하는 절차를 설명하겠다.

OS를 자동 설치하는 큰 흐름은 아래 그림과 같다.

 

 

 

OS 자동 설치 절차 개요

 

DHCP, TFTP를 이용한 PXE Booting 절차

 

 

 

PXE 개념

 

PXE(Preboot Execution Environment)는 Network를 통해 OS Booting에 필요한 정보를 전달하기 위한 기술이다.

 

 

PXE를 동작시키기 위한 구성 요소

  • Server 구성 요소
    • DHCPD: DHCP Server 역할을 수행.  Client Node에게 설정해줘야할 Network 구성 정보를 전달해준다.
    • TFTP: Client의 PXE Boot image를 배포한다.
    • FTP: PXE booting 이후, OS Image 및 SW PKG를 설치할 때 필요한 File을 배포한다.
    • Kickstart: Client가 OS를 설치할 때, Kickstart 설정 파일을 읽어서 OS 설치 작업을 자동화한다. (Network 설정, 특정 PKG 설치 여부 결정, Account 생성, 인증서 복사 등)
  • Client 구성 요소
    • BIOS/NIC: BIOS에서 PXE boot를 지원해야 한다.

 

 

 

준비 작업 (Server Software PKG 설치 + 설정 파일 작성)

 

Server PKG 설치

$ yum install -y  dhcpd tftp ttfp-server xinetd vsftpd syslinux
$ systemctl enable --now dhcpd
$ systemctl enable --now tftp
$ systemctl enable --now xinetd
$ systemctl enable --now vsftpd

 

 

DHCPD Server 설정

$  cat /etc/dhcp/dhcpd.conf

...

allow booting;
allow bootp;
allow unknown-clients;

subnet 10.10.12.0 netmask 255.255.255.0 {
  range           10.10.12.64 10.10.12.79;
  option routers  10.10.12.1;
  option broadcast-address 10.10.12.255;
  option subnet-mask 255.255.255.0;
  option domain-name-servers 10.10.100.2;
  get-lease-hostnames true;
  next-server     10.10.12.33;              ## NOTE: TFTP Server 주소를 설정
  filename        "pxelinux.0";             ## NOTE: Boot Image 정보를 설정
}

...

 

 

TFTP Server 설정

$  cat  /etc/xinetd.d/tftp

service tftp
{
	socket_type		= dgram
	protocol		= udp
	wait			= yes
	user			= root
	server			= /usr/sbin/in.tftpd
	server_args		= -s /var/lib/tftpboot   ## NOTE: boot image file을 저장할 directory
	disable			= no                     ## NOTE: 'no'로 변경
	per_source		= 11
	cps			= 100 2
	flags			= IPv4
}

 

 

FTP Server 설정

## 모든 client가 vsftpd에 access하는 것을 허용하기 위한 설정
## (ID, Password 없이 FTP server에 access하는 것이 가능)

$  setsebool -P allow_ftpd_full_access 1

 

 

syslinux file 복사

##  Client에게 전달할 syslinux boot loader 파일을 TFTP 서버 폴더에 복사한다.

$  cp /usr/share/syslinux/pxelinux.0  /var/lib/tftpboot
$  cp /usr/share/syslinux/menu.c32    /var/lib/tftpboot
$  cp /usr/share/syslinux/memdisk     /var/lib/tftpboot
$  cp /usr/share/syslinux/mboot.c32   /var/lib/tftpboot
$  cp /usr/share/syslinux/chain.c32   /var/lib/tftpboot

 

 

PXE Menufile 작성

 

##  TFTP 서버의 /var/lib/tftpboot/pxelinux.cfg/default 파일에 아래와 같은 내용을 작성한다.

$  cat  /var/lib/tftpboot/pxelinux.cfg/default

default menu.c32
prompt 0
timeout 30

menu title Homelab PXE Menu

label centos7_x64
  menu label CentOS 7_X64
  kernel /networkboot/centos/vmlinuz
  append initrd=/networkboot/centos/initrd.img inst.repo=ftp://10.10.12.33/pub/centos ks=ftp://10.10.12.33/pub/centos/centos7.cfg

 

 

Linux OS image file 준비

##  FTP server에 Linux OS image file을 복사하는 절차

$  mkdir  /media/iso
$  mount  /myhome/CentOS-7-x86_64-2009.iso  /media/iso
$  mkdir  -p  /var/ftp/pub/centos
$  cp -r  /media/iso/*  /var/ftp/pub/centos/
##  준비 작업을 마무리했다면, FTP 서버에 접근 가능한지 아래와 같이 확인한다.
##  (가능하면 Remote Node에서 테스트할 것)

$  curl ftp://x-node.hub.cncf/pub/centos/
-rw-r--r--    1 0        0              14 Oct 29  2020 CentOS_BuildTag
drwxr-xr-x    3 0        0              35 Oct 26  2020 EFI
-rw-rw-r--    1 0        0             227 Aug 30  2017 EULA
-rw-rw-r--    1 0        0           18009 Dec 09  2015 GPL
drwxr-xr-x    2 0        0              43 Oct 26  2020 LiveOS
drwxr-xr-x    2 0        0          225280 Nov 04  2020 Packages
-rw-rw-r--    1 0        0            1690 Dec 09  2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r--    1 0        0            1690 Dec 09  2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--    1 0        0            2883 Nov 04  2020 TRANS.TBL
-rwxr-xr-x    1 0        0            1833 Nov 09 10:16 centos7-graphical-server.cfg
-rwxr-xr-x    1 0        0            1708 Nov 10 14:37 centos7-ok-11-10.cfg
-rwxr-xr-x    1 0        0            5462 Nov 11 10:16 centos7-ok-11-11-2nd.cfg
-rwxr-xr-x    1 0        0            3381 Nov 11 01:39 centos7-ok-11-11.cfg
-rwxr-xr-x    1 0        0            5633 Nov 11 16:14 centos7-ok-11-12.cfg
-rwxr-xr-x    1 0        0            5739 Nov 12 03:09 centos7.cfg
drwxr-xr-x    3 0        0              57 Oct 26  2020 images
drwxr-xr-x    2 0        0             198 Nov 02  2020 isolinux
drwxr-xr-x    2 0        0            4096 Nov 04  2020 repodata
##  TFTP server 저장소에 PXE kernel image file을 복사하는 절차


$  mkdir  /var/lib/tftpboot/networkboot/centos
$  cp  /var/ftp/pub/centos/images/pxeboot/{inird.img,vmlinuz}  /var/lib/tftpboot/networkboot/centos/

 

 

Kickstart Configuration File 작성

centos7.cfg 파일의 내용이 길어서 보기 어려울 수 있으나, 원래 OS 패키지에 기본 제공되는 centos7.cfg에 일부 내용만 수정하면 된다.

(참고:  /root/centos7.cfg 같은 곳에 OS 배포판에서 제공하는 기본 kickstart configuration 파일이 있다)

 

$  cat  /var/ftp/pub/centos/centos7.cfg 

## System authorization information

auth --enableshadow --passalgo=sha512

## Andrew
##  Use network installation
url --url="ftp://10.10.12.33/pub/centos/"

## Use graphical install
#graphical
text

## Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=vda

## Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'

## System language
lang en_US.UTF-8

## Network information
network  --bootproto=dhcp --device=eth0 --nameserver=10.10.12.2,10.10.12.3 --noipv6 --activate

## Root user's password
## NOTE:  Run this command `openssl passwd -1 mysmilepass`
##        and use the result string as a password for user.
rootpw --iscrypted $1$HC34jk4576jk23j4kljk5l6jk2j345kj

## System services
services --disabled="chronyd"

## System timezone
timezone Asia/Seoul --isUtc --nontp

## NOTE:  Run this command `openssl passwd -1 myhappypass`
##        and use the result string as a password for user.
user --groups=wheel --name=sejong --password=$1$HC34jk4576jk23j4kljk5l6jk2j345kj --iscrypted --uid=1000 --gecos="sejong" --gid=1000

## X Window System configuration information
#xconfig  --startxonboot

## System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=vda
autopart --type=lvm

## Partition clearing information
clearpart --all --initlabel --drives=vda

## Install software application
%packages
@^minimal
@base
@core
kexec-tools
net-tools
chrony
%end

## Enable KDUMP
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

## Policy of user password
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end


##
## NOTE (By Andrew)
##  Refer to  https://docs.centos.org/en-US/centos/install-guide/Kickstart2/#sect-kickstart-postinstall
##
%post --interpreter=/bin/bash

## NOTE (By Andrew)
myhostname=$(nslookup  $(hostname -I | awk '{print $1}') 10.10.12.30 | awk '{print $4}' |  cut -d '.' -f1)
hostname $myhostname
echo $myhostname > /etc/hostname

## Add authorized_keys for root user
mkdir  --mode=0700 /root/.ssh

cat << EOF > /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yaskdjfkjk34634jkdkfjg.....= sejong@MacBook-Pro.local
EOF

chown  -R root:root  /root/.ssh
chmod  0600  /root/.ssh/authorized_keys

## Add authorized_keys for sejong user
mkdir  --mode=0700 /home/sejong/.ssh

cat << EOF > /home/sejong/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yaskdjfkjk34634jkdkfjg.....= sejong@MacBook-Pro.local
EOF

chown  -R sejong:sejong  /home/sejong/.ssh
chmod  0600  /home/sejong/.ssh/authorized_keys

##
## Install Docker, Kubernetes
##
modprobe br_netfilter

cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

## disable swap space
sed -i '/swap/d' /etc/fstab
swapoff -a

## disable firewalld
systemctl stop firewalld
systemctl disable firewalld

## Install Docker container runtime
yum install -y yum-utils
yum-config-manager  --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl  enable  docker
systemctl  start   docker

mkdir -p /etc/docker
cat <<EOF | tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "insecure-registries": ["myhost.cncf:8080", "yourhost.cncf:8080"]
}
EOF

systemctl daemon-reload
systemctl restart docker

## Install kubeadm, kubelete
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

setenforce 0
sed  -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum  install  -y kubelet kubeadm kubectl  --disableexcludes=kubernetes
systemctl enable --now kubelet

chmod +x /etc/rc.d/rc.local
systemctl enable --now  rc-local.service

echo "END OF POST-SCRIPT" > /root/kickstart.log

%end


## Andrew
##  reboot after finishing installation
reboot

 

 

Ansible Playbook 작성 (Option)

만약, kickstart configration만으로 OS 초기화/설정하기 어려운  복잡한 Job이 있다면, 아래 예시처럼 Ansible playbook을 작성해서 좀 더 복잡하고 지능적인 처리가 가능하다.

 

## playbook-kube-cluster-join.yaml

- name: Joining Job Step 1 on Master node
  hosts: kubemaster
  tasks:
    - name: Generate join command
      command: kubeadm token create --print-join-command
      register: join_command
    - name: Copy join command to local file
      local_action: copy content="{{ join_command.stdout_lines[0] }}" dest="./join-command"

- name: Joining Job Step 2 on Worker node
  hosts: kubeworker
  tasks:
    - name: Copy the join command to server location
      copy: src=join-command dest=/tmp/join-command.sh mode=0777
    - name: Join the node to cluster
      command: sh /tmp/join-command.sh

 

 

 

 


 

준비 작업은 끝났다.

공장 초기화된 컴퓨터, 또는 VirtualBox 프로그램, 또는 KVM/Qemu의 Virtual Manager로 아래 예제처럼 Machine Start만 하면 된다.

 

 

OS  자동 설치 실행

 

나는 KVM/Qemu + Virtual Manager 조합으로 VM을 만드는 것을 좋아하기 때문에 KVM을 예시로 들었다.

Hypervisor는 어떤 것을 사용하든 PXE로 부팅하는 기능은 동일하기 때문에, 다른 Hypervisor를 사용하더라도 아래 절차는 비슷하다.

 

깡통 컴퓨터의 Booting Option 메뉴에서 또는 VM을 새로 생성하면서 PXE 옵션을 선택한다.

 

VM 생성시 PXE Network Boot 옵션 활성화

 

위와 같이 PXE boot 옵션을 선택 후, booting을 시도하면 아래 화면처럼 DHCP 서버에서 Network 주소 및 TFTP 정보를 가져와서 TFTP에서 boot image file을 가져온다. 이후부터는 자동으로 OS를 설치하고, kickstart confiration file에 있는 OS 설정 작업을 자동 수행한다.

 

PXE Booting 화면

 

 

 

Reference

 

'청년정신'님이 2019년 4월에 작성한 'PXE 기반의 CentOS  자동 구축' 블로그가 제일 잘 정리된 글 같다.

 

 

PXE 기반의 CentOS 설치 1부

 

 

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 1편

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 1편 [ PXE 개념 소개 및 구성요소 ] PXE (Preboot Excution Environment) 기반의 운영체제 자동설치 방법은 앞서 강좌에서 소개한 다양한 서버 구축 기..

youngmind.tistory.com

 

 

PXE 기반의 CentOS 설치 2부

 

 

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 2편

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 2편 "CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 1편" 에 이어서… 10. KickStart 구성 먼저 kickstart 파일을 구성한다. Kickstart 파일..

youngmind.tistory.com

 

 

추가로, CentOS를 kickstart를 이용해서 자동 설치하려는 경우라면, 아래 Install guide를 참고하면 좋다.

 

 

Kickstart Installations :: CentOS Docs Site

Kickstart installations offer a means to automate the installation process, either partially or fully. Kickstart files contain answers to all questions normally asked by the installation program, such as what time zone you want the system to use, how the d

docs.centos.org

 

'CentOS' 카테고리의 다른 글

CPU Pinning 예제 코드  (0) 2022.06.17
Install Ansible AWX (version 17.1.0)  (0) 2021.11.16
How to use Ansible and Playbook  (0) 2021.11.12
Samba(SMB) on CentOS  (0) 2021.07.10
Network config on CentOS 8  (0) 2021.07.10
반응형

Kubernetes cluster(쿠버네티스 클러스터)를 구축하는 것을 도와주는 여러 도구(kubeadm, kubespray, kops)가 있다.

이 문서에는 그런 kubernetes cluster 구축 도구 중에서 kubeadm을 이용하여 kubernetes cluster를 구축하는 방법을 설명한다.

참고로, 이 문서를 작성하는 시점은 2021년 6월 30일이고, 오늘 Kubernetes cluster를 구축하면서 이 문서에 그 구축 과정을 기록한 것이다.

 

Kubernetes Cluster 구축을 위한 계획하기

CentOS 7.9를 설치한 Master node와 Worker node를 준비한다.

Master Node: 1개 (master-0)

Worker Node: 2개 (worker-0, worker-1)

 

 

Master Node와 Worker Node 준비 작업

master node와 worker node 모두에서 아래의 작업을 수행한다.

kubernetes는 iptables를 이용하여 pod간 통신을 가능하게 한다. 따라서 iptables가 정상 동작하도록 하기 위해 아래와 같이 설정한다.

$  sudo modprobe br_netfilter

$  lsmod | grep br_netfilter
br_netfilter           22256  0
bridge                151336  1 br_netfilter

$  cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

$  cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$  sudo sysctl --system

 

모든 master node, worker node에서 swap 영역을 비활성화한다.

$  sudo sed -i '/swap/d' /etc/fstab
$  sudo swapoff -a
$  free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        1.0G         13G         13M        925M         14G
Swap:            0B          0B          0B
$

 

방화벽(Firewalld)를 비활성화한다.

(원칙은 kubernetes가 사용하는 service port만 allow 설정해야 하지만, 여기서는 간단하게 firewalld를 종료하는 것으로 하겠다)

$  systemctl stop firewalld
$  systemctl disable firewalld

 

Docker Engine 설치 (Installing Container Runtime)

container runtime에는 containerd, CRI-O, Docker 등 다양한 SW가 있지만, 이 문서에서는 Docker 제품을 설치한다.

참고: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker

 

Old version의 Docker engine을 제거한다.

$  sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

 

Docker 패키지가 있는 Yum Repository를 추가한다.

 $  sudo yum install -y yum-utils
 
 $  sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

 

Docker engine을 설치하고, 기동한다.

$  sudo yum install -y docker-ce docker-ce-cli containerd.io

$  sudo systemctl start docker

# 아래와 같이 'hello-world' container image를 다운로드해서 docker engine이 정상 동작하는지 확인한다.
$  sudo docker run hello-world

 

Container의 Cgroups에 관한 설정 내용을 추가한다.

$  sudo mkdir /etc/docker
$  cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2", 
# 만약 Private container image registry으로부터 `docker image pull`을 하고 싶다면,
# 아래와 같이 'insecure-registries' 항목에 private container image registry의 주소를 추가한다.
# 이렇게 하면, 별도의 Certificate 없이 docker client가 container image registry에서
# container image를 pulling할 수 있다.
  "insecure-registries": ["10.10.3.33:8080", "my-harbor.sejong.space:8080"]
}
EOF

 

Docker engine을 재시작한다.

$  sudo systemctl enable docker
$  sudo systemctl daemon-reload
$  sudo systemctl restart docker

 

여기까지 설명이  master node, worker node에서 준비해야 할 작업이다.

이 다음 설명부터 실제 kubernetes cluster를 구축하기 위한 작업이다.

 

 


 

kubeadm, kubelet, kubectl 설치

kubeadm: kubernetes cluster를 구축하기 위한 명령 도구

kubelet: master node, worker node에서 데몬 프로세스로 기동되어 있으면서, container와 pod를 생성/삭제/상태를 감시한다.

kubectl: 사용자가 kubernetes cluster에게 작업 요청하기 위한 명령 도구 (예를 들어, 'pod를 생성해달라!'  'pod의 개수를 늘려달라!' 같은 사용자 명령을 kunernetes API server에게 전달)

 

아래의 명령을 따라 하여 kubeadm, kubelet, kubectl 명령 도구를 설치한다. (모든 장비에서 수행해야 함)

# 아래 명령을 모든 'Master node, Worker node'에서 수행해야 한다.

$  cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# Set SELinux in permissive mode (effectively disabling it)
$  sudo setenforce 0

$  sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

$  sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

$  sudo systemctl enable --now kubelet

 

Kubernetes Cluster 생성하기

아래 명령을 master-0 node에서 수행한다.

# 반드시 `master-0` node에서만 수행해야 한다.
$  kubeadm init --pod-network-cidr=10.244.0.0/16
...
...

# 위 명령은 2분 ~ 3분 정도 소요된다.
# 꽤 오랜 시간이 걸리니까, 인내심을 가지고 기다려야 한다.
# 
# 그리고 위 명령의 출력 내용 중에서 아래의 내용을 복사하여 명령행에 붙여 넣고 수행해야 한다.
# (참고: 이 문서의 뒷 부분에서, 아래 설정 파일 'admin.conf'를 이용해서 
#       Kubernetes cluster 외부에서 Kubernetes API 서버에 접속하는 방법을 설명할 것이다)

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

위 명령을 수행하고 바로 Container Network Interface(CNI) 설치하는 작업을 수행해야 한다.

 

CNI 설치

CNI에는 많은 종류가 있지만, 사용하기 쉽고 대중적인 Calico 또는 Flannel CNI를 설치하겠다.

(A) CNI로써 Calico를 설치하는 경우  <-- 추천

$  kubectl apply  -f https://docs.projectcalico.org/manifests/calico.yaml

(B) CNI로써 Calico를 설치하는 경우 <-- 나는 개인적으로 별루~  (몇달 운영하다보면, Error  발생한 경험이 있어서)

$  kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 

위 CNI 설명 명령이 수행된 후, 아래와 같이 Pod의 기동 여부를 확인한다.

$  kubectl get pod -A
NAMESPACE     NAME                                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-558bd4d5db-4qglz                             1/1     Running   0          117m
kube-system   coredns-558bd4d5db-znw7h                             1/1     Running   0          117m
kube-system   etcd-master-0.kube.namiso.space                      1/1     Running   0          117m
kube-system   kube-apiserver-master-0.kube.namiso.space            1/1     Running   0          117m
kube-system   kube-controller-manager-master-0.kube.namiso.space   1/1     Running   0          117m
kube-system   kube-flannel-ds-wnbjv                                1/1     Running   0          115m
kube-system   kube-proxy-8gsdl                                     1/1     Running   0          117m
kube-system   kube-scheduler-master-0.kube.sejong.space            1/1     Running   0          117m
$

 

※ 참고

위 명령 `kubectl apply -f .......calico.yaml` 을 수행 후 CNI 설치에 문제가 있었다면, Pod 'coredns-xxxxxx'  구동하지 못하고 'pending' 상태로 남게 된다.

그런 경우는 대부분 `kubeadm init --pod-network-cidr=10.244.0.0/16` 명령을 수행했을 때 사용했던 CIDR 값이 master node, worker node의 물리 주소와 겹치는 경우에 문제가 발생한다. 따라서 '10.244.0.0/16' 값이 아닌 다른 값으로 다시 변경해서 kubernetes cluster를 생성해보면 문제가 해결될 수 있다.

 

Worker node joining

위에서 `kubeadm init --pod-network-cidr=10.244.0.0/16` 명령을 수행했을 때, 출력되었던 메시지 중에 `kubeadm join ....` 과 같은 형태의 메시지가 있었을 것이다. 그 메시지를 복사해서  모든 worker node에서 수행한다.

# worker-0, worker-1에서 아래의 명령을 수행한다.
kubeadm join 10.10.12.39:6443 --token pdfjgjas.psdfjbh kajsdjhasdfv \
    --discovery-token-ca-cert-hash sha256:3nasklj46kj234k5lj12k3j4gkfdjjgdsfh51a3a686

위 명령이 수행된 이후에 master-0 node에서 아래의 명령으로 cluster 구축된 결과를 확인한다.

$  kubectl get node
NAME                         STATUS   ROLES                  AGE    VERSION
master-0.kube.sejong.space   Ready    control-plane,master   3m     v1.21.2
worker-0.kube.sejong.space   Ready    <none>                 1m     v1.21.2
worker-1.kube.sejong.space   Ready    <none>                 1m     v1.21.2

 

Kubernetes cluster 삭제 (Tear down)

만약 깔끔하게 kubernetes cluster를 지우고, 처음부터 다시 구축하고 싶다면 아래와 같이 cluster를 reset 한다.

$  kubeadm reset;   rm -rf  $HOME/.kube  /etc/kubernetes;   rm -rf /etc/cni

 

 

Bastion Node 설정

위 설명에서는 kubectl 명령을 master-0 node에서 수행했다.

그러나 일반적으로 master-0에 직접 SSH 접속해서 kubectl 명령을 수행하는 것을 권장하지 않는다.

kubernetes cluster node는 운영 node이기 때문에 개발자가 접속하는 것이 바람직하지 않다.

(어쩌면, 보안 규정상 개발자가 master node에 SSH 접속하는 것 자체를 허용하지 않는 회사도 있을 것이다)

따라서 master-0 node가 아닌 본인의 PC(예를 들어 MacBook 같은 PC)에서 접속하는 방법을 사용하는 것을 권장한다.

방법은 간단하다.

master-0 node에 있는 /etc/kubernetes/admin.conf 파일을 내 PC(예를 들어 Macbook)에 복사하기만 하면 된다.

# MacOS를 사용한다고 가정하고 설명하겠다.
$  mkdir -p $HOME/.kube
$  cd $HOME/.kube
$  master-0 node의 '/etc/kubernetes/admin.conf' 파일을 내 PC로 내려받는다.
$  mv  admin.conf  config

# 내 PC에서 Kubernetes cluster의 API 서버로 잘 접속하는지 아래와 같이 명령을 수행해본다.
$  kubectl get node
NAME                         STATUS   ROLES                  AGE    VERSION
master-0.kube.sejong.space   Ready    control-plane,master   128m   v1.21.2
worker-0.kube.sejong.space   Ready    <none>                 126m   v1.21.2
worker-1.kube.sejong.space   Ready    <none>                 126m   v1.21.2
$

 


 

이 아래 부분에서 설명하는 작업 절차는 Kubernetes를 운영하는 데 있어서 꼭 필요한 것은 아니고, Web Dashboard로 좀 더 예쁘게 Kubernetes cluster를 모니터링하고 싶은 경우에 아래 Web Dashboard 설정 작업을 해주면 좋다.

 

Kubernetes Web Dashboard 설치 및 설정

내가 참고했던 Web docs(https://waspro.tistory.com/516) 가 있고, 이 문서에서 설명한 3가지 방식 중에서 3번째 방식(Kubernetes API Server 연동 방식)을 사용하는 것을 권장한다.

이 Web Docs에 설명이 잘 되어 있어서 내가 별도 설명할 필요 없을 것이고, 내가 수행했던 명령만 로그로 남겨보겠다.

 

$  kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
$  kubectl proxy   &

# Service Account 생성

$  cat <<EOF | kubectl create -f -
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: admin-user
   namespace: kube-system
EOF
$

# ClusterRoleBinding을 생성

$  cat <<EOF | kubectl create -f -
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
   name: admin-user
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
   name: cluster-admin
 subjects:
 - kind: ServiceAccount
   name: admin-user
   namespace: kube-system
EOF
$

# 사용자 계정의 Token 확인
$  kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') 
Name:         admin-user-token-p9ldd
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=041cb7ec-946a-49b6-8900-6dc90fc08464

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6InFmdGVUUnB6QmhoOHhlSDBJLUNLVHlEWWxpd2ZVaDhBVjZOQXE5TElhVWsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWZ2dG5uIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJjOGExZTY3MS00NmY1LTQwZjctODNkYy02YTE4N2NiYzkzYmYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.lKKD4yEvlpFJ7-BNuPTyO3YRuFYYdQMgPX5azXwn4bZiki2Y886k1dnNM16L4YuA_SSahrPtitSzPfevlAoeC5msdDg1DKRdFuGuYkkI_u_KvOv7orMopDDgZs0zuXFrHIZa1-qiWbgvHfgokOMvndchCcMHyo8pKD3vdBAq_AxtGlCIPImkfALM_d41FrBKIXEjdoCcHkPu7Cz13UAxNRBRs-d274g2UNz-MUnNiomDhJlcYFXTXeooKjHhUiyoFLCgP-V6Wh_1QSCwdfYZGQ1bF0QcZINQZdwluyOtP43AjXHxdSBrAGIPfaY7qsBR_b2upuUDnQsA1w7qkaQB0g     <== 이 빨간색 token을 Web dashboard login 화면에 붙여 넣고, "Sign-in" 버튼을 누른다.
$

 

위와 같이 ServiceAccount와 ClusterRole을 설정하고, secret을 생성/등록한 후에 Web Browser에서 접속하면 된다.

 

접속 주소 예시:  http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

 

 

 

 

Troubleshooting & How to clear the issue

kubeadm join  명령이 실패하는 경우.

대부분 master node에서 생성한지 1시간이 초과된 token 값을 이용해서 worker node에서 join하려고 하면 

'kubeadm join' 명령이 실패한다.

worker node 1, 2, ... 9 이런 식으로 순차적으로 작업하다가 보면, 거의 끝 부분에 있는 worker node 9는 이미 1 시간이 지난 뒤에

'kubeadm join'을 하게 되므로 종종 실패하게 된다.

그러나 심각한 문제는 아니고, master node에서 'kubeadm token create ...' 명령을 사용해서 다시 token 값을 생성해주기만 하면 된다.

아래와 같이 master node에서 token create하고, worker node에서 새로 만들어진 token 값으로 `kubeadm join'하면 된다.

## On master node.
$ kubeadm token create --print-join-command
kubeadm join 10.10.3.33:6443 --token z53s7g.aa...zc --discovery-token-ca-cert-hash sha256:372...3a686


## On worker node.
$ kubeadm join 10.10.3.33:6443 --token z53s7g.aa...zc --discovery-token-ca-cert-hash sha256:372...3a686
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
$


## 위와 같이 worker node의 joining이 성공하면, 
## 그 동안 activating (auto-restart) 상태였던 kubelet에 아래와 같이 active(running) 상태로 바뀐다.
## On worker node.
$ systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Thu 2021-11-11 15:38:54 KST; 17s ago
   ...
   ...
 $

위와 같이 Active: active (running) 상태로 출력되면, 정상적으로 kubelet이 기동되고 Master node와 연동된 것이다.

 

+ Recent posts