개인서버(이하 Host)에 3개의 Virtual Machine을 생성하고, 생성한 VM을 이용하여 Kubernetes 환경을 구성한다. Kubernetes 환경은 Master노드 1개와 Worker노드 2개로 구성되며, 아키텍쳐는 아래 그림과 같다.
Kubernetes는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템이다. 이 실습에서는 컨테이너를 만들어주는 컨테이너 런타임 엔진은 도커를 사용하며, 애플리케이션 배포는 apache(httpd)를 활용하도록 한다.
sudo apt-get install -y curl
sudo apt-get install -y apt-transport-https
sudo apt-get install -y ca-certificates
sudo apt-get install -y gnupg-agent
sudo apt-get install -y software-properties-common
sudo apt-get install -y gnupg2
sudo apt-get install -y lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Docker apt 패키지 업데이트
sudo apt-get update- Docker 엔진 설치
sudo apt-get install -y docker-ce=5:20.10.0~3-0~ubuntu-(lsb_release -cs) containerd.io docker-compose-plugin
sudo swapoff -a
sudo sed -i '/swap.img/s/^/#/' /etc/fstab2.1.6 Docker 사용권한 설정
sudo chmod a+r /etc/apt/keyrings/docker.gpg
ls -al /var/run/docker.sock
sudo groupadd docker
sudo usermod -aG docker $USER
sudo chown root:docker /var/run/docker.sock
sudo service docker restart
sudo chmod 666 /var/run/docker.sock
daemon.json 파일 생성 및 내용 작성
vi daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}2.1.8 권한 설정 및 파일위치 변경
sudo chown root:root daemon.json
sudo mv ./daemon.json /etc/docker/.2.1.9 Docker 서비스 등록 및 재시작
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl enable docker2.1.10 cgroup 확인
docker info | grep -i cgroup
docker-compose 설치
sudo apt-get install -y docker-compose2.1.11 최신버전 확인
docker-compose -v
2.1.12 Docker 테스트
sudo docker run --name hello hello-world
docker rm -f hello
- sudo cat /sys/class/dmi/id/product_uuid
/etc/modules-load.d/k8s.conf 파일내용 수정
sudo vi /etc/modules-load.d/k8s.conf
br_netfilter- /etc/sysctl.d/k8s.conf 파일내용 수정
sudo vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1- 시스템을 로드한다.
sudo sysctl --system
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl2.2.4 Kuberentes apt 패키지 다운로드를 위한 GPG key 등록
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
2.2.5 Kuberentes apt 패키지 저장소 등록
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
2.2.6 kubelet, kubeadm, kubectl 설치
sudo apt-get update
sudo apt-get install -y kubeadm=1.22.2-00 kubelet=1.22.2-00 kubectl=1.22.2-00
sudo apt-mark hold kubelet kubeadm kubectl
kubeadm version2.2.7 (옵션) runtime service failed를 위한 사전설정
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
sudo su
이 게시글에서는 Master 가상머신의 IP가 192.168.20.11이므로, {마스터VM의 IP}에는 192.168.0.11을 입력한다. 개인실습환경에서 마스터 가상머신의 IP가 다를 경우 개인환경에 맞는 마스터IP를 입력한다.
이 실습에서는 Container Network Interface(CNI) 플러그인은 Calico를 사용할 예정이므로, {CNI 네트워크}에는 해당 플러그인에는 10.244.0.0/16을 입력한다.
sudo kubeadm init --apiserver-advertise-address={마스터VM의 IP} --pod-network-cidr={CNI 네트워크} --kubernetes-version=v1.22.2
sudo kubeadm init --apiserver-advertise-address=192.168.20.11 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.2
kubeadm join 192.168.0.11:6443 --token cgnybx.ottaw3i2ckle9vn3 \
--discovery-token-ca-cert-hash sha256:104e47a86555953427accda49cff4df9428ac8
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as roo t:
kubeadm join 192.168.0.11:6443 --token cgnybx.ottaw3i2ckle9vn3 \
--discovery-token-ca-cert-hash sha256:104e47a86555953427accda49cff4df9428ac8 7d5cb535f32a0eeb814c74d9d8
mkdir -p HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):(id -g) $HOME/.kube/config
root 사용자일 경우
export KUBECONFIG=/etc/kubernetes/admin.conf
Calico 설치
Tigera Calico 연산자 및 사용자 정의 자원 정의 설치
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
사용자 정의 자원을 작성하여 Calico를 설치
-Calico의 경우 기본 CNI 주소는 192.168.0.0/16으로 되어 있으며, 본 게시글에서는 10.244.0.0/16으로 변경한다.
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O
vi custom-resources.yaml
...
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16
kubectl create -f custom-resources.yaml
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
sudo su
kubeadm join 192.168.20.11:6443 --token cf85i0.lyi1go2frnk22mlr \
--discovery-token-ca-cert-hash sha256:5b1508058a2efc... c4b34bf
모든 Worker VM에 동일하게 적용한다.
Kuberentes Cluster 구축 완료
kubectl get nodes -o wide
#디플로이먼트 생성
- apiVersion: apps/v1
- kind: Deployment
- metadata:
#디플로이먼트의 이름
name: httpd-deployment
#레이블 설정
labels:
app: httpd
spec:
replicas: 1
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
# 컨테너 이미지 설정
- name: httpd
image: httpd
ports:
# 컨테이너가 사용할 포트
- containerPort: 80
---
# httpd 서비스 생성
apiVersion: v1
kind: Service
metadata:
name: httpd
spec:
ports:
- name: httpd
# 외부로 노출할 포트
port: 80
protocol: TCP
# 파드의 컨테이너 포트
targetPort: 80
selector:
app: httpd
# 서비스 타입 : 로드밸런서
type: NodePort
kubectl apply -f httpd.yaml
kubectl get all
deployment를 이용해야 애플리케이션이 컨트롤하였으며, 네트워크는 NodePort 서비스를 이용해 32542포트로 웹서버(httpd)를 배포한다.
Master VM과 동일한 네트워크(192.168.0.0/24)의 서버(예: host)에서 해당 웹서버(httpd)를 확인한다