[Cloud] k8s 개요 및 설치

MeltingOlaf·2022년 5월 13일
0

[Cloud]

목록 보기
12/25

✔️ 쿠버네티스란?

Control Plane

  • Node를 관리
  • 일반적으로 최소 3개로 구성한다
  • 절대 짝수로 구성하지 않는다
    - 5:5 Split Brain이 발생 할 수 있다

API server

  • 모든 시스템은 API server을 통한다

c-m (Controller-manager)

  • 클러스터 전체를 컨트롤
  • 종류
    - 노드 컨트롤러
    - 레플리케이션 컨트롤러 = pod들의 복제를 관리
    - 엔드포인트 컨트롤러
    - 서비스 어카운트 & 토크 컨트롤러

Sched

  • 스케쥴러
  • pod를 어디에 어떻게 배치할지 관리

etcd (etc daemon)

  • key value 스토리지

k-proxy (kube-proxy)

  • 노드의 네트워크 규칙을 유지 관리

애드온

DNS (kube-dns)

  • 애드온이지만 거의 필수
  • Service Discovery = 어떠한 서비스를 찾는 것을 의미
  • 쿠버네티스

컨테이너 리소스 모니터링

  • 중앙 데이터베이스 내의 컨테이너들에 대한 포괄적인 시계열 매트릭스를 기록하고 그 데이터를 열람하기 위한 UI를 제공

클러스터-레벨 로깅

  • 메커니즘은 검색/열람 인터페이스와 함께 중앙 로그 저장소에 컨테이너 로그를 저장

✔️ 쿠버네티스 설치

Kubeadm = 쿠버네티스를 설치하기 위한 도구
Kubespray(Kubeadm+Ansible) = 실제로 많이 쓰임

설치
Kubeadm 1.22.8
쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치

$ sudo apt-get update
$ sudo apt-get 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

저장소 추가

$ 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
$ sudo apt-get update # 저장소 추가 했으니 한번 더 실행

설치 버전 확인

$  apt-cache madison kubeadm | grep 1.22.8
   kubeadm |  1.22.8-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
$ sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y

패키지 업데이트시 자동업데이트를 막기위한 hold

$ sudo apt-mark hold kubelet kubeadm kubectl

클러스터 생성

$ kubeadm init --control-plane-endpoint 192.168.100.100 --pod-network-cidr 172.16.0.0/16 --apiserver-advertise-address 192.168.100.100

사용하고 있는 네트워크와 충돌을 방지하기 위해 172.16.0.0/16 사용

Cgroup driver 오류

  • kubelet이 실행이 되지 않아 발생
docker info | grep 'Cgroup Driver'
 
 Cgroup Driver: cgroupfs # 버전이 바뀌면서 cgroupfs 지원 하지 않음

/etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

재실행

sudo systemctl restart docker
$ docker info | grep 'Cgroup Driver'

 Cgroup Driver: systemd
$ sudo systemctl daemon-reload && sudo systemctl restart kubelet

kubeadm init 실패 시 실행

$ sudo kubeadm reset
$ sudo kubeadm init --control-plane-endpoint 192.168.100.100 --pod-network-cidr 172.16.0.0/16 --apiserver-advertise-address 192.168.100.100
 $ mkdir -p $HOME/.kube
 $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 $ sudo chown $(id -u):$(id -g) $HOME/.kube/config

k8s 인증파일 생성 됨
- 노출 되면 안됨

 $ cd .kube
 $ ls
 config
 $ ls -l
 total 8
 -rw------- 1 vagrant vagrant 5639 May 13 08:08 config
$ kubectl get nodes
NAME     STATUS     ROLES                  AGE     VERSION
docker   NotReady   control-plane,master   9m20s   v1.22.8

✔️ Callico Network Add-on

$ kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
$ curl https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml -O

costoum-resources.yaml

...
	cidr: 172.16.0.0/16
...
$ kubectl create -f custom-resources.yaml

클러스트 상태 확인

$ kubectl get pods -A   

NAMESPACE          NAME                                       ...
calico-apiserver   calico-apiserver-c9565f67b-2p29k           ...
calico-apiserver   calico-apiserver-c9565f67b-slthl           ...
calico-system      calico-kube-controllers-5d74cd74bc-sg7dn   ...
calico-system      calico-node-tgxks                          ...
calico-system      calico-typha-7447fdc844-txrdb              ...
kube-system        coredns-78fcd69978-4ztkq                   ...
kube-system        coredns-78fcd69978-jpwxx                   ...
kube-system        etcd-docker                                ...
kube-system        kube-apiserver-docker                      ...
kube-system        kube-controller-manager-docker             ...
kube-system        kube-proxy-5st98                           ...
kube-system        kube-scheduler-docker                      ...
tigera-operator    tigera-operator-7cf4df8fc7-kx87z           ...
$ kubectl get nodes

NAME     STATUS   ROLES                  AGE   VERSION
docker   Ready    control-plane,master   30m   v1.22.8

isolation 해제

$ kubectl taint node docker node-role.kubernetes.io/master-

예제

$ kubectl create deployment myweb --image=ghcr.io/c1t1d0s7/go-myweb
$ kubectl get deployments,replicasets,pods

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myweb   1/1     1            1           4m40s

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/myweb-97dbf5749   1         1         1       4m40s

NAME                        READY   STATUS    RESTARTS   AGE
pod/myweb-97dbf5749-8tq2l   1/1     **Running**   0          4m40s

Pod 외부 노출

  • 쿠버네티스는 기본적으로 포트포워딩을 지원하지 않기 때문에 외부로 노출 시켜주어야 한다.
$ kubectl expose deployment myweb --port=80 --protocol=TCP --target-port=8080 --name myweb-svc --type=NodePort
$ kubectl get services

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        33m
myweb-svc    NodePort    10.103.90.115   <none>        80:32338/TCP   10s

$ curl 192.168.100.100:32338

Hello World!
myweb-97dbf5749-qb8tm

복제본 생성

$ kubectl scale deployment myweb --replicas=3
$ kubectl get pods

NAME                      STATUS                 AGE
myweb-97dbf5749-4krhf     ContainerCreatin       5s
myweb-97dbf5749-c5s7h     ContainerCreating      5s
myweb-97dbf5749-qb8tm     Running               9m18s

서비스 삭제 & deployment 삭제

$ kubectl delete service myweb-svc
$ kubectl delete deployment myweb
profile
How R U Today :)

0개의 댓글