본문 바로가기

카테고리 없음

kubelet, kubeadm, kubectl

오늘 라즈베리파이 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 를 배포하고 해당 레지스트리를 도커 허브로 사용할 예정이다.

별 문제없이 잘 배포된 것까지 확인했고, 마찬가지로 자동화 스크립트를 가지고 다시 돌아올 예정.

내일 메모리가 추가로 배송되면 워커노드 추가까지 진행해볼 예정