728x90
반응형

이제 마스터 노드 1개와 워커 노드 2개의 서버가 잘 작동하는 것을 확인했고
스크립트를 통해 초기에 설정해야하는 부분을 서버를 올리면서 자동으로 실행되도록 만들 예정이다.

스크립트에 넣을 내용은 간단하다.
수동으로 했던 내용들을 모든 노드에 적용될 내용과 각 노드 별로 적용될 내용의 스크립트로 작성한다.
만든 스크립트를 VagrantFile 에 추가한 뒤 vagrant up 명령을 통해 실행시켜주면 된다.
실행이 잘 되었다면 쿠버네티스 클러스터 노드들이 잘 올라왔는지 그리고 명령어들이 잘 작동하는지 확인하면 된다.

추가) 스크립트는 github 에 올려놓았다.

https://github.com/jaynamm/k8s-cluster-vagrant

 

GitHub - jaynamm/k8s-cluster-vagrant

Contribute to jaynamm/k8s-cluster-vagrant development by creating an account on GitHub.

github.com


스크립트 만들기 요약 정리

1. 노드 구성을 위한 스크립트

#!/usr/bin/bash

# swapoff -a to disable swapping
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

# set SELinux 
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sestatus

# disable firewalld and NetworkManager
systemctl stop firewalld && systemctl disable firewalld
systemctl stop NetworkManager && systemctl disable NetworkManager

# enabling iptables kernel options
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo modprobe br_netfilter
sysctl --system

# kubernetes repository
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# add hosts
cat << EOF >> /etc/hosts
192.168.1.10 k8s-master
192.168.1.11 k8s-worker1
192.168.1.12 k8s-worker2
EOF

# config DNS
cat <<EOF > /etc/resolv.conf
nameserver 8.8.8.8 #Google DNS
EOF

# ssh password Authentication no to yes
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd

2. 노드 패키지 설치를 위한 스크립트

#!/usr/bin/bash

# install packages for docker
yum install -y yum-utils device-mapper-persistent-data lvm2

# docker repository
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# yum update and install docker
yum update -y && yum install -y docker-ce

mkdir /etc/docker
cat <<EOF | sudo 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

# install kubernetes
yum install -y --disableexcludes=kubernetes kubeadm kubectl kubelet
systemctl enable --now kubelet

3. 마스터 노드 적용 스크립트

#!/usr/bin/bash

# init kubernetes for kubeadm
kubeadm init --token 123456.1234567890123456 \
            --token-ttl 0 \
            --pod-network-cidr=10.244.0.0/16 \
            --apiserver-advertise-address=192.168.1.10

# master node config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# Kubernetes network interface config - calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# set bash-completion
yum install bash-completion -y

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

4. 워커 노드 적용 스크립트

#!/usr/bin/bash

# worker node config
kubeadm join 192.168.1.10:6443 \
        --token 123456.1234567890123456 \
        --discovery-token-unsafe-skip-ca-verification

5. Vagrant 파일에 스크립트 추가

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  ### Master Node ####

  config.vm.define "k8s-master" do |master|
    master.vm.box = "centos/7"
    master.vm.provider "virtualbox" do |vb|
      vb.name = "k8s-master"
      vb.cpus = 2
      vb.memory = 3072
      vb.customize ["modifyvm", :id, "--groups", "/k8s-cluster"]
    end
    master.vm.host_name = "k8s-master"
    master.vm.network "private_network", ip: "192.168.1.10"
    master.vm.network "forwarded_port", guest: 22, host: 10030, auto_correct: true, id: "ssh"
    master.vm.synced_folder ".", "/vagrant", disabled: true
    master.vm.provision "shell", path: "config.sh"
    master.vm.provision "shell", path: "install.sh"
    master.vm.provision "shell", path: "master_node.sh"
  end

  ### Worker node ###

  (1..2).each do |i|
    config.vm.define "k8s-worker#{i}" do |worker|
      worker.vm.box = "centos/7"
      worker.vm.provider "virtualbox" do |vb|
        vb.name = "k8s-worker#{i}"
        vb.cpus = 1
        vb.memory = 2048
        vb.customize ["modifyvm", :id, "--groups", "/k8s-cluster"]
      end
      worker.vm.host_name = "k8s-worker#{i}"
      worker.vm.network "private_network", ip: "192.168.1.1#{i}"
      worker.vm.network "forwarded_port", guest: 22, host: "1003#{i}", auto_correct: true, id: "ssh"
      worker.vm.synced_folder ".", "/vagrant", disabled: true
      worker.vm.provision "shell", path: "config.sh"
      worker.vm.provision "shell", path: "install.sh"
      worker.vm.provision "shell", path: "worker_node.sh"
    end
  end

end

6. vagrant 가상 머신 실행

vagrant up

1. 노드 구성을 위한 스크립트

우선 모든 서버에 공통으로 적용될 스크립트를 만들어야 한다.
이 스크립트는 노드 구분 없이 모든 서버에 적용시켜줄 예정이다.
안에 들어갈 내용으로는 SELinux 설정, 방화벽 설정, iptables 설정 등이 들어간다.

그럼 이제 스크립트를 만들고 하나씩 내용을 추가해본다.

1) SELinux 설정
2) 방화벽 비활성화 설정
3) iptables 커널 옵션 활성화
4) swap 비활성화
5) 쿠버네티스 yum repository 설정
6) hosts 등록
7) DNS 구성 추가
8) sshd 설정 파일 수정

이전에는 설치하는 것도 같이 진행했었는데 설치하는 부분은 따로 빼서 작성하려고 한다.
그리고 마지막에 DNS 를 추가해주었고 외부에서 접속이 가능하도록 sshd 설정 파일을 수정하는 부분을 추가했다.

#!/usr/bin/bash

# swapoff -a to disable swapping
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

# set SELinux 
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sestatus

# disable firewalld and NetworkManager
systemctl stop firewalld && systemctl disable firewalld
systemctl stop NetworkManager && systemctl disable NetworkManager

# enabling iptables kernel options
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo modprobe br_netfilter
sysctl --system

# kubernetes repository
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# add hosts
cat << EOF >> /etc/hosts
192.168.1.10 k8s-master
192.168.1.11 k8s-worker1
192.168.1.12 k8s-worker2
EOF

# config DNS
cat <<EOF > /etc/resolv.conf
nameserver 8.8.8.8 #Google DNS
EOF

# ssh password Authentication no to yes
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd

 

2. 노드 패키지 설치를 위한 스크립트

구성을 마치고 나서 도커와 쿠버네티스를 설치해야 하기 때문에
구성 스크립트와는 별개로 설치 스크립트를 따로 만들어주었다.

스크립트에 들어갈 내용은 다음과 같다.

1) 도커 설치 후 활성화
2) 쿠버네티스 설치 후 활성화

#!/usr/bin/bash

# install packages for docker
yum install -y yum-utils device-mapper-persistent-data lvm2

# docker repository
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# yum update and install docker
yum update -y && yum install -y docker-ce

mkdir /etc/docker
cat <<EOF | sudo 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

# install kubernetes
yum install -y --disableexcludes=kubernetes kubeadm kubectl kubelet
systemctl enable --now kubelet

추가로 도커 데몬 설정 부분이 이전과는 다르다는 것을 확인할 수 있는데
이 부분은 쿠버네티스 문서를 다시 확인해봤더니 수정되어있어 나도 수정해주었다.

 

3. 마스터 노드 적용 스크립트

이번에는 마스터 노드에만 따로 적용할 스크립트를 만들 차례다.
스크립트에 들어갈 내용은 다음과 같다.

1) 쿠버네티스 초기화 설정 - kubeadm
2) 쿠버네티스 네트워크 인터페이스 설정 - calico
3) 쿠버네티스 명령어 자동완성 기능 설정 - 재접속 후 적용

마스터 노드에서 할 수 있는 부분은 다 추가해서 넣어주었다.
kubeadm 을 통해 쿠버네티스 초기화 설정을 해주었고
calico 를 통해서 네트워크 인터페이스 설정을 해주었다.

그리고 쿠버네티스 초기화 설정하는 부분에서
원래 초기화 설정을 해주게 되면 token 값이 출력되고 그 값을 워커 노드에서 입력해주어야 했었는데
자동으로 하기 위해서 임의로 토큰 값을 지정해서 워커노드에서 지정된 토큰을 사용할 수 있도록 해주었다.
그리고 토큰 유지 시간을 없애주는 옵션을 사용해 토큰 값이 계속 지속되도록 설정해주었다.

그리고 자동 완성 기능을 추가해주었는데 적용 후에 재접속해야 사용할 수 있다.

#!/usr/bin/bash

# init kubernetes for kubeadm
kubeadm init --token 123456.1234567890123456 \
            --token-ttl 0 \
            --pod-network-cidr=10.244.0.0/16 \
            --apiserver-advertise-address=192.168.1.10

# master node config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# Kubernetes network interface config - calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# set bash-completion
yum install bash-completion -y

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

 

4. 워커 노드 적용 스크립트

워커 노드 설정에서는 마스터 노드에서 초기화한 쿠버네티스의 토큰을 가져와 join 해주면 된다.
그래서 스크립트에는 kubeadm join 할 수 있는 명령만 넣어주었다.

1) kubeadm join

이전에는 마스터 노드에서 초기화하고나서 마지막에 join 할 수 있는 명령어를 적어주었었는데
이번에는 내가 토큰을 따로 생성해서 하기 때문에 해시 값 고정 없이 허용되도록 해주는 옵션을 넣어주었다.

#!/usr/bin/bash

# worker node config
kubeadm join 192.168.1.10:6443 \
        --token 123456.1234567890123456 \
        --discovery-token-unsafe-skip-ca-verification

 

5. VagrantFile 에 스크립트 추가

이제 만들어진 스크립트 파일들을 Vagrant 파일에 추가해주어야 한다.

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  ### Master Node ####

  config.vm.define "k8s-master" do |master|
    master.vm.box = "centos/7"
    master.vm.provider "virtualbox" do |vb|
      vb.name = "k8s-master"
      vb.cpus = 2
      vb.memory = 3072
      vb.customize ["modifyvm", :id, "--groups", "/k8s-cluster"]
    end
    master.vm.host_name = "k8s-master"
    master.vm.network "private_network", ip: "192.168.1.10"
    master.vm.network "forwarded_port", guest: 22, host: 10030, auto_correct: true, id: "ssh"
    master.vm.synced_folder ".", "/vagrant", disabled: true
    master.vm.provision "shell", path: "config.sh"
    master.vm.provision "shell", path: "install.sh"
    master.vm.provision "shell", path: "master_node.sh"
  end

  ### Worker node ###

  (1..2).each do |i|
    config.vm.define "k8s-worker#{i}" do |worker|
      worker.vm.box = "centos/7"
      worker.vm.provider "virtualbox" do |vb|
        vb.name = "k8s-worker#{i}"
        vb.cpus = 1
        vb.memory = 2048
        vb.customize ["modifyvm", :id, "--groups", "/k8s-cluster"]
      end
      worker.vm.host_name = "k8s-worker#{i}"
      worker.vm.network "private_network", ip: "192.168.1.1#{i}"
      worker.vm.network "forwarded_port", guest: 22, host: "1003#{i}", auto_correct: true, id: "ssh"
      worker.vm.synced_folder ".", "/vagrant", disabled: true
      worker.vm.provision "shell", path: "config.sh"
      worker.vm.provision "shell", path: "install.sh"
      worker.vm.provision "shell", path: "worker_node.sh"
    end
  end

end

자세히 보면 shell 을 가져와 스크립트의 위치를 적어주었는데 지금은 같은 디렉토리에 있기 때문에
그냥 그대로 적어주었지만 만약 다른 위치에 있다면 절대 경로나 상대 경로를 잘 적어주어야 한다.

 

6. vagrant 가상 머신 실행

자, 이제 드디어 실행해볼 시간 !!
확인해야할 부분은 설정들이 잘 적용되어 쿠버네티스가 잘 설치가 되어있는지
네트워크 설정이 잘 되어있는지 그리고 잘 작동하는지 확인해보면 된다.

이제 추가된 VagrantFile 을 통해 vagrant up 명령을 실행해본다.
구성 설정하고 설치할 부분이 많이 때문에 생각보다 오래걸린다. 오타 때문에 다시 실행했다 ㅎㅎ

쿠버네티스 클러스터가 잘 작동하는지 알아보기 위해서 마스터 노드에 접속해 노드와 파드 상태를 확인해보았다.

[root@k8s-master ~]# kubectl get nodes -A
NAME          STATUS   ROLES                  AGE     VERSION
k8s-master    Ready    control-plane,master   6m56s   v1.22.4
k8s-worker1   Ready    <none>                 3m42s   v1.22.4
k8s-worker2   Ready    <none>                 46s     v1.22.4
[root@k8s-master ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-56b8f699d9-9ct72   1/1     Running   0          6m54s
kube-system   calico-node-5gr49                          1/1     Running   0          3m56s
kube-system   calico-node-d9s25                          1/1     Running   0          6m54s
kube-system   calico-node-xt2vs                          0/1     Running   0          60s
kube-system   coredns-78fcd69978-dmk8r                   1/1     Running   0          6m54s
kube-system   coredns-78fcd69978-xt99p                   1/1     Running   0          6m54s
kube-system   etcd-k8s-master                            1/1     Running   0          7m9s
kube-system   kube-apiserver-k8s-master                  1/1     Running   0          7m7s
kube-system   kube-controller-manager-k8s-master         1/1     Running   0          7m7s
kube-system   kube-proxy-fngg8                           1/1     Running   0          3m56s
kube-system   kube-proxy-hvcjq                           1/1     Running   0          6m54s
kube-system   kube-proxy-qtrtn                           1/1     Running   0          60s
kube-system   kube-scheduler-k8s-master                  1/1     Running   0          7m7s

마스터 노드와 워커 노드가 정상으로 추가된 것을 확인할 수 있고
기본 파드들과 calico 파드도 정상적으로 올라온 것을 확인할 수 있었다.

728x90
반응형
복사했습니다!