티스토리 뷰
쿠버네티스
여러대의 도커 호스트를 하나의 클러스터로 만들어주는 점은 도커 스웜과 같지만, 세부적인 기능을 더 제공하고 있다.
쿠버네티스의 장점
- 서버 지원 클러스터링, 마이크로서비스 구조의 컨테이너 배포, 서비스 장애 복구 등 컨테 이너 기반의 서비스 운영에 필요한 대부분의 오케스트레이션 기능을 폭넓게 지원한다.
- 구글, 레드햇을 비롯한 많은 오픈소스 진영에서 쿠버네티스의 소스코드에 기여하고 있기 때문에 성능과 안정성 면에서 신뢰를 받고 있다.
실습환경은 다음과 같이 구성했다.
centOS7 / k8s-master / NAT / 192.168.0.100
centOS7 / k8s-worker1 / NAT / 192.168.0.101
centOS7 / k8s-worker2 / NAT / 192.168.0.102
1) selinux 비활성화
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
2) swap 비활성화
swapoff -a
sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
3) 방화벽 비활성화
systemctl disable firewalld # systemctl stop firewalld
4) iptables 커널 설정
cat <<EOF>> /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF>> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
5) hosts 설정
hostnamectl set-hostname k8s-master
cat <<EOF>> /etc/hosts
192.168.0.100 k8s-master
192.168.0.101 k8s-worker1
192.168.0.102 k8s-worker2
EOF
6) centos package update
yum update -y
7) kubernetes yum repository 설정
[kubernetes]
vi /etc/yum.repos.d/kubernetes.repo
@@@@
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
@@@@
8) docker 설치
curl -s https://get.docker.com
systemctl enable docker
systemctl start docker
9) docker daemon.json 편집
vi /etc/docker/daemon.json
@@@@
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
@@@@
10)kubernetes 패키지 설치
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
11)master node 설정
kubeadm init --apiserver-advertise-address=192.168.0.100 --pod-network-cidr=172.16.0.0/16
12)worker node 설정
kubeadm join * k8s-master에서 kubeadm join ~~ 기록한 값 입력
###오류발생시###
kubeadm reset
rm -rf $HOME/.kube
해서 init 초기화 해주고 오류를 해결해주면서 한다.
master와 worker 노드가 연결되어있는 상태
▣ 쿠버네티스 시작하기
■ 모든 리소스는 오브젝트 형태로 관리된다.
■쿠버네티스는 대부분의 리소스를 ‘오브젝트’라고 불리는 형태로 관리한다.
컨테이너의 집합 기본단위 - 포드(Pods)
컨테이너의 집합을 관리하는 컨트롤러 - 레플리카셋(Replica Set)
레플리카셋과 포드의 배포를 관리하는 - 디플로이먼트(Deployment)
디플로이먼트를 통해 생성된 포드를 접근시키는 - 서비스(Service)
노드(Node)
등이 하나의 오브젝트로 사용할 수 있다.
포드(Pods)
쿠버네티스에서 컨테이너 어플리케이션의 기본 단위이다. 포드는 1개 이상의 컨테이너로 구성되어있음.
(기본구성 : 도커-컨테이너, 스웜-서비스, 쿠버네티스-포드)
실습에 필요한 yaml 파일
(yaml 파일은 json파일의 상위 규격으로 시스템 설정을 개발할때 씀)
vi nginx-pod
kubectl apply -f nginx-pod.yaml
포드 생성
kubectl get pods
kubectl get pods -o wide
포드 목록 출력(상세)
예시로 든 포드 목록인데 어떤 워커노드에서 실행되는지 확인 가능하다.
해당 노드로 가서 컨테이너를 실행시키고 curl localhost
vi nginx-pod-with-ubuntu.yaml
이번에는 nginx와 ubuntu가 공존하는 포드를 생성한다. 컨테이너가 2개이다
ubuntu-sidecar-container 컨테이너 내부에서 로컬호스트로 HTTP 요청을 전송하면 Nginx 서버의 응답이 도착
※Nginx 컨테이너는 그 자체만으로도 완전한 어플리케이션이기 때문에 하나의 포드에 2개의 Nginx 컨테이너가 정의되는 것은 바람직하지 않다. 그러나 Nginx 컨테이너가 실행되기 위해 부가적인 기능을 필요로 한다면, 이를테면 Nginx의 설정 파일의 변경사항을 갱신해주는 설정 리로더(reloader) 프로세스나 로그를 수집해 주는 프로세스는 Nginx 컨테이너와 함께 실행돼야 한다. 이런 경우 포드의 주 컨테이너를 Nginx로 하되, 기능 확장을 위한 추가 컨테이너를 함께 포드에 포함시킬 수 있다. 이렇게 포드에 정의된 부가적인 컨테이너를 사이드카(sidecar) 컨테이너라 부르며, 사이드카 컨테이너는 포드 내의 다른 컨테이너와 네트워크 환경을 공유하게 된다.
레플리카셋(Replica Set)
쿠버네티스에서는 기본 단위가 포드이기 때문에 동일한 여러 개의 포드를 생성해 외부 요청을 각 포드에 분배하는 방식을 사용해야 할 것이다. 그렇다면 동일한 여러 개의 포드를 어떻게 생성할 수 있을까? 가장 간단한 방법은 다른 이름을 가지는 여러 개의 포드를 직접 만드는 방식일 것이다. 그러나 여러 개의 포드를 직접 생성하는 방법은 여러 가지 이유로 적절하지 않다.
- 동일 한 포드의 개수가 많아질수록 이처럼 일일이 정의하는 것은 매우 비효율적인 작업이다.
- 포드가 어떠한 이유로든 삭제되거나, 포드가 위치한 노드에 장애가 발생해 더 이상 포드에 접 근하지 못하게 됐을 때, 관리자가 직접 포드를 삭제하고 다시 생성하지 않는 한 해당 포드는 다시 복구되지 않는다.
이러한 문제를 해결하기 위해 레플리카셋을 만들어 동일한 포드를 안정적으로 여러개를 실행하고 장애가 생기더라도 기존의 정해진 개수의 포드를 유지할수 있게 해야한다.
레플리카셋의 역할 :
- 정해진 수의 동일한 포드가 항상 실행되도록 관리한다.
- 노드 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성한다.
■ 레플리카셋 사용하기
vi replicaset-nginx.yaml
replicaset-nginx라는 레플리카셋 이름으로 3개의 포드를 만드는데 포드이름은 레플리카셋+라벨이 붙은 형태로 생성됨
쿠버네티스는 이미 생성된 리소스의 속성을 변경하는 기능을 제공하기 때문에 위의 yaml파일의 replicas개수를 4개로 바꿔주고 apply시켜주면 configured라는 문구가 나오고 포드를 확인해보면 4개의 포드가 생길 것이다.
■ 레플리카셋의 동작 원리
레플리카셋은 포드와 연결돼 있지 않다. 오히려 느슨한 연결(loosely coupled)을 유지하고 있으며, 이러한 느슨한 연결은 포드와 레플리카셋의 정의 중 라벨 셀렉터(Label Selector)를 이용해 이뤄진다.
spec.selector.matchLab els.app 의 값은 my-nginx-pods-label이 된다.
metadata 항목에서는 리소스의 부가적인 정보를 설정할 수 있다고 했다. 그 부가정보 중에 는 리소스의 고유한 이름뿐만 아니라 주석(에노테이션:Annotation), 라벨 등도 포함된다. 특히 라벨은 포드 등의 쿠버네티스 리소스를 분류할 때 유용하게 사용할 수 있는 메타데이터이다.
app: my-nginx-pods-label 라벨을 가지는 포드를 미리 생성해 놓은 다음, 위의 레플리카셋을 생성하면 어떻게 될까?
vi nginx-pod-without-rs.yaml
kubectl apply -f nginx-pod-without-rs.yaml
app=my-nginx-pods-label의 이름을 가진 포드가 생성된다. 이제 레플리카셋을 생성해 보면
kubectl apply -f replicaset-nginx.yaml
replicaset-nginx의 이름으로 3개의 포드가 생성되어야 하는데 미리 해당 라벨을 가진 포드가 1개 있었기 때문에 2개의 포드만 생성되었다.
레플라카셋이 생성해 농은 포드의 라벨을 삭제한다면 어떻게 될까? 이번에는 kubectl edit 명령어로 포드 중 하나의 라벨을 삭제해 본다.
kubectl edit pods replicaset-nginx-xl7lx 해서
labels: // 해당 라인 삭제
app: my-nginx-pods-label // 해당 라인 삭제
하고 포드를 확인해보면 라벨을 지운 포드가 그대로 남아있고 3개의 포드를 맞추기 위해 새로운 포드가 생성되었다.
라벨이 없는 포드는 이제 레플리카셋에 의해 관리되지 않으므로 레플리카셋을 삭제한다고 하더라도 그대로 남아있을 것이다.
디플로이먼트(Deployment)
디플로이먼트는 레플리카셋의 상위 오브젝트이기 때문에 디플로이먼트를 생성하면 해당 디플 로이먼트에 대응하는 레플리카셋도 함께 생성된다. 따라서 디플로이먼트를 사용하면 포드와 레플리카셋을 직접 생성할 필요가 없다.
vi deployment-nginx.yaml
kind 항목이 Deployment로 바뀌었을 뿐, 레플리카셋의 YAML 파일에서 변경된 부분은 거의 없어 보인다.
디플로이먼트로부터 생성된 레플리카셋과 포드는 동일한 해시값을 포함한 이름으로 생성되었다.
■ 디플로이먼트를 사용하는 이유
디플로이먼트를 사용하는 핵심적인 이유 중 하나는 애플리케이션의 업데이트와 배포를 더욱 편하게 만들기 위해서이다.
디플로이먼트는 컨테이너 애플리케이션을 배포하고 관리하는 역할을 담당한다. 어플리케이션을 업데이트할 때 레플리카셋의 변경 사항을 저장하는 리비전(revision) 을 남겨 롤백을 가능하게 해주고, 무중단 서비스를 위해 포드의 롤링 업데이트의 전략을 지정 할 수도 있다.
vi deployment-nginx.yaml
kubectl apply -f deployment-nginx.yaml --record
예를 들어 포드의 이미지 버전을 기존 nginx:1.10에서 nginx:1.21으로 변경하려면 다음과 같이 명령어를 입력하면 된다.
kubectl set image deployment my-nginx-deployment nginx=nginx:1.21 --record
그러면 기존 레플리카셋에 모든 포드가 사라지고 새롭게 생긴 레플리카셋에 이미지 버전이 업데이트된 포드들이 생성된다. 디플로이먼트는 포드 의 정보가 변경되어 업데이트가 발생했을 때, 이전의 정보를 리비전으로서 보존한다. 이러한 리비전 정보는 다음 명령어로 더욱 자세히 확인할 수 있다.
지금까지 테스트한 모든 리소스들을 정리하는 명령어이다.
kubectl delete deployment,pod,rs --all
'클라우드,가상화,방화벽' 카테고리의 다른 글
kubernetes create, apply, replace 차이 (0) | 2023.06.22 |
---|---|
[Kubernetes]쿠버네티스 - 2 (0) | 2023.06.07 |
ASA방화벽-1 (0) | 2023.05.24 |
[docker]도커 스웜(swarm) (1) | 2023.05.22 |
[docker]도커 파일 (0) | 2023.05.22 |