Kubernetes

[Rancher] Kubernetes 클러스터 구축

테런 2024. 5. 23. 10:24
Overview

 

  • Rancher를 통한 Kubernetes 클러스터 구축
 

[AWS] Rancher를 통한 Kubernetes 클러스터 구축

Overview AWS 환경에서 Rancher를 통한 Kubernetes 클러스터 구축하기 AWS 환경에서 구축을 진행하지만, 베어 메탈 및 다양한 클라우드 플랫폼에서 적용 가능합니다. Architecture AWS 환경VPC 구성 - 가용 영

taronko.tistory.com

 

Prerequisite

 

인프라 구축은 완료되었다고 가정하고 진행합니다. AWS 인프라 구축은 Overview 탭의 블로그를 참조해주시길 바랍니다.

 

Master Node
// Master Node가 설치될 EC2 인스턴스로 접속
$ ssh -i {*-key.pem} ubuntu@{ip}

// root로 실행
$ sudo su -
$ export EXTERNAL_IP={EC2 인스턴스의 Public IP}
$ vi master-install.sh
echo 'Setting'
swapoff -a
apt-get update -y
systemctl stop ufw && ufw disable && iptables -F
echo 'Complete'

echo 'RKE2 Master Download'
curl -sfL https://get.rke2.io | sh -
echo 'Complete'

echo 'RKE2 Service Enable'
systemctl enable rke2-server.service
echo 'Complete'

echo 'Config Setting'
mkdir -p /etc/rancher/rke2/
cat <<EOF > /etc/rancher/rke2/config.yaml
write-kubeconfig-mode: "0644"
tls-san:
  - $EXTERNAL_IP
etcd-expose-metrics: true
EOF
echo 'Complete'

echo 'RKE2 Service Start'
systemctl start rke2-server.service
echo 'Complete'

echo 'Kubectl Setting'
mkdir -p ~/.kube/
cp /etc/rancher/rke2/rke2.yaml ~/.kube/config
export PATH=$PATH:/var/lib/rancher/rke2/bin/
echo 'export PATH=/usr/local/bin:/var/lib/rancher/rke2/bin:$PATH' >> ~/.bashrc

echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
echo 'Complete'

// 확인
$ cat master-install.sh
$ sh master-install.sh
$ source ~/.bashrc

// 모든 Pod들이 생성될때까지 확인
$ watch kubectl get pod -A

// 혹시 과정 중 에러가 발생했다면 Debug
$ journalctl -u rke2-server -f
// Master Node 설치가 완료된 후에 진행
// Root 권한으로 계속 개발하기 힘드니 User로 가능하도록 설정
$ exit
$ vi user-config.sh
echo 'Kubectl Setting'
mkdir -p ~/.kube/
cp /etc/rancher/rke2/rke2.yaml ~/.kube/config
sudo cp /var/lib/rancher/rke2/bin/kubectl /usr/local/bin

echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
echo 'Complete'

$ cat user-config.sh
$ sh user-config.sh
$ source ~/.bashrc

// 테스트
$ watch kubectl get pod -A
// Master Node의 Token 확인
// 클러스터링을 하기 위한 필수값이니 별도로 저장
$ sudo cat /var/lib/rancher/rke2/server/node-token

// k9s 설치
$ sudo snap install k9s
$ sudo ln -s /snap/k9s/current/bin/k9s /snap/bin/

// 설치 확인
$ k9s

 

Worker Node
// Worker Node가 설치될 EC2 인스턴스로 접속
// Bastion 서버가 있다면 Bastion EC2 인스턴스에 먼저 접속 후, 해당 EC2 인스턴스로 접속
$ ssh -i {*-key.pem} ubuntu@{ip}

// root로 실행
$ sudo su -
$ export MASTER_INTERNAL_IP={Master Node EC2 인스턴스의 Private IP}
$ export TOKEN={Master Node의 Token}
$ vi worker-install.sh
echo 'Setting'
swapoff -a
apt-get update -y
systemctl stop ufw && ufw disable && iptables -F
echo 'Complete'

echo 'RKE2 Agent Download'
curl -sfL https://get.rke2.io  | INSTALL_RKE2_TYPE="agent" sh -
echo 'Complete'

echo 'RKE2 Service Enable'
systemctl enable rke2-agent.service
echo 'Complete'

echo 'Config Setting'
mkdir -p /etc/rancher/rke2/
cat <<EOF > /etc/rancher/rke2/config.yaml
server: https://${MASTER_INTERNAL_IP}:9345
token: $TOKEN
EOF
echo 'Complete'

echo 'RKE2 Service Start'
systemctl start rke2-agent.service
echo 'Complete'

// 확인
$ cat worker-install.sh
$ sh worker-install.sh
$ source ~/.bashrc

// 혹시 과정 중 에러가 발생했다면 Debug
$ journalctl -u rke2-agent -f

 

테스트
// Master Node와 Worker Node가 정상적으로 설치되지 않는다면 환경변수 문제일 가능성이 매우 높습니다.
// Master Node에서 확인
$ env | grep EXTERNAL_IP // Master Node Public IP
$ sudo cat /var/lib/rancher/rke2/server/node-token // Master Node Token

// Worker Node에서 확인
$ env | grep MASTER_INTERNAL_IP // Master Node Private IP
$ env | grep TOKEN // Master Node Token

// 수정 사항 적용
// Master Node
$ sudo systemctl restart rke2-server.service
$ sudo systemctl status rke2-server.service

// Worker Node
$ sudo systemctl restart rke2-agent.service
$ sudo systemctl status rke2-agent.service

// Master Node EC2 인스턴스로 접속
$ ssh -i {*-key.pem} ubuntu@{ip}
$ kubectl get nodes // Status가 모두 Ready이면 성공적으로 구축 완료
// Pod
// 간단한 Nginx와 Apache Pod를 생성 후 테스트
// EC2에서 복사 붙여넣기할 때, 들여쓰기 이슈가 발생한다면 :set paste 입력 후 복사
$ vi nginx-apache.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.17
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
  labels:
    app: "httpd"
spec:
  type: ClusterIP
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: "httpd"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
  labels:
    app: "httpd"
spec:
  replicas: 2
  selector:
    matchLabels:
      app: "httpd"
  template:
    metadata:
      labels:
        app: "httpd"
    spec:
      containers:
      - name: httpd
        image: httpd:latest
        ports:
        - name: http
          containerPort: 80

$ kubectl apply -f nginx-apache.yaml
// Ingress
$ vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ing
spec:
  ingressClassName: nginx
  rules:
  - host: "nginx.{Master Node Public IP}.nip.io"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80
  - host: "apache.{Master Node Public IP}.nip.io"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: httpd-svc
            port:
              number: 80

// sed로 값 대체 또는 직접 수정
$ sed -i 's/{Master Node Public IP}/x.x.x.x/g' ~/ingress.yaml
$ kubectl apply -f ingress.yaml

 

// 웹 브라우저에서 각각 접속해서 확인
nginx.{Master Node Public IP}.nip.io
apache.{Master Node Public IP}.nip.io

 

Uninstall
$ sudo rke2-uninstall.sh

 

마무리
위 과정을 모두 정상적으로 진행했다면 Master Node 1대, Worker Node 1대로 개발 k8s 클러스터를 성공적으로 구축한 것입니다. 상용 k8s 클러스터는 같은 과정을 통해 각 노드의 수를 늘려주면 됩니다.

개발자들은 Master Node에서 개발을 진행할 수 있지만, 리스크가 있습니다. Bastion 서버를 구축하여 API 통신으로 개발하는 것이 바람직합니다.

Bastion 서버를 구축하여 k8s 클러스터를 관리하는 방법은 다음 글에서 작성하도록 하겠습니다. 감사합니다.