inception-of-things part 2
vagrant
k8s
argoCD
gitlab
42 seoul
Intro
Part 1에 이어서 진행해보겠습니다.
개념 설명
Part 1에서 클러스터가 여러 노드들을 논리적으로 묶어주는 기술임을 설명했습니다.
그렇다면 구체적으로 각각의 노드들이 어떻게 협업을 한다는 것일까요?
코드 설명
Provision
Vagrantfile
"2") do |config|
Vagrant.configure(= "bento/ubuntu-24.04"
config.vm.box = "202404.26.0"
config.vm.box_version
"hyunghkiS" do |control|
config.vm.define = "hyunghkiS"
control.vm.hostname "private_network", ip: "192.168.56.110"
control.vm.network "virtualbox" do |v|
control.vm.provider "modifyvm", :id, "--name", "hyunghkiS"]
v.customize [= "8192"
v.memory = "5"
v.cpus
end"confs", "/etc/vagrant/confs"
config.vm.synced_folder "shell", path: "scripts/server.sh"
control.vm.provision
end end
Vagrant 파일을 이용해서 가상머신을 생성해줍니다. 이번 파트에서는 k3s 클러스터 안에 하나의 노드만 provision하고 있는데, 이 경우 노드 하나가 master, worker 역할을 모두 수행합니다.
k3s config file
deploy.yml
/v1
apiVersion: apps
kind: Deployment
metadata:-one
name: app
labels:
app: app1
spec:1
replicas:
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:- name: nginx
image: nginx
ports:- containerPort: 80
---
/v1
apiVersion: apps
kind: Deployment
metadata:-two
name: app
labels:
app: app2
spec:3
replicas:
selector:
matchLabels:
app: app2
template:
metadata:
labels:
app: app2
spec:
containers:- name: nginx
image: nginx
ports:- containerPort: 80
---
/v1
apiVersion: apps
kind: Deployment
metadata:-three
name: app
labels:
app: app3
spec:1
replicas:
selector:
matchLabels:
app: app3
template:
metadata:
labels:
app: app3
spec:
containers:- name: nginx
image: nginx
ports:- containerPort: 80
ing.yml
/v1
apiVersion: networking.k8s.io
kind: Ingress
metadata:
name: ingress
spec:
ingressClassName: traefik
rules:- host: "app1.com"
http:
paths:- pathType: Prefix
"/"
path:
backend:
service:-one
name: app
port:80
number: - host: "app2.com"
http:
paths:- pathType: Prefix
"/"
path:
backend:
service:-two
name: app
port:80 number:
route.yml
/v1alpha1
apiVersion: traefik.containo.us
kind: IngressRoute
metadata:-backend
name: default
spec:
routes:- match: PathPrefix(`/`)
kind: Rule
services:- name: app-three
80 port:
svc.yml
apiVersion: v1
kind: Service
metadata:-one
name: app
spec:
selector:
app: app1
ports:- protocol: TCP
80
port: 80
targetPort: ---
apiVersion: v1
kind: Service
metadata:-two
name: app
spec:
selector:
app: app2
ports:- protocol: TCP
80
port: 80
targetPort: ---
apiVersion: v1
kind: Service
metadata:-three
name: app
spec:
selector:
app: app3
ports:- protocol: TCP
80
port: 80 targetPort:
실행 스크립트
scripts/server.sh
#!/bin/bash
'alias k=kubectl' >> /home/vagrant/.bashrc
echo /home/vagrant/.bashrc
source -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -s - server
curl | grep -q 'ingressroutes.traefik.containo.us'; do
until kubectl get crd 'waiting for CRD...'
echo 1
sleep
done
# 작성한 설정 파일을 적용해줍니다.
apply -f /etc/vagrant/confs
kubectl
# pod이 정상적으로 올라올 때 까지 기다려줍니다.
! -z "$(kubectl get pods -o jsonpath='{.items[*].metadata.name}')" ]; do
until [ 1
sleep
donefor pod in $(kubectl get pods -o jsonpath='{.items[*].metadata.name}'); do
| grep -q 'Running'; do
until kubectl get pods $pod 1
sleep
done=$(kubectl get pods $pod -o jsonpath='{.metadata.labels.app}')
app_name
# 과제에서 제시된 HTML 파일을 생성된 pod에 저장해줍니다.
=$(cat <<EOF
HTML<!DOCTYPE html>
<html>
<head>
<title>Hello Kubernetes!</title>
</head>
<body>
<div class="main">
<div class="content">
<div id="message">
from ${app_name}.
Hello </div>
<div id="info">
<table>
<tr>
<th>pod:</th>
<td>${pod}</td>
</tr>
<tr>
<th>node:</th>
<td>$(uname -s) ($(uname -r))</td>
</tr>
</table>
</div>
</div>
</div>
</body>
</html>
EOF
)"${HTML}" > /home/vagrant/index.html
echo $/home/vagrant/index.html $pod:/usr/share/nginx/html/index.html > /dev/null
kubectl cp done
Provision이 완료되고 자동으로 실행되는 script를 작성해줍니다.
Outro
Part 3와 Bonus는 다음 포스팅에서 작성하겠습니다.