DD 명령을 이용한 부팅 가능 미디어 생성

linux 상에서 Windows 또는 Linux 설치를 위한 부팅 가능 USB 미디어를 생성하는 방법이다.
Windows에서는 Rufus 등을 이용하여 미디어를 생성하지만 Linux의 경우 Disk Dump 명령을 이용 하여 미디어를 생성할 수 있다.

dd는 파일을 변환하고 복사하는 것이 주 목적인 유닉스 및 유닉스 계열 운영 체제용 명령 줄 유틸리티이다.
유닉스에서 하드웨어와 특수 장치 파일용 장치 드라이버는 파일 시스템에서 마치 일반 파일처럼 나타난다.
dd는 기능이 개별 드라이버에서 구현되어 있는 경우 이러한 파일들을 읽거나 기록하는 것이 가능하다.
그러므로 dd는 하드 드라이브의 부팅 섹터를 백업하는 등의 일과 고정된 크기의 랜덤 데이터를 취득하기 위해 사용할 수 있다.
dd 프로그램은 복사 시 데이터에 변환을 수행할 수도 있는데, 여기에는 바이트 순서 스와핑, ASCII↔EBCDIC 텍스트 인코딩 변환을 포함할 수 있다. 1위키백과에서 발췌

일반적 사용방법은 다음과 같다

dd if="source file 또는 data 또는 device" of="target file 또는 device" bs="block size" count="block count"

부팅용 USB 를 만드는 경우는 다음과 같이 입력하면 된다.

[haedong@haedong:~]$ sudo dd if=linux-install-media.iso of=/dev/sdx bs=8M oflag=direct status=progress
595591168 bytes (596 MB) copied, 131.502109 s, 4.5 MB/s
71+1 records in
71+1 records out
602931200 bytes (603 MB) copied, 132.264 s, 4.6 MB/s

Kubesphere #1. 설치

Kubephere는 플러그앤 플레이 아키텍쳐를 통해 타사 애플리케이션을 해당 에코시스템에 원활하게 통합할 수 있는 kubernetes를 커널로 하는 클라우드 네이티브 애플리케이션 관리를 위한 분산 운영체제 이다.kubesphere 홈페이지 발췌

설치는 Kubesphere 홈페이지를 참고했다.

Kubesphere는 다음 Kubernetes 런타임을 지원한다.

Supported Container RuntimeVersion
Docker19.3.8 +
containerd (experimental, not fully tested)Latest
CRI-O (experimental, not fully tested)Latest
iSula (experimental, not fully tested)Latest

본 예제는 총 4대의 가상머신 (CentOS7, 4core CPU, 8GB RAM, 128GB storage)으로 테스트 하였다.

작업을 시작하기 전에 이 포스트를 참고하여 kubesphere 구성을 할 서버들 간의 SSH key를 맞춰주도록 한다.

의존성 패키지 설치
kubernetes v1.18 이상은 socat과 conntrack 패키지가 필요하고 ebtables와 ipset 패키지는 권장, v1.18 미만은 모두 설치를 권장한다.

haedong@haedong:~/kubesphere:]$ sudo yum install socat conntrack ebtables ipset
Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Loading mirror speeds from cached hostfile
Package socat-1.7.3.2-2.el7.x86_64 already installed and latest version
...중략...
---> Package libnetfilter_queue.x86_64 0:1.0.2-2.el7_2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================================================================
 Package                                              Arch                                 Version                                       Repository                                  Size
==========================================================================================================================================================================================
Installing:
 conntrack-tools                                      x86_64                               1.4.4-7.el7                                   ...중략...
local_centos                                23 k
Transaction Summary
==========================================================================================================================================================================================
Install  1 Package (+3 Dependent packages)
Total download size: 245 k
(4/4): libnetfilter_queue-1.0.2-2.el7_2.x86_64.rpm                                                                                                                 ...중략...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                     1.6 MB/s | 245 kB  00:00:00
Running transaction check
...중략...
  Verifying  : libnetfilter_queue-1.0.2-2.el7_2.x86_64                                                                                                                                4/4
Installed:
  conntrack-tools.x86_64 0:1.4.4-7.el7
...중략...
Complete!

Kubesphere는 다음 port들을 사용한다. 본인 소유의 시스템이 아니라면 관리자에 다음 표의 포트 개방을 요청 해야 한다.

ServiceProtocolActionStart PortEnd PortNotes
sshTCPallow22
etcdTCPallow23792380
apiserverTCPallow6443
calicoTCPallow90999100
bgpTCPallow179
nodeportTCPallow3000032767
masterTCPallow1025010258
dnsTCPallow53
dnsUDPallow53
local-registryTCPallow5000For the offline environment
local-aptTCPallow5080For the offline environment
rpcbindTCPallow111Required if NFS is used
ipipIPENCAP / IPIPallowCalico needs to allow the ipip protocol
metrics-serverTCPallow8443

Kubekey 다운로드

haedong@kubesphere-01:~:]$ curl -ksfL https://get-kk.kubesphere.io | VERSION=v1.1.1 sh -
Downloading kubekey v1.1.1 from https://github.com/kubesphere/kubekey/releases/download/v1.1.1/kubekey-v1.1.1-linux-amd64.tar.gz ...
Failed to download Kubekey v1.1.1 !
Please verify the version you are trying to download.

잘 안된다…… github 릴리즈 페이지에서 다운로드 하자.

haedong@kubesphere-01:~:]$ wget --no-check-certificate https://github.com/kubesphere/kubekey/releases/download/v1.1.1/kubekey-v1.1.1-linux-amd64.tar.gz
--2021-08-25 14:53:24--  https://github.com/kubesphere/kubekey/releases/download/v1.1.1/kubekey-v1.1.1-linux-amd64.tar.gz
Connecting to 168.219.61.252:8080... connected.
...중략...
Length: 13341858 (13M) [application/octet-stream]
Saving to: ‘kubekey-v1.1.1-linux-amd64.tar.gz’

100%[================================================================================================================================================>] 13,341,858  3.14MB/s   in 4.4s

2021-08-25 14:53:30 (2.88 MB/s) - ‘kubekey-v1.1.1-linux-amd64.tar.gz’ saved [13341858/13341858]

압축을 해제하고 권한을 변경한다.

haedong@kubesphere-01:~:]$ tar -xvzf kubekey-v1.1.1-linux-amd64.tar.gz
README.md
README_zh-CN.md
kk
haedong@kubesphere-01:~:]$ chmod +x kk
haedong@kubesphere-01:~:]$ ll
합계 26428
-rw-r--r-- 1 haedong haedong    22906  7월 12 16:00 README.md
-rw-r--r-- 1 haedong haedong    22845  7월 12 16:00 README_zh-CN.md
-rwxr-xr-x 1 haedong haedong 13668116  7월 12 16:02 kk
-rw-rw-r-- 1 haedong haedong 13341858  7월 12 16:03 kubekey-v1.1.1-linux-amd64.tar.gz

설치
다운로드한 kk가 지원하는 kubernetes 버전을 확인한다. 1예제는 Kubekey를 이용해 Kubesphere와 Kubernetes를 함께 설치하는 방법을 나열한다. 기존에 설치되어있는 Kubernetes를 이용하는 경우는 여기를 눌러 설치 방법을 확인하면 된다.

haedong@kubesphere-01:~:]$ ./kk version --show-supported-k8s
v1.15.12
v1.16.8
v1.16.10
v1.16.12
v1.16.13
v1.17.0
v1.17.4
v1.17.5
v1.17.6
v1.17.7
v1.17.8
v1.17.9
v1.18.3
v1.18.5
v1.18.6
v1.18.8
v1.19.0
v1.19.8
v1.19.9
v1.20.4
v1.20.6

다음 템플릿대로 실행하면 된다
./kk create cluster [–with-kubernetes version] [–with-kubesphere version]

만약 부족한 패키지가 있다면 다음과 같이 표시될 것이다.

haedong@kubesphere-01:~:]$ sudo ./kk create cluster --with-kubernetes v1.20.4 --with-kubesphere v3.1.1
[sudo] haedong의 암호:
+---------------+------+------+---------+----------+-------+-------+-----------+--------+------------+-------------+------------------+--------------+
| name          | sudo | curl | openssl | ebtables | socat | ipset | conntrack | docker | nfs client | ceph client | glusterfs client | time         |
+---------------+------+------+---------+----------+-------+-------+-----------+--------+------------+-------------+------------------+--------------+
| kubesphere-01 | y    | y    | y       | y        |       | y     |           |        | y          |             |                  | KST 15:17:51 |
+---------------+------+------+---------+----------+-------+-------+-----------+--------+------------+-------------+------------------+--------------+
kubesphere-01: conntrack is required.

필요한 패키지가 모두 설치 되어있다면 다음과 같이 진행 된다.

haedong@kubesphere-01:~:]# sudo./kk create cluster --with-kubernetes v1.20.4 --with-kubesphere v3.1.1
+--------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+---------                               -----+
| name   | sudo | curl | openssl | ebtables | socat | ipset | conntrack | docker  | nfs client | ceph client | glusterfs client | time                                        |
+--------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+---------                               -----+
| kube01 | y    | y    | y       | y        | y     | y     | y         | 20.10.8 | y          |             |                  | KST 09:5                               2:43 |
+--------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+---------                               -----+

This is a simple check of your environment.
Before installation, you should ensure that your machines meet all requirements specified at
https://github.com/kubesphere/kubekey#requirements-and-recommendations

Continue this installation? [yes/no]: yes
INFO[09:52:45 KST] Downloading Installation Files
INFO[09:52:45 KST] Downloading kubeadm ...
INFO[09:52:49 KST] Downloading kubelet ...
INFO[09:53:00 KST] Downloading kubectl ...
INFO[09:53:07 KST] Downloading helm ...
INFO[09:53:11 KST] Downloading kubecni ...
INFO[09:53:18 KST] Configuring operating system ...

...중략...

clusterconfiguration.installer.kubesphere.io/ks-installer created
#####################################################
###              Welcome to KubeSphere!           ###
#####################################################

Console: http://0.0.0.0:30880
Account: admin
Password: P@88w0rd

NOTES:
  1. After you log into the console, please check the
     monitoring status of service components in
     "Cluster Management". If any service is not
     ready, please wait patiently until all components
     are up and running.
  2. Please change the default password after login.

#####################################################
https://kubesphere.io             2021-09-07 10:00:00
#####################################################
INFO[10:00:11 KST] Installation is complete.

Please check the result using the command:

       kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

You have new mail in /var/spool/mail/root

kubekey를 이용한 설치 시 31개의 Docker image를 가져오게 되는데 운영 환경 제약 등으로 실패할 경우 아래 명령을 이용해 설치 전 이미지를 다운 받으면 된다.

docker pull docker.io/kubesphere/ks-installer:v3.1.1  &&\
docker pull docker.io/kubesphere/ks-controller-manager:v3.1.1  &&\
docker pull docker.io/kubesphere/ks-apiserver:v3.1.1  &&\
docker pull docker.io/kubesphere/ks-console:v3.1.1  &&\
docker pull docker.io/openebs/provisioner-localpv:2.10.1  &&\
docker pull docker.io/kubesphere/notification-manager:v1.0.0  &&\
docker pull docker.io/kubesphere/notification-manager-operator:v1.0.0  &&\
docker pull docker.io/openebs/linux-utils:2.10.0  &&\
docker pull docker.io/kubesphere/kubectl:v1.20.0 &&\
docker pull docker.io/prom/prometheus:v2.26.0 &&\
docker pull docker.io/kubesphere/kube-proxy:v1.20.4 &&\
docker pull docker.io/kubesphere/kube-apiserver:v1.20.4 &&\
docker pull docker.io/kubesphere/kube-controller-manager:v1.20.4 &&\
docker pull docker.io/kubesphere/kube-scheduler:v1.20.4 &&\
docker pull docker.io/csiplugin/snapshot-controller:v3.0.3  &&\
docker pull docker.io/kubesphere/kube-rbac-proxy:v0.8.0  &&\
docker pull docker.io/calico/node:v3.16.3 &&\
docker pull docker.io/calico/pod2daemon-flexvol:v3.16.3 &&\
docker pull docker.io/calico/cni:v3.16.3 &&\
docker pull docker.io/calico/kube-controllers:v3.16.3 &&\
docker pull docker.io/kubesphere/prometheus-config-reloader:v0.42.1 &&\
docker pull docker.io/kubesphere/prometheus-operator:v0.42.1 &&\
docker pull docker.io/kubesphere/etcd:v3.4.13 &&\
docker pull docker.io/prom/alertmanager:v0.21.0 &&\
docker pull docker.io/kubesphere/kube-state-metrics:v1.9.7  &&\
docker pull docker.io/kubesphere/k8s-dns-node-cache:1.15.12 &&\
docker pull docker.io/coredns/coredns:1.6.9   &&\
docker pull docker.io/kubesphere/pause:3.2     &&\
docker pull docker.io/jimmidyson/configmap-reload:v0.3.0  &&\
docker pull docker.io/prom/node-exporter:v0.18.1 &&\
docker pull docker.io/mirrorgooglecontainers/defaultbackend-amd64:1.4    

일반적인 환경에서는

haedong@kubesphere-01:~:]$ curl -ksfL https://get-kk.kubesphere.io | VERSION=v1.1.1 sh -
haedong@kubesphere-01:~:]# sudo./kk create cluster --with-kubernetes v1.20.4 --with-kubesphere v3.1.1

위 두 줄 명령으로 설치가 진행되지만 특수한 환경에서는2 Proxy를 통한 외부 연결 등
Docker runtime 설치 -> Docker service 스크립트에 proxy 정보 추가 -> image pull -> 설치 의 순서로 진행해야 할 수 있다.

kubernetes #5. Harbor 설치

Harbor1항구를 의미한다. docker, 컨테이너 등이 쌓여있는 항구를 생각하면 잘 지은 이름이란 생각이 든다.는 정책 및 역할 기반 액세스 제어로 아티팩트를 보호하고, 이미지가 스캔되고 취약성이 없는지 확인하고, 이미지를 신뢰할 수 있는 것으로 서명하는 오픈 소스 레지스트리이다. 규정 준수, 성능 및 상호 운용성 제공을 통해 Kubernetes 및 Docker와 같은 클라우드 네이티브 컴퓨팅 플랫폼에서 일관되고 안전하게 아티팩트를 관리하기 위한 도구이다. 2Habor 홈페이지에서 발췌

다운로드
여기에서 버전 정보를 확인하고 다운로드 하자

haedong@kubesphere-01:~:]$ wget --no-check-certificate https://github.com/goharbor/harbor/releases/download/v2.3.2/harbor-offline-installer-v2.3.2.tgz
--2021-08-26 16:07:43--  https://github.com/goharbor/harbor/releases/download/v2.3.2/harbor-offline-installer-v2.3.2.tgz
Connecting to 168.219.61.252:8080... connected.
Saving to: ‘harbor-offline-installer-v2.3.2.tgz’
100%[======================================================================================================================================================>] 605,477,475 3.56MB/s   in 2m 54s

haedong@kubesphere-01:~:]$ tar -xvzf harbor-offline-installer-v2.3.2.tgz
harbor/harbor.v2.3.2.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/common.sh
harbor/harbor.yml.tmpl

harbor.yaml 수정
세세한 옵션은 원본 harbor.yml.tmpl 파일의 주석을 참고하자.

haedong@kubesphere-01:~:]$ cp harbor/harbor.yml.tmpl harbor/harbor.yml
haedong@kubesphere-01:~:]$ vi harbor/harvor.yml
# 아래를 몽땅 붙여넣기 한다.
hostname: kubesphere-01
http:
  port: 80
harbor_admin_password: 비밀번호_password
database:
  password: 비밀번호_password
  max_idle_conns: 100
  max_open_conns: 900
data_volume: /data
trivy:
  ignore_unfixed: false
  skip_update: false
  insecure: false
jobservice:
  max_job_workers: 10
notification:
  webhook_job_max_retry: 10
chart:
  absolute_url: disabled
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
_version: 2.3.0
proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - trivy

인스톨
sudo 명령 사용시 PATH 변수와 관련해서 docker-compose를 인식하지 못할 수도 있다. ‘sudo -i’ 나 ‘su – root’ 등의 명령으로 root로 로그인한 뒤 작업하자.

root@kubesphere-01:/home/haedong/harbor:]# ./install.sh
[Step 0]: checking if docker is installed ...
Note: docker version: 20.10.8
[Step 1]: checking docker-compose is installed ...
Note: docker-compose version: 1.29.2
[Step 2]: loading Harbor images ...
Loaded image: goharbor/redis-photon:v2.3.2
...중략...
Creating harbor-portal ... done
Creating harbor-core   ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
✔ ----Harbor has been installed and started successfully.----

웹브라우저를 이용해 설정에
kubesphere-01에 해당하는 호스트 80 포트로 접속을 시도해본다.
계정 : admin
패스워드 : 패스워드_password (yaml 파일의 harbor_admin_password: 에 넣은 값)

kubernetes #4. docker compse 설치

Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구로써 Compose에서는 YAML 파일을 사용하여 애플리케이션 서비스를 구성하고 단일 명령으로 구성에서 모든 서비스를 만들고 시작할 수 있도록 한다.

“For alpine, the following dependency packages are needed: py-pippython3-devlibffi-devopenssl-devgcclibc-devrustcargo and make. “1 yum을 이용할 경우 패키지의 이름이 다르다. 아래 명령줄을 참고하자.라고 한다. 관련 패키지를 설치한다.

haedong@kubesphere-01:~:]$ sudo yum install python-pip python3-devel libffi-devel openssl-devel gcc libc-devel rust cargo  make
...중략...
  Verifying  : redhat-rpm-config-9.1.0-88.el7.centos.noarch                                                                                                                                                                                                                                29/29

Installed:
  cargo.x86_64 0:1.53.0-1.el7                libffi-devel.x86_64 0:3.0.13-19.el7                openssl-devel.x86_64 1:1.0.2k-19.el7                python2-pip.noarch 0:8.1.2-14.el7                python3-devel.x86_64 0:3.6.8-17.el7                rust.x86_64 0:1.53.0-1.el7
Dependency Installed:
  dwz.x86_64 0:0.11-3.el7             keyutils-libs-devel.x86_64 0:1.5.8-3.el7 krb5-devel.x86_64 0:1.15.1-50.el7       libcom_err-devel.x86_64 0:1.42.9-19.el7 libkadm5.x86_64 0:1.15.1-50.el7           libselinux-devel.x86_64 0:2.5-15.el7 
...중략...
Complete!

설치
공식 홈페이지의 가이드는

haedong@kubesphere-01:~:]$ sudo curl -k -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (35) TCP connection reset by peer

이지만…… 왜인지 안된다. 그냥 다운로드 하자. 2여기에서 버전 정보를 확인할 수 있다.

haedong@kubesphere-01:~:]$ wget --no-check-certificate https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
--2021-08-26 15:52:24--  https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
Saving to: ‘docker-compose-Linux-x86_64’
100%[=======================================================================================================================================================================================================================================================>] 12,737,304  3.61MB/s   in 3.7s
2021-08-26 15:52:29 (3.29 MB/s) - ‘docker-compose-Linux-x86_64’ saved [12737304/12737304]

/usr/local/bin 경로로 파일 이동 후 권한 변경

haedong@kubesphere-01:~:]$ sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
haedong@kubesphere-01:~:]$ sudo chmod +x /usr/local/bin/docker-compose
haedong@kubesphere-01:~:]$ docker-compose
Define and run multi-container applications with Docker.
Usage:
  docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]
  docker-compose -h|--help
Options:
...후략

※ /usr/local/bin 디렉토리가 $PATH 에 포함되어있지 않다면 추가 해야 한다. /etc/profile (모든 사용자에 적용) ~/.bash_profile의 $PATH 에 위 경로를 추가하자.

haedong@kubesphere-01:~:]$ sudo echo export PATH=$PATH:/usr/local/bin >> ~/.bash_profile
haedong@kubesphere-01:~:]$ source ~/.bash_profile

kubernetes #3. 일반 사용자 계정으로 docker 관리

docker 그룹 생성

haedong@kubesphere-02:~:]$ sudo groupadd docker

docker 그룹에 속하는 사용자 생성

haedong@kubesphere-02:~:]$ sudo usermod -aG docker haedong

자동으로 생성되는 .docker 디렉토리 권한 변경

그룹 조정 이후 docker run $DOCKER_NAME 을 수행하면 에러메시지가 발생된다. 자동으로 생성되는 디렉토리 권한 문제로써 다음 명령으로 권한을 조정한다.

 haedong@kubesphere-02:~:]$  sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
 haedong@kubesphere-02:~:]$  sudo chmod g+rwx "$HOME/.docker" -R

kubernetes #2. Kubeadm 설치

시작하기에 앞서 MAC 주소 및 product_uuid가 모든 노드에 대해 고유한지 확인한다. 노드들의 MAC 주소나 product_uuid 가 겹칠 경우 설치 프로세스가 실패할 수 있다

haedong@kubesphere-01:~:]$ ifconfig -a
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:06:95:57:be  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.17.172.01  netmask 255.255.255.0  broadcast 172.17.172.255
        inet6 fe80::40e:bff:fe87:7c9c  prefixlen 64  scopeid 0x20<link>
        ether 06:0e:0b:87:7c:9c  txqueuelen 1000  (Ethernet)
        RX packets 380618  bytes 798003033 (761.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 271298  bytes 19716473 (18.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
haedong@kubesphere-01:~:]$  sudo cat /sys/class/dmi/id/product_uuid
A09CA5C4-EB6A-EAC0-4E2B-0B66A2DC0F3A

br_netfilter 모듈을 확인한다.
iptables가 브리지된 트래픽을 볼 수 있어야 한다. 다음 명령을 통해 설정한다.

haedong@kubesphere-01:~:]$ sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
haedong@kubesphere-01:~:]$ sudo 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-kubernetes-cri.conf ...
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
net.ipv4.conf.all.arp_notify = 1
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
* Applying /etc/sysctl.conf ...
net.ipv4.conf.all.arp_notify = 1

컨트롤 노드(controller node)는 다음 포트들을 개방해야 한다.

TCP인바운드6443*쿠버네티스 API 서버모두
TCP인바운드2379-2380etcd 서버 클라이언트 APIkube-apiserver, etcd
TCP인바운드10250kubelet API자체, 컨트롤 플레인
TCP인바운드10251kube-scheduler자체
TCP인바운드10252kube-controller-manager자체
*표시가 된 쿠버네티스 API 서버 포트는 사용자가 임의로 정의할 수 있다.

워커 노드(worker nodes)들은 다음 포트들을 개방해야 한다.

프로토콜방향포트 범위목적사용자
TCP인바운드10250kubelet API자체, 컨트롤 플레인
TCP인바운드30000-32767NodePort 서비스†모두

Kublet / Kubectl / Kubeadm 설치

  • kubeadm: 클러스터를 부트스트랩하는 명령이다.
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다.
  • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다.

yum 등 배포판을 이용한 설치는 아래 명령을 수행하면 된다.

haedong@kubesphere-01:~:]$ 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

# permissive 모드로 SELinux 설정(효과적으로 비활성화)
haedong@kubesphere-01:~:]$ sudo setenforce 0
haedong@kubesphere-01:~:]$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
haedong@kubesphere-01:~:]$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
haedong@kubesphere-01:~:]$ sudo systemctl enable --now kubelet

단 이 포스트를 작성하는 환경은 위 리포지토리 접속이 용이하지 않아 패키지 매니저를 이용하지 않는 방법을 추가로 기술한다.
CNI_VERSION은 여기에서 확인 후 입력하도록 한다.

haedong@kubesphere-01:~:]$ CNI_VERSION="v1.0.0"
haedong@kubesphere-01:~:]$ sudo mkdir -p /opt/cni/bin
haedong@kubesphere-01:~:]$ curl -k -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz

또는 세 번째 명령줄을 
haedong@kubesphere-01:~:]$ curl -k -L "https://github.com/containernetworking/plugins/releases/download/v1.0.0/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz

바이너리 다운로드를 위한 변수 설정
curl 명령줄에 디렉토리를 직접 지정할 수 있다. 1예제의 경우 서비스 등록 시 이 변수를 사용한다. 선언 해주자

haedong@kubesphere-01:~:]$ DOWNLOAD_DIR=/usr/local/bin
haedong@kubesphere-01:~:]$ sudo mkdir -p $DOWNLOAD_DIR

kubeadm / Kubelet 컨테이너 런타임 인터페이스(CRI)에 필요한 crictl 설치
CRICTL_VERSION은 여기에서 확인할 수 있다.
cni와 같이 직접 버전을 명시해도 된다.

haedong@kubesphere-01:~:]$ CRICTL_VERSION="v1.22.0"
haedong@kubesphere-01:~:]$ curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz

kubeadm, kubectl, kubelet 설치
이 글을 작성하는 시점의 kubelet은 v1.22.1인데 controlplane은 v1.21.0이다. 이 경우 다음 절의 kubadm 초기화 시 버전 차이로 인해 에러가 발생한다. RELEASE를 v1.21.1로 고정하여 다운로드 한다.

haedong@kubesphere-01:~:]$ RELEASE="$(curl -k -sSL https://dl.k8s.io/release/stable.txt)"
haedong@kubesphere-01:~:]$ cd $DOWNLOAD_DIR
haedong@kubesphere-01:~:]$ sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/v1.21.1/bin/linux/amd64/{kubeadm,kubelet,kubectl}
haedong@kubesphere-01:~:]$ sudo chmod +x {kubeadm,kubelet,kubectl}

systemd 서비스 추가 및 활성화

haedong@kubesphere-01:~:]$ RELEASE_VERSION="v0.4.0"
haedong@kubesphere-01:~:]$ curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service
haedong@kubesphere-01:~:]$ sudo mkdir -p /etc/systemd/system/kubelet.service.d
haedong@kubesphere-01:~:]$ curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
haedong@kubesphere-01:~:]$ systemctl enable --now kubelet

kubernetes #1. container runtime 설치

kubernetes1그리스어로 조타수(키잡이)를 의미한다.
오픈소스 기반의 컨테이너화 된 애플리케이션의 자동 디플로이, 스케일링 등을 제공하는 관리 시스템이다. 궁극적 목적은 여러 클러스터의 호스트 간 애플리케이션 컨테이너의 배치, 스케일링, 운영자동화 등을 위한 플랫폼 제공이다. 2위키백과 발췌

쿠버네티스 관리를 위한 도구이므로 쿠버네티스가 필요하다.

kubernetes 설치
https://dl.k8s.io/release/stable.txt에 최근 안정 버전 정보가 적혀있다.
글 작성일 기준으로 v1.22.1 이다. 아래 명령줄의 괄호 안 curl 명령을 v1.22.1로 치환해도 무방하다. (-k 옵션은 인증서 검증 생략 옵션이다.)

haedong@haedong:~:]$ curl -LO -k "https://dl.k8s.io/release/$(curl -L -s -k https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   154    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 44.7M  100 44.7M    0     0  4892k      0  0:00:09  0:00:09 --:--:-- 10.3M
또는
haedong@haedong:~:]$ curl -LO -k "https://dl.k8s.io/release/v1.22.1/bin/linux/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   154    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 44.7M  100 44.7M    0     0  4004k      0  0:00:11  0:00:11 --:--:-- 6095k

다운로드한 파일 검증

haedong@haedong:~:]$ curl -LO "https://dl.k8s.io/$(curl -L -s   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   154    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    64  100    64    0     0     52      0  0:00:01  0:00:01 --:--:--    52
haedong@haedong:~:]$ echo "$(<kubectl.sha256) kubectl" | sha256sum --check
kubectl: 성공

kubectl 설치

haedong@haedong:~:]$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
[sudo] haedong의 암호:
haedong@haedong:~:]$ ll /usr/local/bin/ | grep kubectl
-rwxr-xr-x 1 root root 46907392  8월 24 15:06 kubectl
haedong@haedong:~:]$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.1", GitCommit:"632ed300f2c34f6d6d15ca4cef3d3c7073412212", GitTreeState:"clean", BuildDate:"2021-08-19T15:45:37Z", GoVersion:"go1.16.7", Compiler:"gc", Platform:"linux/amd64"}

컨테이너 런타임 설치

containerd

haedong@haedong:~:]$ sudo vi /etc/modules-load.d/containerd.conf
# 아래 내용을 붙여 넣는다.
overlay
br_netfilter
haedong@haedong:~:]$ sudo modprobe overlay
haedong@haedong:~:]$ sudo modprobe br_netfilter
haedong@haedong:~:]$ sudo vi /etc/sysctl.d/99-kubernetes-cri.conf
# 아래 내용을 붙여 넣는다.
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
haedong@haedong:~:]$ sudo 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 /etc/sysctl.d/99-kubernetes-cri.conf ...
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
net.ipv4.conf.all.arp_notify = 1
* Applying /etc/sysctl.conf ...
net.ipv4.conf.all.arp_notify = 1

설치

Centos-Base repository 활성화
기본적으로 활성화 되어있지만, local repository를 구축했거나, 비활성화 했다면 활성화 해야 한다.

haedong@haedong:~:]$ sudo vi /etc/yum.repos.d/bak/CentOS-Base.repo
# [extras] 꼭지의 enabled 값이 0이라면 1로 수정한다.
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7


Docker 리포지터리 추가
rpm 파일들을 다운로드한 뒤 여기여기를 참고하여 로컬 리포지터리를 구축해도 된다.

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

오래된 버전의 docker 관련 패키지 삭제

haedong@haedong:~:]$ sudo sudo sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

Docker engine 설치 3자세한 설치 관련 내용은 docker 홈페이지를 참고.

haedong@haedong:/home:]$ sudo yum install docker-ce docker-ce-cli containerd.io
Loaded plugins: fastestmirror
...중략...
---> Package fuse3-libs.x86_64 0:3.6.1-4.el7 will be installed
---> Package libsemanage-python.x86_64 0:2.5-14.el7 will be installed
---> Package python-IPy.noarch 0:0.75-6.el7 will be installed
---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================================================================
 Package                                            Arch                            Version                                             Repository                                   Size
==========================================================================================================================================================================================
Installing:
 containerd.io                                      x86_64                          1.4.9-3.1.el7                                       docker                                       30 M
 docker-ce                                          x86_64                          3:20.10.8-3.el7                                     docker                                       23 M
 docker-ce-cli                                      x86_64                          1:20.10.8-3.el7                                     docker                                       29 M
...중략...
 slirp4netns                                        x86_64                          0.4.3-4.el7_8                                       local_centos-extra                           81 k
Transaction Summary
==========================================================================================================================================================================================
Install  3 Packages (+13 Dependent packages)
Total download size: 96 M
...중략...
(16/16): setools-libs-3.3.8-4.el7.x86_64.rpm                                                                                                                       | 620 kB  00:00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
...중략...
  Verifying  : libcgroup-0.41-21.el7.x86_64                                                                                                                                         16/16
Installed:
  containerd.io.x86_64 0:1.4.9-3.1.el7                           docker-ce.x86_64 3:20.10.8-3.el7                           docker-ce-cli.x86_64 1:20.10.8-3.el7
...중략...
Complete!

Docker 서비스 시작

haedong@haedong:/home:]$ sudo systemctl start docker.service

컨테이너 런타임 설치

containerd 설치

haedong@haedong:/home:]$ sudo mkdir -p /etc/containerd
haedong@haedong:/home:]$ containerd config default | sudo tee /etc/containerd/config.toml
version = 2
root = "/var/lib/containerd"
state = "/run/containerd"
plugin_dir = ""
disabled_plugins = []
required_plugins = []
oom_score = 0

[grpc]
  address = "/run/containerd/containerd.sock"
  tcp_address = ""
  tcp_tls_cert = ""
  tcp_tls_key = ""
  uid = 0
  gid = 0
  max_recv_message_size = 16777216
  max_send_message_size = 16777216

[ttrpc]
  address = ""
  uid = 0
  gid = 0

[debug]
  address = ""
  uid = 0
  gid = 0
  level = ""

[metrics]
  address = ""
  grpc_histogram = false

[cgroup]
  path = ""

[timeouts]
  "io.containerd.timeout.shim.cleanup" = "5s"
  "io.containerd.timeout.shim.load" = "5s"
  "io.containerd.timeout.shim.shutdown" = "3s"
  "io.containerd.timeout.task.state" = "2s"

[plugins]
  [plugins."io.containerd.gc.v1.scheduler"]
    pause_threshold = 0.02
    deletion_threshold = 0
    mutation_threshold = 100
    schedule_delay = "0s"
    startup_delay = "100ms"
  [plugins."io.containerd.grpc.v1.cri"]
    disable_tcp_service = true
    stream_server_address = "127.0.0.1"
    stream_server_port = "0"
    stream_idle_timeout = "4h0m0s"
    enable_selinux = false
    selinux_category_range = 1024
    sandbox_image = "k8s.gcr.io/pause:3.2"
    stats_collect_period = 10
    systemd_cgroup = false
    enable_tls_streaming = false
    max_container_log_line_size = 16384
    disable_cgroup = false
    disable_apparmor = false
    restrict_oom_score_adj = false
    max_concurrent_downloads = 3
    disable_proc_mount = false
    unset_seccomp_profile = ""
    tolerate_missing_hugetlb_controller = true
    disable_hugetlb_controller = true
    ignore_image_defined_volumes = false
    [plugins."io.containerd.grpc.v1.cri".containerd]
      snapshotter = "overlayfs"
      default_runtime_name = "runc"
      no_pivot = false
      disable_snapshot_annotations = true
      discard_unpacked_layers = false
      [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
        runtime_type = ""
        runtime_engine = ""
        runtime_root = ""
        privileged_without_host_devices = false
        base_runtime_spec = ""
      [plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]
        runtime_type = ""
        runtime_engine = ""
        runtime_root = ""
        privileged_without_host_devices = false
        base_runtime_spec = ""
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          runtime_type = "io.containerd.runc.v2"
          runtime_engine = ""
          runtime_root = ""
          privileged_without_host_devices = false
          base_runtime_spec = ""
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    [plugins."io.containerd.grpc.v1.cri".cni]
      bin_dir = "/opt/cni/bin"
      conf_dir = "/etc/cni/net.d"
      max_conf_num = 1
      conf_template = ""
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://registry-1.docker.io"]
    [plugins."io.containerd.grpc.v1.cri".image_decryption]
      key_model = ""
    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
      tls_cert_file = ""
      tls_key_file = ""
  [plugins."io.containerd.internal.v1.opt"]
    path = "/opt/containerd"
  [plugins."io.containerd.internal.v1.restart"]
    interval = "10s"
  [plugins."io.containerd.metadata.v1.bolt"]
    content_sharing_policy = "shared"
  [plugins."io.containerd.monitor.v1.cgroups"]
    no_prometheus = false
  [plugins."io.containerd.runtime.v1.linux"]
    shim = "containerd-shim"
    runtime = "runc"
    runtime_root = ""
    no_shim = false
    shim_debug = false
  [plugins."io.containerd.runtime.v2.task"]
    platforms = ["linux/amd64"]
  [plugins."io.containerd.service.v1.diff-service"]
    default = ["walking"]
  [plugins."io.containerd.snapshotter.v1.devmapper"]
    root_path = ""
    pool_name = ""
    base_image_size = ""
    async_remove = false

CRI-O 설치

# .conf 파일을 만들어 부팅 시 모듈을 로드한다
haedong@haedong:/home:]$ cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
> overlay
> br_netfilter
> EOF
haedong@haedong:/home:]$ sudo modprobe overlay
haedong@haedong:/home:]$ sudo modprobe br_netfilter
# 요구되는 sysctl 파라미터 설정, 이 설정은 재부팅 간에도 유지된다.
haedong@haedong:/home:]$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
> net.bridge.bridge-nf-call-iptables  = 1
> net.ipv4.ip_forward                 = 1
> net.bridge.bridge-nf-call-ip6tables = 1
> EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
haedong@haedong:/home:]$ sudo 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 /etc/sysctl.d/99-kubernetes-cri.conf ...
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
net.ipv4.conf.all.arp_notify = 1
* Applying /etc/sysctl.conf ...
net.ipv4.conf.all.arp_notify = 1

환경변수 설정
/etc/profile 등에 기재해도 된다.

haedong@haedong:/home:]$ export OS=CentOS_7
haedong@haedong:/home:]$ echo $OS
CentOS_7

$VERSION 을 사용자의 쿠버네티스 버전과 일치하는 CRI-O 버전으로 설정한다. 이번 예시의 경우 v1.21.2이다. 4작성일 기준으로 kubuernetes는 1.22.1이었는데 CRI-O는 1.21.2까지 존재한다. 그래서 1.22.1 이 아니고 1.21.2

haedong@haedong:/home:]$ sudo curl -L -k -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
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
haedong@haedong:/home:]$ sudo curl -k -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
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0

환경 탓인지 포스트를 작성하는 환경에서는 정상 동작을 하지 않는다.
안되면 다운받자. 여기에서 kubic_libcontainers repo 파일을 받거나 여기에 있는 rpm 파일들을 다운받아 yum을 이용해 설치, 여기에서 kubic_libcontainers repo 파일을 받거나 여기에 있는 rpm 파일들을 다운받고 yum으로 설치. 당연히 yum repository를 만들어놓고 사용해도 된다.

haedong@haedong:/home:]$ sudo yum -y install cri-o
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package cri-o.x86_64 0:1.21.2-4.2.el7 will be installed
...중략...
---> Package python-ipaddress.noarch 0:1.0.16-2.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================================================================
 Package                                                      Arch                         Version                                        Repository                                 Size
==========================================================================================================================================================================================
Installing:
 cri-o                                                        x86_64                       1.21.2-4.2.el7                                 libcontainers_cri-o                        25 M
...중략...
Transaction Summary
==========================================================================================================================================================================================
Install  1 Package (+19 Dependent packages)
Total download size: 67 M
Installed size: 210 M
Downloading packages:
(1/20): conmon-2.0.29-1.el7.3.2.x86_64.rpm                                                                                                                         ...중략...
(20/20): containernetworking-plugins-1.0.0-0.2.rc1.el7.6.2.x86_64.rpm                                                                                              |  39 MB  00:00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                      83 MB/s |  67 MB  00:00:00
Running transaction check
...중략...
Installed:
  cri-o.x86_64 0:1.21.2-4.2.el7
...중략...
Complete!

CRI-O 시작
※ 다음 절에서 docker 데몬을 실행할 것이므로 서비스를 시작하지 않는다.

# 다음절에서 docker 데몬을 시작할 것이므로 수행하지 않는다.
haedong@haedong:/home:]$ sudo systemctl daemon-reload
haedong@haedong:/home:]$ sudo systemctl enable crio --now
Created symlink from /etc/systemd/system/multi-user.target.wants/crio.service to /usr/lib/systemd/system/crio.service.

cgroup 드라이버 설정

haedong@haedong:/home:]$ sudo vi /etc/crio/crio.conf
# [crio.runtime] 섹션에 아래 내용을 추가한다.
conmon_cgroup = "pod"
cgroup_manager = "cgroupfs"

Docker

컨테이너 cgroup 관리에 systemd를 사용하기 위한 docker 데몬 구성

haedong@haedong:/home:]$ sudo mkdir /etc/docker
haedong@haedong:/home:]$ 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"
> }
> EOF

docker 재시작 및 서비스 설정

haedong@haedong:/home:]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
haedong@haedong:/home:]$ sudo systemctl daemon-reload
haedong@haedong:/home:]$ sudo systemctl restart docker