오늘 라즈베리파이 2대가 추가로 배송됐다.
그간, kubelet, kubeadm, kubectl 설치 자동화를 진행해봤다.
각설하고, 아래가 그 스크립트다.
(나는 태생이 root다. sudo 는 전부 제외했으니 태생이 root 가 아니신 분들은 링크를 따라가서 확인해보자)
#!/bin/sh
# https://kubernetes.io/ko/docs/setup/production-environment/tools/_print/
##########################################################################################3#
# 모듈 및 커널 파라메터 설정
# k8s.conf
# br_netfilter 모듈 추가
# sysctl.d/k8s.conf
# bridge netfilter iptables 커널 파라메터 추가
echo "### [START] Step 1. modules & kernel parameter ###"
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
echo "### [END] Step 1. modules & kernel parameter ###"
sleep 5
clear
##########################################################################################3#
# CRI 설치
# Docker 를 CRI 로 활
# https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/
echo "### [START] Step 2. Container Runtime Interface ###"
apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 20.04LTS 에서 아직 docker-ce 패키지 준비가 되지 않았다.
# 준비가 되면 아래 주석을 풀고 사용하고, 그렇지 않다면 docker.io 로 사용하자
#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#echo \
# "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
# $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#apt-get install docker-ce docker-ce-cli containerd.io
# 여기까지 주석
apt install -y docker.io
sudo mkdir /etc/docker
cat <<EOF | tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
echo "### [END] Step 2. Container Runtime Interface ###"
sleep 5
clear
##########################################################################################3#
# kubeadm, kubelet, kubectl
echo "### [START] Step 3. kubeadm, kubelet, kubectl ###"
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
echo "### [END] Step 3. kubeadm, kubelet, kubectl ###"
##########################################################################################3#
# kubectl cheatsheet
# https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/
echo "### [START] Step 4. kubectl cheatsheet ###"
apt-get install -y bash-completion
#source <(kubectl completion bash) # bash-completion 패키지를 먼저 설치한 후, bash의 자동 완성을 현재 셸에 설정한다
echo "source <(kubectl completion bash)" >> ~/.bashrc # 자동 완성을 bash 셸에 영구적으로 추가한다
echo "alias k=kubectl" >> ~/.bashrc
echo "complete -F __start_kubectl k" >> ~/.bashrc
source ~/.bashrc
echo "### [END] Step 4. kubectl cheatsheet ###"
##########################################################################################3#
# kubeadm init
# https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
echo "### [START] Step 5. kubeadm init ###"
kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
위 스크립트를 돌리면 클러스터에 조인할 수 있는 키가 나온다.
워커노드를 별도로 추가하려면 해당 키를 잘 저장해놓도록 하자.
이번엔 친절히 주석을 몇 줄 달아놓았다.
각 주석의 링크가 해당 스텝의 참고 문서들이니 확인해보자.
위 과정이 모두 완료가 되었으면 마스터 노드에도 파드들을 할당할 수 있도록 taint 설정을 진행하고, 네트워크 애드온을 붙여주자.
#!/bin/sh
# network add-on
# https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
# flannel
# https://github.com/flannel-io/flannel#flannel
echo "### [START] Step 1. taint and network add-on ###"
# master taint remove
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get node
# 여기까지 실행하고 기다리면 노드의 상태가 Ready 로 변경됨
네트워크 애드온이 정상적으로 동작하면 노드의 상태가 Ready 로 변경된다.
여기까지 하면 단일 노드의 쿠버네티스 클러스터가 구축된거다. (짝짝짝)
하지만, 이 설정으로는 라즈베리파이 내부에서만 동작하는 앱을 배포할 수 있는거다.
외부에 expose 를 해주기 위해서는 인그레스가 필요하다.
#!/bin/sh
#
##########################################################################################3#
# nginx Ingress
echo "### [START] Step 1. ingress ###"
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
cat << EOF > test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx-service
spec:
#type: ClusterIP
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: my-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-nginx-ingress
annotations:
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-nginx-service
port:
number: 80
ingressClassName: nginx
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
EOF
kubectl get all -n ingress-nginx
echo "check nginx ingress status"
echo "kubectl apply -f test.yaml"
echo "kubectl get all"
echo "kubectl get ing"
echo "check {your ras ip}:{nodeport}"
Ingress 는 nginx Ingress 를 활용하도록 했다. Baremetal 쪽 링크를 참조하면 된다.
별도의 네임스페이스에 nginx Ingress 를 위한 서비스 및 파드들이 생성된다.
k get all -n ingress-nginx 명령을 통해 모든 컴포넌트들이 정상 생성된 것을 확인한 후에 위 스크립트로 생성된 test.yaml 파일을 배포하고 노드포트를 통해 정상적으로 앱이 잘 배포되었는지 확인해본다.
오늘은 여기까지다.
다음은 Docker Registry 를 배포하고 해당 레지스트리를 도커 허브로 사용할 예정이다.
별 문제없이 잘 배포된 것까지 확인했고, 마찬가지로 자동화 스크립트를 가지고 다시 돌아올 예정.
내일 메모리가 추가로 배송되면 워커노드 추가까지 진행해볼 예정