1. 테스트 환경 구성
OS
Hardware spec
Software setting
쿠버네티스 클러스터
2. 서버 설정
1). IP 설정
- /etc/netplan 파일 수정 : node별로 다 해주어함
network:
ethernets:
enp1s0:
addresses: [192.168.50.160/24]
gateway4: 192.168.50.1
nameservers:
addresses: [192.168.50.1]
dhcp4: false
version: 2
2). openssh-server설치
- sudo apt install openssh-server
3). docker 설치
- 기본라이브러리 설치
$ sudo apt update
$ sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
- HTTPS를 통해 repository를 사용할 수 있게 설정
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- stable repository 설정
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
- 설치
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
- 설치확인
$ sudo docker run hello-world
- 도커 데몬 드라이버를 systemd로 변경
# systemd에 경로를 만들어 주고 docker service를 재시작 합니다
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
4). swap 비활성화
- 쿠버네티스는 스왑 메모리를 지원하지 않습니다. 따라서 linux 스왑 메모리를 비활성화 해주어야 합니다.
$ sudo swapoff –a
$ sudo sed -i '2s/^/#/' /etc/fstab
$ sudo vi /etc/fstab #/swap 부문 주석 처리
5). 방화벽 비활성화
$ sudo systemctl stop firewalld
6). 포트 개방 (iptables)
- kubeadm join이 안될 시 iptables를 확인해 봅니다
- iptables 조회
$ sudo iptables -L
- iptables 초기화(flush) 실행하기 전 backup을 꼭 합시다
$ sudo iptables -F
3. kubeadm, kubelet, kubectl 설치
1). repository 설정
- 필요한 라이브러리 설치
$ sudo apt update
$ sudo apt install -y apt-transport-https ca-certificates curl
- 구글 클라우드의 공개 사이닝 키를 다운로드
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
- 쿠버네티스 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
- apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정
$ sudo apt update
$ sudo apt install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl
4. hosts 파일 수정
- local registry사용을 위해서 마스터 추가
sudo vi /et/hosts
192.168.50.160 docker-registry.com
5. master node복제(Virtual서버 사용시)
- 서버 복제
virt-clone --original master-node --name worker-node1 --file /data/libvirt/images/k8s/worker-node1.qcow2
- hostname변경
sudo hostnamectl set-hostname worker-node1
- 복제후
/etc/netplan에서 IP변경, /etc/hosts 파일 수정
6. 마스터 노드, 워커 노드 join
1). 마스터 노드 설정
- Container Network Interface로 flannel를 사용
- flannel의 default cidr 네트워크를 구성할 것이기에 10.244.0.0/16을 사용하여 kubeadm을 init
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.50.160
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 정상 설치가 되었는지 모든 cluster pod를 조회해 봅시다
$ kubectl get pods –A
- CNI 네트워크 에드온 Flannel을 배포
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- Flannel을 배포한 후 모든 pod를 조회하면 coredns가 Pending에서 Running으로 바뀌며 동작하는 것을 볼 수 있습니다.
$ kubectl get pod -A
2). 워커 노드 설정 : kubeadm init 할때 나온 메시지 복사
sudo kubeadm join 192.168.50.160:6443 --token hyenxs.8vgtxtwh0vfqdeyj \
--discovery-token-ca-cert-hash sha256:82e4d25b55c03ac3a524f2ced510b96821809ca45fd4de32c8f382b04c56051c
$ kubectl get node #마스터노드와 조인후 확인
7. private docker registry Pod 설치
docker hub를 사용하지 않고 서버내에 private registry를 구축해서 이미지를 push, pull 하기 위해서 설정
1). 공유 폴더 생성
- 폴더 생성
sudo mkdir docker-registry
- NAS NSF폴더 공유
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gineers&logNo=220726615493
- 공유폴더 마운트
sudo apt install nfs-common
sudo mount 192.168.50.16:/volume1/docker-registry ./docker-registry
- 리부팅시 자동으로 마운트
sudo vi /etc/fstab 수정
192.168.50.16:/volume1/docker-registry home/cogent/docker-registry nfs
- docker-registry.yaml
# vi docker-registry.yaml
apiVersion: v1
kind: Pod
metadata:
name: docker-registry
namespace: default
labels:
app: docker-registry #label
spec:
#nodeName: kube-node2 #node를 지정해도되고 안해도됨
#nodeSelector: // node labels를 지정해도 됨
#kubernetes.io/hostname: kube-node2
containers:
- name: docker-registry
image: registry:2
ports:
- containerPort: 5000 #registry 기본 port
volumeMounts:
- mountPath: /var/lib/registry #container directory
name: host-path #아래에 volumes name
volumes: #host pc volume생성
- name: host-path
hostPath:
path: /home/cogent/docker-registry
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: docker-registry
namespace: default
spec:
type: NodePort
selector:
app: docker-registry
ports:
- protocol: TCP
port: 5000
targetPort: 5000
nodePort: 30500
- /etc/hosts 파일 수정 : 모든 노드에 추가
192.168.50.160 docker-registry.com 추가
- /etc/docker/daemon.json 수정 : private registry에서 image pull할때 https를 사용하지 않고 http를 사용 하기 위해서
$ sudo vi /etc/docker/daemon.json #추가
"insecure-registries" : ["docker-registry.com:30500"]
8. Application 배포
1). Application 생성
- node.js 애플리케이션 생성 : server.js
var os = require('os');
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World! I'm "+os.hostname());
//log
console.log("["+
Date(Date.now()).toLocaleString()+
"] "+os.hostname());
}
var www = http.createServer(handleRequest);
- server.js 실행
node server.js
2). 도커로 패키징하기
- Dockerfile 생성
FROM node:carbon
EXPOSE 8080
COPY server.js .
CMD node server.js > log.out
- 컨테이너 이미지 생성
docker build -t docker-registry.com:30500/cogent/hello-node:v1 .
리파지토리 docker-registry.com:30500
사용자 cogent
이미지, 태그 hello-node:v1
- 실행확인
docker run -d -p 8080:8080 docker-registry.com:30500/cogent/hello-node:v1
3). ReplicationController 등록
- hello-node-rc.yaml
# hello-node-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: hello-node-rc
spec:
replicas: 3
selector:
app: hello-node
template:
metadata:
name: hello-node-pod
labels:
app: hello-node
spec:
containers:
- name: hello-node
image: docker-registry:30500/cogent/hello-node:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
- 등록
kubectl apply -f hello-node-rc.yaml
4). Service 등록
- hello-node-svc.yaml
#hello-node-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-node-svc
spec:
selector:
app: hello-node
ports:
- port: 80
protocol: TCP
targetPort: 8080
nodePort: 30808
type: LoadBalancer
- 등록
kubectl create -f hello-node-svc.yaml
5). RC 테스트
- pod를 삭제 하면 rc가 새로 생성함
- pod개수 조정
kubectl scale --replicas=4 rc/hello-node-rc
아래 사이트에서 참조 했습니다.
'오픈소스' 카테고리의 다른 글
쿠버네티스(kubernetes)란? (0) | 2023.04.10 |
---|