Overview
- Rancher를 통한 Kubernetes 클러스터 구축
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 클러스터를 관리하는 방법은 다음 글에서 작성하도록 하겠습니다. 감사합니다.
'Kubernetes' 카테고리의 다른 글
[Kubernetes] ArgoCD 설치하기 (0) | 2024.05.30 |
---|---|
[Kubernetes] Kubernetes 클러스터 외부에서 관리하기 (Bastion, Local) (0) | 2024.05.27 |
[Kubernetes] 클러스터 운영 시 고려 사항 (0) | 2024.04.03 |
[Helm] grafana와 redis 연동하기 (0) | 2023.04.29 |
[Helm] grafana 설치하기 (0) | 2023.04.29 |