우분투에 쿠버네티스(k8s) 클러스터를 구성하는 방법
컨트롤 플레인(Control Plane)/워커 노드(worker nodes) 적용
| 컨트롤 플레인 | knode111 | 
| 워커 노드 | knode112, knode121, knode122 | 
| 컨테이너 런타임 | containerd | 
| 네트워크 플러그인 | Calico | 
1. 호스트명 변경
sudo hostnamectl set-hostname {호스트이름}2. 호스트(/etc/hosts) 파일 수정
vim /etc/hosts# kubernetes cluster
192.168.0.111 knode111
192.168.0.112 konde112
192.168.0.121 knode121
192.168.0.122 node122또는
cat <<EOF >> /etc/hosts
# kubernetes cluster
192.168.0.111 knode111
192.168.0.112 konde112
192.168.0.121 knode121
192.168.0.122 knode122
EOF3. 스왑 비활성화(스왑 끄기)
sudo swapoff -asudo sed -i '/\/swap\.img[[:space:]]\+none[[:space:]]\+swap[[:space:]]\+sw[[:space:]]\+0[[:space:]]\+0/s/^/#/' /etc/fstabswapon -s4. 방화벽(firewalld) 비활성화
sudo systemctl stop ufw && sudo systemctl disable ufw5. Kernel Parameters 추가
br_netfilter 모듈 로드
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOFsudo modprobe overlaysudo modprobe br_netfilter모듈 확인
lsmod | grep "overlay\|br_netfilter"IP 포워딩 활성화
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOFsudo echo 1 > /proc/sys/net/ipv4/ip_forwardsudo sysctl -p시스템 패키지 업데이트 및 필수 패키지 설치
sudo apt-get updatesudo apt-get install -y gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release curlcontainerd 설치 및 설정
- 모든 서버에서 containerd를 설치하고 설정합니다.
Docker 리포지토리 추가
sudo rm -f /etc/apt/trusted.gpg.d/docker.gpgsudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpgsudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"containerd 설치
sudo apt-get updatesudo apt-get install -y containerdcontainerd 버전 정보 확인
$ containerd --version
containerd github.com/containerd/containerd 1.7.12containerd 설정 파일 생성
sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml > /dev/nullcontainerd 설정 파일 수정
- config.toml 파일에서 SystemdCgroup = true로 설정합니다.
sudo sed -i 's/^\([[:blank:]]*\)SystemdCgroup = false/\1SystemdCgroup = true/' /etc/containerd/config.tomlcat /etc/containerd/config.toml | grep SystemdCgroupcontainerd CNI 플러그인 설치
CNI_VERSION="v1.5.1"CNI_TGZ=https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgzsudo mkdir -p /opt/cni/bincurl -fsSL $CNI_TGZ | sudo tar -C /opt/cni/bin -xzcontainerd 서비스 재시작
sudo systemctl --now enable containerdsudo systemctl status containerd --no-pager -l쿠버네티스 설치
sudo rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg구글 클라우드의 공개 사이닝 키를 다운로드
KUBERNETES_VERSION="v1.27"sudo mkdir -p -m 755 /etc/apt/keyringscurl -fsSL https://pkgs.k8s.io/core:/stable:/${KUBERNETES_VERSION}/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg쿠버네티스 apt 리포지터리를 추가
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${KUBERNETES_VERSION}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list모든 서버에서 kubeadm, kubelet, kubectl을 설치
sudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectlsudo systemctl --now enable kubeletsudo systemctl status kubelet --no-pager -l컨트롤 플레인 노드 초기화
---
containerd를 컨테이너 런타임 설정
containerd config default | sudo tee /etc/containerd/config.tomlsudo systemctl restart containerdDocker를 컨테이너 런타임으로 설정
- Kubernetes 1.20부터는 Docker가 더 이상 기본 CRI(Container Runtime Interface)가 아니므로 kubelet이 Docker를 사용하도록 명시적으로 설정해야 합니다.
- kubeadm 초기화 시 --cri-socket 옵션을 사용하여 Docker를 명시할 수 있습니다.
---
컨트롤 플레인 노드(knode111)에서 kubeadm을 사용하여 클러스터를 초기화합니다.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
I0717 21:04:27.683663   17582 version.go:256] remote version is much newer: v1.30.3; falling back to: stable-1.27
[init] Using Kubernetes version: v1.27.16
...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
  export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.10.111:6443 --token 6d0y69.e7x49eqwnap0s98l \
	--discovery-token-ca-cert-hash sha256:8dc5ff732dc26ade1608bd64eb579cc4690240e7fc0bfb0ddb8d1cabcc974d98명령이 성공하면 kubeadm join 명령이 출력됩니다. 이 명령은 워커 노드를 클러스터에 추가할 때 사용됩니다.
쿠버네티스 관련 패지키 재설치
---
held 상태 해제
sudo apt-mark unhold kubelet kubeadm kubectlkubelet, kubeadm, kubectl 패키지 삭제
sudo apt-get purge -y kubelet kubeadm kubectlsudo apt-get autoremove -y관련 디렉터리 및 설정 파일 제거
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/kubelet
sudo rm -rf /etc/systemd/system/kubelet.service.d
sudo rm -rf /var/lib/containerd
sudo rm -rf ~/.kube오류 발생 시 초기화
sudo kubeadm reset---
kubeconfig 설정
컨트롤 플레인 노드에서 kubectl을 사용하려면 일반 사용자로 kubeconfig 파일을 설정해야 합니다.
su - vagrantmkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configkubectl config view$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.10.111:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: DATA+OMITTED
    client-key-data: DATA+OMITTED네트워크 플러그인 설치(CNI 설정 - 마스터 노드)
Calico 설치 쿠버네티스 클러스터에서 네트워크를 설정하기 위해 Calico를 설치합니다.
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml---
플란넬(Flannel) 사용
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created---
클러스터 상태 확인
kubectl get nodes$ kubectl get nodes
NAME      STATUS     ROLES           AGE   VERSION
node111   NotReady   control-plane   4m    v1.27.16kubectl get pods --all-namespaces$ kubectl get pods --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   coredns-f9fd979d6-hdz6v          1/1     Running   0          7m6s
kube-system   coredns-f9fd979d6-k8f29          1/1     Running   0          7m6s
kube-system   etcd-bk8sm1                      1/1     Running   0          7m17s
kube-system   kube-apiserver-bk8sm1            1/1     Running   0          7m17s
kube-system   kube-controller-manager-bk8sm1   1/1     Running   0          7m17s
kube-system   kube-proxy-wbs9r                 1/1     Running   0          7m6s
kube-system   kube-scheduler-bk8sm1            1/1     Running   0          7m17s워커 노드 클러스터 구성(워커 노드 join)
각 워커 노드에서 다음 명령을 실행하여 클러스터에 추가합니다. 이 명령은 kubeadm init 명령 실행 시 출력된 kubeadm join 명령입니다.
sudo kubeadm join <knode111_IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>각 워커 노드에서 위 명령을 실행하여 클러스터에 조인합니다.
$ kubeadm join 192.168.10.111:6443 --token ifdkf1.pydpuynztqkmycui \
>         --discovery-token-ca-cert-hash sha256:c85e9f9e68772dff4d33b85b73c8519bc499f1b992c4bd7ea31c8876725be53d
...
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.클러스터 상태 확인
- 모든 노드가 정상적으로 클러스터에 조인되었는지 확인합니다.
$ kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
node111  Ready    master   11m     v1.27.16
knode112 Ready    <none>   2m12s   v1.27.16
knode121 Ready    <none>   2m12s   v1.27.16
knode122 Ready    <none>   2m12s   v1.27.16
참고URL
- phoenixNAP : https://phoenixnap.com/kb/how-to-install-kubernetes-on-centos
- docker docs : Install using the convenience script
- kubernetes docs : kubeadm 설치하기
'리눅스' 카테고리의 다른 글
| [Kubernetes] kubernetes nginx 배포 테스트 -2 (0) | 2020.10.04 | 
|---|---|
| [Kubernetes] Kubernetes docker cgroupfs 오류 (0) | 2020.10.04 | 
| [VPN] SoftEther VPN 설치 및 설정-3 (0) | 2020.10.04 | 
| 웹 서버에서 HSTS(HTTP Strict Transport Security)를 설정하는 방법 (1) | 2020.09.29 | 
| [VPN] OPENVPN 스크립트로 패키지 설치 (0) | 2020.09.28 | 
 
                  
                 
                  
                 
                  
                