본문 바로가기
Docker&K8S

[docker&k8s] docker&k8s 기본 설명/설치 및 설정

by 오송나라 2024. 4. 24.
728x90
SMALL
안녕하세요. 오송입니다.

 

오늘은 간단하게 docker와 k8s 설치 및 설정 테스트를 해보도록 하겠습니다.

 

천천히 따라오시면서 모르는 부분이 있으시면, 댓글 달아주시면 됩니다.


클라우드 컴퓨팅 개요

클라우드 컴퓨팅이란?

클라우드 컴퓨팅은 컴퓨팅 리소스를 인터넷을 통해 서비스로 사용할 수 있는 주문형 서비스이다. 기업에서 직접 리소스를 조달하거나 구성, 관리할 필요가 없으며, 사용한 만큼 비용을 지불한다.

클라우드 컴퓨팅의 이점

유연성

클라우드 컴퓨팅의 아키텍처 덕분에 기업과 사용자가 인터넷만 연결되면 어디서나 클라우드 서비스에 액세스하고 필요에 따라 서비스를 확장하거나 축소할 수 있다.

효율적

기업에서 기본 인프라에 대한 걱정 없이 새로운 애플리케이션을 개발하여 빠르게 프로덕션에 배포할 수 있다.

보안

클라우드 컴퓨팅 보안은 일반적으로 클라우드 공급업체에 사용되는 보안 메커니즘의 수준 및 범위로 인해 업 내 데이터 센터보다 강력한 것으로 인식된다.

비용 효율성

어떤 클라우드 컴퓨팅 서비스 모델을 사용하든 기업은 사용하는 컴퓨팅 리소스에 대해서만 비용을 지불한다.

클라우드 컴퓨팅의 유형

Infrastructure as a Service(IaaS)

컴퓨팅, 스토리지, 네트워킹, 가상화 등 IT 인프라 서비스에 대한 주문형 액세스를 제공한다. IT 리소스를 가장 높은 수준으로 제어하며 기존 온프레미스 IT 리소스와 가장 유사하다.

Platform as a Service(PaaS)

클라우드 애플리케이션 개발에 필요한 모든 하드웨어 및 소프트웨어 리소스를 제공한다. PaaS를 사용하면 기업은 기본 인프라의 관리 및 유지보수에 대한 부담 없이 애플리케이션 개발에 집중할 수 있다.

Software as a Service(SaaS)

기본 인프라에서 유지보수 및 앱 소프트웨어 자체 업데이트에 이르기까지 전체 애플리케이션 스택을 서비스로 제공한다. SaaS 솔루션은 클라우드 인프라 제공업체에서 서비스와 인프라를 모두 관리하고 유지보수하는 최종 사용자 애플리케이션인 경우가 많다.

Container란?

Host OS상에서 리소스를 논리적으로 구분하여 마치 별도의 서비인 것 처럼 사용할 수 있게 하는 기술

Container를 사용하는 이유

  • 여러 애플리케이션에서 사용하고 있는 라이브러리나 미들웨어의 버전에 대한 충돌을 회피
  • 이식성과 확장성이 좋다
    • 컨테이너 이미지 그대로 의존성 없이 다른 환경에서 실행 가능
    • 컨테이너를 여러 개 실행해서 이중화 가능
  • 다양한 운영 환경 지원
    • Windows 환경에서 Linux를 실행하거나 그 반대 가능

가상화 기술과 Container 기술 차이

Legacy

  • 하나의 물리 서버에 애플리케이션 배포
  • 애플리케이션간 라이브러리나 미들웨어 버전의 충돌이 발생할 수 있다.

Hosted Hypervisor(가상화 소프트웨어)

  • Virtual Box, VMware, Parallels와 같은 소프트웨어
  • 호스트 OS 위에 가상화 소프트웨어를 설치해서 가상환경 구축
  • 간편하게 사용할 수 있어 클라이언트 PC에서 개발환경을 구축하거나 테스트를 위해 주로 사용
  • 컨테이너와는 다르게 Guest OS가 존재하여 오버헤드가 비교적 크다.
    • OS 위에 OS를 실행하는 것이므로 리소스(CPU, 메모리 등)을 할당하는데 작업 필요

Bare Metal Hypervisor

  • Hyper-v, XenServer, ESXi Server 등이 있다.
  • Host OS 없이 하드웨어에 직접 하이퍼바이저를 설치
  • Host OS가 없어 자원을 효율적으로 사용할 수 있다.
    • 하드웨어가 제어
    • 오버헤드가 비교적 적다
  • 가상 머신들을 관리하기 위한 콘솔이 필요하다.

Container

  • Docker, Containerd, CRI-O 등이 컨테이너 런타임으로 있다.
  • Guest OS가 없고 Host OS의 커널을 공유하여 오버헤드가 적고 가벼워서 빠르다.
    • OS 실행 없이 별도의 환경에서 애플리케이션 실행 가능
  • 이식성과 확장성이 높다

Docker개념

Docker 란?

  • 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스이다.
  • 도커를 통해 애플리케이션 실행환경을 코드로 작성할 수 있다.
  • 도커를 통해 OS를 공유, 격리화하여 관리할 수 있다.
리눅스 컨테이너(Linux Container)란?
- Linxus 기반의 기술중 하나
- 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것
- 컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있다.

Docker Image란?

  • 컨테이너를 정의하는 읽기 전용 템플릿
  • 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

Docker 사용 이유

빠른 시작과 종료 속도

  • 가상환경이 커널에서 공유되기 때문에 새로운 커널을 시작할 필요가 없고, 하드웨어 초기화 등의 작업이 필요없다.

높은 집척도

  • 컨테이너는 커닐이 직접 프로세스를 조작하여 분리된 공간을 구성하기 때문에 PC 상에서 동작하는 OS는 하나이다.
  • 여러 개의 컨테이너를 만들어 실행 중이라도 해도 OS는 하나이기 때문에, 가상머신에 비해 고밀도가 가능하다.
  • 컨테이너에서는 실행되는 프로세스를 위한 메모리만 필요하기 때문에 낮은 사양의 환경에서도 동작가능하다.

낮은 오버헤드

  • 가상화를 위한 하드웨어 에뮬레이트 단계 없이, 분리된 공간을 만들기 때문에 오버헤드가 줄어든다.

애플리케이션 컨테이너 지원

  • 컨테이너는 가상머신과 달리 init을 먼저 시작하거나 각종 데몬들을 실행할 필요가 없다.
  • 컨테이너는 목적에 맞는 프로세스만 존재하는 환경을 만들 수 있다. 예를 들어 웹서버용 컨테이너라면 Apache Httpd 프로세스만 존재하는 컨테이너를 만들 수 있다.
  • 이러한 환경을 애플리케이션 컽네이너라고 하며, init를 처음 시작하여 보통의 OS가 시작하는 것과 같은 환경을 만들 수 있는데 이를 시스템 컨테이너라고 부른다.

더 많은 소프트웨어를 더 빨리 제공

  • Docker 사용자는 평균적으로 Docker를 사용하지 않는 사용자보다 7배 더 많은 소프트웨어를 제공한다.
  • Docker를 사용하면 필요할 때마다 격리된 서비스를 제공할 수 있다.

운영 표준화

  • 작은 컨테이너식 애플리케이션을 사용하면 손쉽게 배포하고, 문제를 파악하고, 수정을 위해 롤백할 수 있다.

원활하게 이전

  • Docker 기반 애플리케이션을 로컬 개발 시스템에서 AWS의 프로덕션 배포로 원할하게 이전할 수 있다.

비용절감

  • Docker 컨테이너를 사용하면 각 서버에서 좀 더 쉽게 더 많은 코드를 싱행하여 사용률을 높이고 비용을 절감할 수 있다.

Kubernetes 개념

Kubernetes 란?

컨테이너 운영을 자동화하기 위한 컨테이너 오케스트레이션 도구이다. 많은 수의 컨테이너를 협조적으로 연동시키기 위한 통합 시스템이며, 이 컨테이너를 다루기 위한 API 및 명령행 도구등이 함께 제공된다.

Kubernetes의 주요 개념

쿠버네티스로 실행하는 애플리케이션은 애플리케이션을 구성하는 다양한 리소스가 함께 연동해 동작한다. 여기서 말하는 쿠버네티스의 리소스란, 애플리케이션을 구성하는 부품과 같은 것으로 노드, 네임스페이스, 파드 등을 가리킨다.

Kubernetes 클러스터와 노드

쿠버네티스 클러스터

쿠버네티스 클러스터는 쿠버네티스의 여러 리소스를 관리하기 위한 집합체이다.

쿠버네티스 노드

  • 쿠버네티스 리소스 중에서 가장 큰 개념은 노드이다.
  • 노드는 클러스터의 관리 대상으로 등록된 도커 호스트로, 도커 컨테이너가 배치되는 대상이다.
  • 그리고 쿠버네티스 클러스터 전체를 관리하는 서버인 마스터가 적어도 하나 이상 있어야 한다.
  • 여기서 하나 이상이라는 말은 클러스터가 작동하기 위한 최소 조건이지만 실제 프러덕 환경에서는 절대 하나로 클러스터를 구성하지 않으며, 최소 3개 이상의 마스터 노드를 갖는 것이 좋다.

마스터 노드 관리 컴포넌트

컴포턴트 역할
kube-apiserver - 쿠버네티스 APO를 노출하는 컴포넌트이다.
- kubectl로부터 리소스를 조작하라는 지시를 받는다
etcd - 고가용성을 갖춘 분산 키-값 스토어이다.
- 쿠버네티스 클러스터의 백킹 스토어로 사용된다.
kube-scheduler - 노드를 모니터링하고 컨테이너를 배치할 적절한 노드를 선택한다.
kube-controller-manager - 리소스를 제어하는 컨트롤러를 실행한다.

Namespace

  • 쿠버네티스는 클러스터 안에 가상 클러스터를 또 다시 만들 수 있다.
  • 클러스터 안의 가상 클러스터를 Namespace라고 한다.
  • 클러스터 처음 구축 시 default, docker, kube-public, kube-system의 네임스페이스가 생성되어 있다.
  • kubectl get namespace 명령어로 현재 클러스터 안에 존재하는 네임스페이스의 목록을 확인 할 수 있다.

파드(pod)

  • pod는 컨테이너가 모인 집합체의 단위로, 적어도 하나 이상의 컨테이너로 이루어진다.
  • 쿠버네티스를 도커와 함께 사용한다면 pod는 컨테이너 하나 또는 컨테이너의 집합체가 된다.
  • 이러한 pod들은 노드에 배치된다
  • 하나의 pod 안의 컨테이너는 모두 같은 노드에 배치된다.

VM 자원 할당

해당 TEST는 CentOS 7 사용

 

VM IP 할당 및 HOSTNAME 설정

VM NAME
IP
HOSTNAME
sjh-k8s-test-node
10.100.14.139
sjh-k8s-test-node
sjh-k8s-master-node
10.100.14.140
sjh-k8s-master-node
sjh-k8s-worker1-node
10.100.14.141
sjh-k8s-worker1-node
sjh-k8s-test-node 설치 이유 : 추후 해당 vm을 통해 master 및 worker SSH 접속 사용

DNF 설치

  • RHEL/CentOS 7의 기본 저장소에서는 DNF를 사용할 수 없다. 그러나 Fedora 22는 DNF가 공식적으로 구현된 상태로 제공된다
master node 및 worker1 node, test node 동일하게 DNF 설정

epel-release 저장소 설치 및 활성

yum install epel-release

DNF 패키지 설치

yum install dnf

DNF 버전 확인

dnf --version

ssh key 생성 및 컨트롤 플레인/워커 노드로 복사

  • ssh key 생성
# master node
[root@sjh-k8s-master-node ~]# ssh-keygen -b 4096 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:jU8f8AZenpKwvxh6nXEVBWbiidKIeKzVfprF9/nck1k root@sjh-k8s-master-node
The key's randomart image is:
+---[RSA 4096]----+
|            . +o.|
|     o o o o =.  |
|    . = = = +  . |
|     + . O B ..  |
|    .   S X B.   |
|         O.=.o .E|
|        +.o+. o +|
|       ..oo.   *.|
|      ... .     =|
+----[SHA256]-----+
# test node 
[root@sjh-k8s-test-node ~]# ssh-keygen -b 4096 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:pB4cqgl9Xzt9wOr3zgy1d0FC2f5wY30JbGJK+VbnJIE root@sjh-k8s-test-node
The key's randomart image is:
+---[RSA 4096]----+
|          . oo+  |
|         o E.B + |
|      . o + +.B.o|
| .   o + o o  +*+|
|. . o + S + . .++|
| . + o o + o .  o|
|  o   o + o o . .|
|       . ..= . . |
|        .. o=    |
+----[SHA256]-----+
  • .ssh 디렉토리 이동 후 컨트롤 플레인과 워커 노드로 퍼블릭 키 복사
# test node
[root@sjh-k8s-test-node ~]# cd ~/.ssh
[root@sjh-k8s-test-node .ssh]# ssh-copy-id -i id_rsa.pub root@10.100.14.141
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
The authenticity of host '10.100.14.141 (10.100.14.141)' can't be established.
ECDSA key fingerprint is SHA256:T+7C1Yx0e35XQ82HtCiemNx1h13DVrrVOrE0SQwib8M.
ECDSA key fingerprint is MD5:09:97:c9:20:78:52:a1:b9:1c:a7:f1:24:36:fe:26:44.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.100.14.141's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.100.14.141'"
and check to make sure that only the key(s) you wanted were added.

[root@sjh-k8s-test-node .ssh]# ssh-copy-id -i id_rsa.pub root@10.100.14.140
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
The authenticity of host '10.100.14.140 (10.100.14.140)' can't be established.
ECDSA key fingerprint is SHA256:yV4B4xT06kOQVrWhEl8Anmu208GBhgal1M1hGd+VgxI.
ECDSA key fingerprint is MD5:cf:0e:b2:b4:98:dc:61:05:e8:70:5f:cc:e4:23:d6:6f.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.100.14.140's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.100.14.140'"
and check to make sure that only the key(s) you wanted were added.

로그인 정의 파일 만들기

  • 각 VM 접근을 위한 로그인 정의 파일인 ‘config’를 만듭니다
# test node[root@sjh-k8s-test-node .ssh]# ssh sjh-k8s-master-node
Last login: Thu Mar 30 23:22:55 2023 from 10.11.11.163
[root@sjh-k8s-test-node .ssh]# cat <<EOF > config
> Host sjh-k8s-master-node
> HostName 10.100.14.140
> User root
> IdentityFile ~/.ssh/id_rsa
>
> Host sjh-k8s-worker1-node
> HostName 10.100.14.141
> User root
> IdentityFile ~/.ssh/id_rsa
> EOF
  • 각 VM 로그인
# test node에서 master node 접
[root@sjh-k8s-test-node .ssh]# ssh sjh-k8s-master-node
Last login: Thu Mar 30 23:22:55 2023 from 10.11.11.163
[root@sjh-k8s-master-node ~]# exit
logout
Connection to 10.100.14.140 closed.

# test node 에서 worker1 node 접속
[root@sjh-k8s-test-node .ssh]# ssh sjh-k8s-worker1-node
Last login: Thu Mar 30 23:23:17 2023 from 10.11.11.163
[root@sjh-k8s-worker1-node ~]# exit
logout
Connection to 10.100.14.141 closed.

VM hostname 변경

# test node 변경
[root@sjh-k8s-test-node .ssh]# hostnamectl set-hostname sjh-k8s-test-node
# master node 변경
[root@sjh-k8s-master-node ~]# hostnamectl set-hostname sjh-k8s-master-node
# worker1 node 변경
[root@sjh-k8s-worker1-node ~]# hostnamectl set-hostname sjh-k8s-worker1-node

hosts 등록

# master node 설정
[root@sjh-k8s-master-node ~]# cat <<EOF >> /etc/hosts
> 10.100.14.140 sjh-k8s-master-node
> 10.100.14.141 sjh-k8s-worker1-node
> EOF
[root@sjh-k8s-master-node ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.100.14.140 sjh-k8s-master-node
10.100.14.141 sjh-k8s-worker1-node

# worker1 node 설정
[root@sjh-k8s-worker1-node ~]# cat <<EOF >> /etc/hosts
> 10.100.14.140 sjh-k8s-master-node
> 10.100.14.141 sjh-k8s-worker1-node
> EOF
[root@sjh-k8s-worker1-node ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.100.14.140 sjh-k8s-master-node
10.100.14.141 sjh-k8s-worker1-node

컨테이너 런타임 엔진 및 툴 설치

  • CRI-O(Container Runtime Interface-Open Container Initiative)를 컨테이너 런타임 엔진으로 사용
  • 그 외 컨테이너 작성, 저장, 실행을 위한 툴인 팟맨(podman), 빌다(buildah), 스코피오(skopeo)를 설치 합니다.
  • 팟맨은 Docker CLI와 같은 역할을 합니다. 고맙게도 Docker와 거의 모든 명령과 옵션이 동일
  • 빌다는 컨테이너 이미지를 작성하는 툴입니다. 'podman build'명령을 수행하면 내부적으로 buildah를 이용하여 이미지가 만들어집니다.
  • 스코피오는 컨테이너 이미지를 관리하는 툴로 이미지의 업로드, 복사, 삭제와 같은 기능을 제공 합니다. 'podman push'명령을 수행하면 내부적으로 skopeo를 이용하여 이미지가 업로드 됩니다.

CRI-O 설치

  • 환경변수 OS와 VERSION을 생성
VERSION은 설치할 쿠버네티스의 메이저와 마이너 버전과 동일하게 지정해야 함
# master node 설정
[root@sjh-k8s-master-node ~]# OS=CentOS_7
[root@sjh-k8s-master-node ~]# VERSION=1.23
# worker1 node 설정
[root@sjh-k8s-worker1-node ~]# OS=CentOS_7
[root@sjh-k8s-worker1-node ~]# VERSION=1.23

부팅 시 로딩 모듈 정의

# master node 설정
[root@sjh-k8s-master-node ~]# cat <<EOF > /etc/modules-load.d/crio.conf
> overlay
> br_netfilter
> EOF
[root@sjh-k8s-master-node ~]# sudo modprobe overlay
[root@sjh-k8s-master-node ~]# sudo modprobe br_netfilter

# worker1 node 설정
[root@sjh-k8s-worker1-node ~]# cat <<EOF > /etc/modules-load.d/crio.conf
> overlay
> br_netfilter
> EOF
[root@sjh-k8s-worker1-node ~]# sudo modprobe overlay
[root@sjh-k8s-worker1-node ~]# sudo modprobe br_netfilter

CRI-O 설치파일 다운할 리포지토리 추가

[root@sjh-k8s-master-node ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   425  100   425    0     0    341      0  0:00:01  0:00:01 --:--:--   341
100   426  100   426    0     0    285      0  0:00:01  0:00:01 --:--:--   285
100   427  100   427    0     0    245      0  0:00:01  0:00:01 --:--:--   245
100   428  100   428    0     0    215      0  0:00:01  0:00:01 --:--:--     0
100   429  100   429    0     0    192      0  0:00:02  0:00:02 --:--:--   192
100   381  100   381    0     0    153      0  0:00:02  0:00:02 --:--:--   153
worker1 node도 동일하게 다운
728x90

CRI설치

[root@sjh-k8s-master-node ~]# dnf list cri-o
Extra Packages for Enterprise Linux 7 - x86_64                                                                                                                        6.8 MB/s |  17 MB     00:02
devel:kubic:libcontainers:stable:cri-o:1.23 (CentOS_7)                                                                                                                 38 kB/s | 126 kB     00:03
CentOS-7 - Base                                                                                                                                                        55 MB/s |  10 MB     00:00
CentOS-7 - Updates                                                                                                                                                     63 MB/s |  25 MB     00:00
CentOS-7 - Extras                                                                                                                                                     4.0 MB/s | 332 kB     00:00
Available Packages
cri-o.aarch64                                                                1.23.5-3.2.el7                                                                devel_kubic_libcontainers_stable_cri-o_1.23
cri-o.src                                                                    1.23.5-3.2.el7                                                                devel_kubic_libcontainers_stable_cri-o_1.23
cri-o.x86_64                                                                 1.23.5-3.2.el7                                                                devel_kubic_libcontainers_stable_cri-o_1.23

[root@sjh-k8s-master-node ~]# dnf install -y cri-o-1.23.5
동일하게 worker1 node도 설치

CRI-O 시작 프로그램 등록 및 상태 확인

[root@sjh-k8s-master-node ~]# systemctl daemon-reload
[root@sjh-k8s-master-node ~]# systemctl enable crio --now
Created symlink from /etc/systemd/system/cri-o.service to /usr/lib/systemd/system/crio.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/crio.service to /usr/lib/systemd/system/crio.service.
[root@sjh-k8s-master-node ~]# systemctl status crio
● crio.service - Container Runtime Interface for OCI (CRI-O)
   Loaded: loaded (/usr/lib/systemd/system/crio.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2023-03-30 21:10:12 EDT; 3s ago
     Docs: https://github.com/cri-o/cri-o
 Main PID: 2149 (crio)
   CGroup: /system.slice/crio.service
           └─2149 /usr/bin/crio

Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.476468217-04:00" level=info msg="No blockio config file specified, blockio not configured"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.476478197-04:00" level=info msg="RDT not available in the host system"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.482020384-04:00" level=info msg="Found CNI network crio (type=bridge) at /etc/cni/net.d/100-crio-bridge.conf"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.486656944-04:00" level=info msg="Found CNI network 200-loopback.conf (type=loopback) at /etc/cni/net.d/200-loopback.conf"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.486698774-04:00" level=info msg="Updated default CNI network name to crio"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.493879053-04:00" level=warning msg="The binary conntrack is not installed, this can cause failures in network...ion cleanup"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.497687261-04:00" level=warning msg="The binary conntrack is not installed, this can cause failures in network...ion cleanup"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.497913817-04:00" level=warning msg="Error encountered when checking whether cri-o should wipe images: version...r directory"
Mar 30 21:10:12 sjh-k8s-master-node crio[2149]: time="2023-03-30 21:10:12.499493794-04:00" level=info msg="Serving metrics on :9537 via HTTP"
Mar 30 21:10:12 sjh-k8s-master-node systemd[1]: Started Container Runtime Interface for OCI (CRI-O).
Hint: Some lines were ellipsized, use -l to show in full.
동일하게 worker1 node도 설정

docker 설치

  • crio 설치 시 모듈 하나가 설치가 안되서 k8s 구성 버그가 있어 해당 docker 설치
[root@sjh-k8s-master-node ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

[root@sjh-k8s-master-node ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

[root@sjh-k8s-master-node ~]# yum install docker-ce -y
worker1 node도 동일하게 설치

podman, buildah, skopeo 설치

  • 설치를 위해 리포지토리 정의 파일 추가
동일하게 worker1 node도 설정
[root@sjh-k8s-master-node ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo \
https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo

podman 버전 확인 및 설치

[root@sjh-k8s-master-node ~]# dnf list podman

[root@sjh-k8s-master-node ~]# dnf install -y podman-1.6.4

buildah 버전 확인 및 설치

[root@sjh-k8s-master-node ~]# dnf list buildah

[root@sjh-k8s-master-node ~]# dnf install -y buildah-1.11.6

skopeo 버전 확인 및 설치

[root@sjh-k8s-master-node ~]# dnf list skopeo

[root@sjh-k8s-master-node ~]# dnf install -y skopeo-2:1.4.1

VM 설정 변경

  • 쿠버네티스 설치를 위해 VM의 SELinux 모드, iptables 사용 설정, SWAP 비활성화, 네트워크 툴 설치를 먼저 수행
해당 작업들 모두 master node 와 worker1 node 모두 수행

SELinux mode 변경

  • SELinux 보안정책 위배 시 처리 방법을 변경하는것
[root@sjh-k8s-master-node ~]# setenforce 0
[root@sjh-k8s-master-node ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

iptables 사용 설정

  • 쿠버네티스에서 네트워크 모드의 하나인 iptables를 사용하도록 설정
[root@sjh-k8s-master-node ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-iptables  = 1
> net.ipv4.ip_forward                 = 1
> net.bridge.bridge-nf-call-ip6tables = 1
> EOF
[root@sjh-k8s-master-node ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /usr/lib/sysctl.d/99-cri-o.conf ...
fs.may_detach_mounts = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
* Applying /etc/sysctl.conf ...

SWAP 비활성화

  • 쿠버네티스는 SWAP공간을 사용하지 안해서 비활성화 해야함
[root@sjh-k8s-master-node ~]# swapoff -a

리부팅 SWAP 비활성화 /etc/fstab 파일 수정

해당 부분 없을 수 있음
[root@sjh-k8s-master-node ~]# vi /etc/fstab
UUID=2d00ecfc-6476-4e54-8066-19863783ee5a / ext4 defaults,noatime 0 0
UUID=0af0758b-9892-4acc-8037-a30111f1e4f0 /boot ext4 defaults,noatime 0 0
#LABEL=SWAP-xvdb1       swap    swap    defaults,nofail,x-systemd.device-timeout=500ms  0       0

[root@master ~]# mount -a

네트워크 툴 설치

[root@sjh-k8s-master-node ~]# dnf install -y net-tools

kubeadm, kubelet, kubectl 설치

  • 쿠베어드민(kubeadm)은 쿠버네티스 설치 툴
  • 큐블릿(kubelet)은 각 노드에 설치 되어 요청된 명령을 수행하는 쿠버네티스의 핵심 컴포넌트
  • 쿠베컨트롤(kubectl)은 쿠버네티스 명령을 수행하는 CLI
해당 작업들 master node 및 worker1 node 모두 수행

레포지토리 정의 파일 추가

[root@sjh-k8s-master-node ~]# cat < /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
> 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
> EOF

ubeadm, kubelet, kubectl 설치

해당 실습은 kubernetes 1.23.1을 설치해서 버전에 맞는 kubelet, kubeadm, kubectl을 설치해야한다.
  • 아래의 명령어로 설치 가능한 버전을 찾고 설치
[root@sjh-k8s-master-node ~]# dnf install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 --disableexcludes=kubernetes

kubelet 부팅 시 로딩 설정 및 시작

[root@sjh-k8s-worker1-node ~]# systemctl enable kubelet --now
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

컨트롤 플레인 설치

해당 작업은 master node에서만 수행
  • master node ssh 접속
[root@sjh-k8s-test-node .ssh]# ssh sjh-k8s-master-node
  • 옵션으로 kubernetes version, Pod Network IP범위, API Server의 IP를 지정해야 함

컨트롤 플레인 설치

apiserver-advertise의 ip는 vm ip로 변경
[root@sjh-k8s-worker1-node ~]# kubeadm init \
--kubernetes-version=v1.23.1 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=10.100.14.140
  • docker와 crio가 같이 설치된 경우는 해당 옵션 추가 필수
kubeadm init \
--kubernetes-version=v1.23.1 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=10.100.14.140 \
--cri-socket /var/run/crio/crio.sock
  • 설치 후 해당 명령어 및 Join 명령어 복사해 두기
mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config


kubeadm join 10.100.14.140:6443 --token 6l65y9.qulrjvx6oe7l82tm \
        --discovery-token-ca-cert-hash sha256:1ad6b2ef64ca116202e1aeb548538c50192475a24d0bc513c853d4dd23d6ed31

쿠버네티스 컨피그 파일 복사

  • 위에서 복사한 쿠버네티스 컨피그 파일 복사 작업 수행
mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 컨프롤 플레인이 잘 설치되었는지 확인
[root@sjh-k8s-master-node ~]# kubectl get nodes
NAME                  STATUS   ROLES                  AGE     VERSION
sjh-k8s-master-node   Ready    control-plane,master   2m51s   v1.23.1

CNI 제품 설치

  • Calico 정상동작하기 위해 방화벽 포트 오픈 필수
$ sudo firewall-cmd --add-port=179/tcp --permanent
$ sudo firewall-cmd --add-port=4789/udp --permanent
$ sudo firewall-cmd --add-port=5473/tcp --permanent
$ sudo firewall-cmd --add-port=443/tcp --permanent
$ sudo firewall-cmd --add-port=6443/tcp --permanent
$ sudo firewall-cmd --add-port=2379/tcp --permanent
$ sudo firewall-cmd --reload
  • CNI 제품인 Calico 설치
# 설치에 사용할 yaml 파일 다운로드
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

# kubeadm init 할 때에 --pod-network-cidr 192.168.0.0/16
# 에서 해당 ip 대역 하지 않고 다른 대역 했었을 시 아래 명령어 사용
# 예로 10.10.0.0/16 이면 -> sed -i -e 's?192.168.0.0/16?10.10.0.0/16?g' calico.yaml
  • 해당 명령어로 Calico Pod 들 정상 실행될 때 까지 대기. 모두 실행되면 ‘CTRL-C’로 중단
[root@sjh-k8s-master-node ~]# watch kubectl get po -A

워커 노드 설치

해당 부분은 worker1 node만 진행
  • worker1 node ssh 접속
[root@sjh-k8s-test-node .ssh]# ssh sjh-k8s-worker1-node

워커 노드 추가

  • 컨트롤 플레인 설치 시 복사해놓은 join 명령어 실행
  • 아래의 명령어 처럼 \ 지우고 엔터 지우고 복붙
[root@sjh-k8s-worker1-node ~]# kubeadm join 10.100.14.140:6443 --token 6l65y9.qulrjvx6oe7l82tm --discovery-token-ca-cert-hash sha256:1ad6b2ef64ca116202e1aeb548538c50192475a24d0bc513c853d4dd23d6ed31

쿠버네티스 컨피그 파일 복사

  • 워커 노드 설치 후 'kubectl get nodes'명령을 실행 하면 아래와 같이 API Server를 못 찾는 에러가 발생
  • 아직 워커 노드에 쿠버네티스 컨피그 파일이 없기 때문에 에러 발생
[root@sjh-k8s-worker1-node ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
  • test node에서 컨트롤 플레인의 쿠버네티스 컨피그 파일을 다운로드하고 worker1 node로 복사
[root@sjh-k8s-worker1-node ~]# exit
logout
Connection to 10.100.14.141 closed.
[root@sjh-k8s-test-node .ssh]# cd
[root@sjh-k8s-test-node ~]# mkdir -p .kube
[root@sjh-k8s-test-node ~]# cd ~/.kube
[root@sjh-k8s-test-node .kube]# scp sjh-k8s-master-node:~/.kube/config config
config                                                                                                                                                              100% 5641     6.2MB/s   00:00
[root@sjh-k8s-test-node .kube]# ssh sjh-k8s-worker1-node "mkdir -p ~/.kube"
[root@sjh-k8s-test-node .kube]# scp ./config sjh-k8s-worker1-node:~/.kube/config
config                                                                                                                                                              100% 5641     8.1MB/s   00:00
[root@sjh-k8s-test-node .kube]# ssh sjh-k8s-worker1-node
Last login: Fri Mar 31 00:36:33 2023 from 10.11.11.163
[root@sjh-k8s-worker1-node ~]#
  • 쿠버네티스 노드 확인 시 아래와 같이 정상작동
[root@sjh-k8s-worker1-node ~]# kubectl get nodes
NAME                   STATUS   ROLES                  AGE   VERSION
sjh-k8s-master-node    Ready    control-plane,master   43m   v1.23.1
sjh-k8s-worker1-node   Ready    <none>                 29m   v1.23.1

worker1 node 역할명 변경

  • 현재 node list 확인 시 worker1 node 역할이 <none>으로 표기됨
  • 해당 명령어로 역할명 변경
[root@sjh-k8s-worker1-node ~]# kubectl label node sjh-k8s-worker1-node node-role.kubernetes.io/worker=worker
node/sjh-k8s-worker1-node labeled
[root@sjh-k8s-worker1-node ~]# kubectl get nodes
NAME                   STATUS   ROLES                  AGE   VERSION
sjh-k8s-master-node    Ready    control-plane,master   45m   v1.23.1
sjh-k8s-worker1-node   Ready    worker                 31m   v1.23.1

test node에서 쿠버네티스 클러스터 접근 설정

앞으로 쿠버네티스 클러스터를 로그인하여 작업하지 않고 test node에서만 작업

test node에 kubectl 설치

  • test node도 centos로 아래와 같이 설치
  • 먼저 레포지토리 정의 파일 생성
[root@sjh-k8s-test-node ~]# cat < /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
> 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
> EOF
  • kubectl 설치
[root@sjh-k8s-test-node ~]# dnf install -y kubectl
  • kubectl 명령 alias ‘k’ 생성
해당 명령 실행 시 kubectl 풀 명령어 하지 않고 k만 해도 자동완성
[root@sjh-k8s-test-node ~]# install /usr/bin/kubectl /usr/bin/k

쿠버네티스 컨피그 파일 복사

  • 워커 노드 설치 시 컨트롤 플레인으로 부터 쿠버네티스 컨피그 파일을 이미 '~/.kube/config'로 복사했습니다
[root@sjh-k8s-test-node ~]# cd ~/.kube
[root@sjh-k8s-test-node .kube]# ll
total 8
-rw-------. 1 root root 5641 Mar 31 00:37 config
  • 파일 내용을 보면 아래와 같이 (1) API Server의 주소 (2) 쿠버네티스 클러스터 (3) 접근 유저명 (4) 접근 유저의 인증토큰을 확인할 수 있습니다.
[root@sjh-k8s-test-node .kube]# vi config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1ETXpNVEF6TlRZeE0xb1hEVE16TURNeU9EQXpOVFl4TTFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS0l0Cjg2V2hxaVgyWldqUkt3Qkw0eE9Wb01VV1FEZk9IQUpOcUwrZVQ2NkVHQkJmcUgwTlFxZTh1Z0tLQmR6cFZqWXAKVldaUzlMZGo1dGhQYkh1M1BmOVZEVHh2R3RMR2o3YldFUlAxMDlrM1RtdVJqS1c3N0drQ3NQdXRCK29VL1NEcApkL29OZk5wdzVyWld0NWtPVmtDYU8rOTltbHBOKy9NZStQOEtsaWFBV0dmeW1xU0haUlV6ZlJ0WE1sbVlmUWFuCkw4S041VjZzaUp6b1VobzlzS013V0JwZE9iSk5RVlFjU0t2RzVZWDFRajdVa0Q1UUE0SXZHUFBSbng5bHRjbkYKcURzRUtxUlNwOTVIYkdjZ3E2Uk13djVISklyQW1DcXlSbzR3ZjdlSGF2VGNxWDE2RHdwc0NiSy9xWFdxLzZGWQppMjh1Q2NIRDdQaFJPcE1vdnRrQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZBL2JqbEh3ajlXV2ZxSVR0OUE5eENTVTNlZ0NNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRmE3K2NaK1JBS3ZKRmtYVmZmdwozR25HZVRFZXBwSE5Kb0lPS3QwbWR1VVJZbmdDdXF1d0R5NzdEZlFOV3FHS2FTTUxnK3I1WWZRUmxWWUZpQ01VCk0wS3g2S1lRVDhzZFJ4Uzc1alpVeEZKT1BKL3Z0VkFjdEdzWmZ4dERsZFYwRkJRYWt6Si9YbjB5Zmd3RG9tcncKVURlVUNEQXd5ZkJERUNhYUZTWDRQZmNiSGV0TVZNTE5rblZWNFpWT3M0V2VxV0RORk9qcXVQSUdmY0k2Q3YrTwp4UGFMS3Zqd0hoYi8yb1JWdzZhOFViZlAxZWY3RmRhUWl5K0N5Y2laeXBsc2M4WUZJeTErSE41b2hQbHFSOTRFCnlxdDFvc01sdEV3MGl4b0ZSRHNVWXN6dXR3bGxCT2ZBWkszNEw0c3A1MjdzZm90cjdncWtEaUh3d3lwbU1CbFcKbkNnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
##########(1) API Server 주소##########
    server: https://10.100.14.140:6443
########################################
  name: kubernetes
contexts:
- context:
##########(2) 쿠버네티스 클러스터##########
    cluster: kubernetes
########################################
##########(3) 접근 유저명##########
    user: kubernetes-admin
########################################
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
##########(4) 접근 유저 인증 토큰##########
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJR1NBaWZoN1d6Q1V3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpBek16RXdNelUyTVROYUZ3MHlOREF6TXpBd016VTJNVGRhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXMzRjIvajNkV2dvYlpxMmQKRTZlYUlxUCtyRTR4OSt5WnhkeHhzUXJteEppTnJDaXlFK2V2T1lFc01maU8yWjViZS82bXltY2lqTWZEM3AreQpKNWtMVXcxcmhISW9mMUZWVWlkUE44THhvS3JVdGNiaFM3cS8ramtMdDBpank3YWovNVF5SlpGWDd4VFJFV0J4CmJxUG1tbk9NRm90aVA1bmhQdU9MMTU2QUVHY1VIMVRxbDY4b04rZlllN2JQdjlyWUphQ1FpY3RlWUVTc3NLYkgKL1dGZEt3RW1teHZYWGxEdHhRamF5NlZhSzlVVlh4VlpzZStOdDZnSWV4TGg5ZFhRd0dwWGkxdTllRUhrQzltMAo1QVdRQnZHYUhCbjhsWHhlTCtNSnM4VHBubXJVS1htOTQ0MTNISjRLSUtGcU9XQWFDT05BaHpuSjdQMUhVazZSCnJtNFBIUUlEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JRUDI0NVI4SS9WbG42aUU3ZlFQY1FrbE4zbwpBakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQUIyMllYUHhvZ1hYQk5oZ09TN3RLdm5PS3NndmEwcDhOakpDCkQ3and3TUVxRlp2VThVdWV0RU5peXl4RWxYSkU5U3ZJYy85cjlTSHRQbWZhdUhHN2YzdTU5Q1BlSm9zZ2gvdGQKd3YwSjNOSmFXVGQzZzdsR1o0WHliaHo5UllTR1JIa28yZTRIME1zbE9XODFtME5vVG4wTmxoazJaOVJadFVzMApmRVVWK2U5MDk2QWlDTnp3NVJramNMbFVlY1NDTGwrMEFXcTcvbEVrdzVmNFhYamRqcVZmUFB0SFFGeHlLbUFKCnVPOVpPa2h2Zk5kakNOSnNDb3hpdVRac2VUVWRUdy9QSnBGTFFRSUUrdW94V2srMmNKWmhua1FGR3o5M2dONFEKM2Y4VDI0b1N3cEg5NDdSQWx1N2t4SC9TNVJxcXFEMmVlYmQvVVBQVzV6NGJBYW85Qnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBczNGMi9qM2RXZ29iWnEyZEU2ZWFJcVArckU0eDkreVp4ZHh4c1FybXhKaU5yQ2l5CkUrZXZPWUVzTWZpTzJaNWJlLzZteW1jaWpNZkQzcCt5SjVrTFV3MXJoSElvZjFGVlVpZFBOOEx4b0tyVXRjYmgKUzdxLytqa0x0MGlqeTdhai81UXlKWkZYN3hUUkVXQnhicVBtbW5PTUZvdGlQNW5oUHVPTDE1NkFFR2NVSDFUcQpsNjhvTitmWWU3YlB2OXJZSmFDUWljdGVZRVNzc0tiSC9XRmRLd0VtbXh2WFhsRHR4UWpheTZWYUs5VVZYeFZaCnNlK050NmdJZXhMaDlkWFF3R3BYaTF1OWVFSGtDOW0wNUFXUUJ2R2FIQm44bFh4ZUwrTUpzOFRwbm1yVUtYbTkKNDQxM0hKNEtJS0ZxT1dBYUNPTkFoem5KN1AxSFVrNlJybTRQSFFJREFRQUJBb0lCQVFDbElhZVZkQ3o5TFF2bQpRNktuY2JkQVpaWjV6a1BobVpReEp4cGhDRjB4VWdvZUFoMU9nQWthYkNyVm1aMHIyclRwdUlDWkJxd2V6YjhNCllmMjZ2dlpTNmFpbDY4QWsyaDRnU2hoMmdpbUY1MjkwRUo5SDU0Vy9xVHVFNFk0S2Evc2p1YWNrTjBxcXM0ZHAKN0V5MnVwSCtWSkw0TkRDbnd0NHIxNDdiVC9zZUc1TkJmZ1dENUdXTThYeS9OUWRiUlEyUm1Yc0xaMjBlQzIzego0WWp6VW5lWk5HTHI4dXd5WVd6RExTcnQvWDJ2eTMxTlVjU1hESExxZTB2YmNuYXo2V1I2RmtoRWNZNkFVT3lZCjBpR216UkllOGdLTUNDT0RqVUJ0dWF4eDg2Ukt0N0tQOGZlcmx0K3U5QkRXVTJ6WUFlR0JoRFhBbHFUVHd0WCsKNDZvVzFuakJBb0dCQU5qaWkvUEtYb2Q4d1A5alZSQWRHSEpxc0NEajl1NUZXRkFoK05uTndrckVmNGhGaENuOApXbDBrQlhNeWNUc3dKbEVWT2hkeVh0QjEwNXllQ3FhNDJvU1NUVjdIRnp2WWRYTXorMW5pZVVYS1VuMi9xb3J2CmE4N0VYVkFRajU5L1pRMjhrTmp0M29TODQrMFV2STB3WWY0RTRUTVFzSEpvZmdkNVBBREdVUkFwQW9HQkFOUE8KUVZMUjIzRUtQbVl0eHJoTzM0ZVp0eWVwYXp2eXR2OHE1Nk5vT1NCYnhwUHpSczVUSkdMaW1FSTB0a0hybTJ4UApCYU43dFhrdlF5eHRTdGovRjgyMjlkRVp6TDNLSllJcHI5K21hMERvSkdva05PY0lyd0gvallhNEltUVVtUGYyCmg4SnRLWEhHc21XOWVjT0cxRGRKVVRoU3J3dk1XbmN1K0c1cGJsWFZBb0dCQUxnT1loak5WN1dCY01RTFIwZjYKZVNHNFdxbys2L0svVkxnRWJJeGlLbzJLL25QbUVzZ1N5WmtibGFoeVdWZVNnQ0gxY3F3dE9qdU1rcjNwL1Q0Sgp5Q0FUaktkdks4OTAzZytiUUtiQ0pJck9yWHpiNkY0cDJ3TEk4Q3VmTWxONEtJa2t5b1BlTWlYUnExZ3FiZTBmCjd6bEVhTjBPUDcrSDM5UjExUzhQSGdJcEFvR0JBTW5LU1lZRUZkTmVkUkNZTUNsTVM3NCsvclkwdk11Q2RFSXEKdUVHQWZGeU4wMlVGYzhJQ2lEb0Z0Qlh2Ym16amNWSUEvMWcvOWljY2xoenZpMDJ0eXhuY1k5bnhnSlNZMEo5dgo0L1ZwOGVrR3docTFvQWsweHJkYXA1VmdQTE9veEF3SnZsSEgrcUpCTVptb3FTZFZmejJsQmxKb3hBaXppc1RkCjVTWWNJRmg1QW9HQU5kVmhsczhBTzJuVmhsMEFuTHd3ZE1iMlJCMm1lSEpGcm5tdEV1N0kreGlFbmFuKzF0czUKOHp5UHdxWUF1dE5RdzFNTnBYK2Z2OTR1dnZWR01iSTFTZzlpV2NVMnJHMWYxbHJ3VS8ra1lUaXdndFFPNlRwaApYV2hDeFpwY01tWmFMOEM5QS9BeFFCS2pCVGpWRURrRnd0WkhBVDJyOEk2R0wyTGQ2TjZFZ013PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
########################################
  • 쿠버네티스 클러스터 접근 확인
  • k 명령어 사용
[root@sjh-k8s-test-node .kube]# k get nodes
NAME                   STATUS   ROLES                  AGE   VERSION
sjh-k8s-master-node    Ready    control-plane,master   55m   v1.23.1
sjh-k8s-worker1-node   Ready    worker                 41m   v1.23.1

컨테이너 간 통신 확인

  • 컨테이너 간 통신을 해 주는 CNI제품이 정상적으로 동작하는지 반드시 확인 필수
  • 확인 방법은 테스트 용 파드를 실행하고 파드안에서 'kubernetes'라는 k8s service를 접근하는 지 테스트 하면 된다.
  • test node에서 아래와 같이 테스트 실행
[root@sjh-k8s-test-node .kube]# k run curl -it --image=curlimages/curl -- sh

에러 트러블슈팅

DNS 에러(1) 발생

Copy
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
;; connection timed out; no servers could be reached
  • 원인은 kobernetes 의 DNS 역할을 하는 코어 DNScoredns가 제대로 동작하지 않기 때문.
  • 해결방법은 coredns 재시작
k rollout restart deploy coredns -n kube-system

방화벽 에러(2) 발생

Error from server: Get "https://10.100.14.141:10250/containerLogs/default/curl/curl": dial tcp 10.100.14.141:10250: connect: no route to host
  • 원인은 worker1 node의 방화벽 포트 open 문제
  • 해결방법은 worker1 node 및 master node 의 방화벽 disable
systemctl stop firewalld && systemctl disable firewalld
  • curl 파드에서 exit 입력해서 빠져나온 후 아래 명령어 실행
[root@sjh-k8s-test-node ~]# k rollout restart deploy coredns -n kube-system
deployment.apps/coredns restarted
  • 파드 ‘curl’을 아래와 같이 들어가서 nslookup 재시도
  • 아래와 같이 service ‘kubernetes’를 ‘kubernetes.default.svc.cluster.local’라는 주소로 찾으면 CNI 정상 동작
[root@sjh-k8s-test-node ~]# k get po
NAME   READY   STATUS    RESTARTS      AGE
curl   1/1     Running   1 (29s ago)   87s

[root@sjh-k8s-test-node ~]# k exec -it curl -- sh
/ $ nslookup kubernetes
Server:         10.96.0.10
Address:        10.96.0.10:53


Name:   kubernetes.default.svc.cluster.local
Address: 10.96.0.1

** server can't find kubernetes.svc.cluster.local: NXDOMAIN
** server can't find kubernetes.cluster.local: NXDOMAIN
728x90
LIST