시작하기에 앞서 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-2380 | etcd 서버 클라이언트 API | kube-apiserver, etcd |
TCP | 인바운드 | 10250 | kubelet API | 자체, 컨트롤 플레인 |
TCP | 인바운드 | 10251 | kube-scheduler | 자체 |
TCP | 인바운드 | 10252 | kube-controller-manager | 자체 |
워커 노드(worker nodes)들은 다음 포트들을 개방해야 한다.
프로토콜 | 방향 | 포트 범위 | 목적 | 사용자 |
---|---|---|---|---|
TCP | 인바운드 | 10250 | kubelet API | 자체, 컨트롤 플레인 |
TCP | 인바운드 | 30000-32767 | NodePort 서비스† | 모두 |
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