20220513 필기노트

강재민·2022년 5월 13일
1

필기노트

목록 보기
7/23
post-thumbnail
post-custom-banner

강의요약


K8s 설치

  • Kubeadm

  • Kubespray (Kubeadm + Ansible)

  • Kops

  • Docker Desktop - Kubernetes

  • minikube

Kubeadm

1.22.8

kubeadm, kubectl, kubelet 도구 설치

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
apt-cache madison kubelet | grep 1.22.8
apt-cache madison kubectl | grep 1.22.8
sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y
sudo apt-mark hold kubelet kubeadm kubectl

cgroup driver 오류

docker info | grep 'Cgroup Driver'
 
 Cgroup Driver: 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

k8s 클러스터 생성

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
kubectl get nodes

NAME     STATUS     ROLES                  AGE   VERSION
docker   **NotReady**   control-plane,master   14m   v1.22.8

Calico 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

custom-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
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
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        40m
myweb-svc    NodePort    10.96.114.201   <none>        80:**31891**/TCP   5s
curl 192.168.100.100:**31891**

Hello World!
myweb-97dbf5749-8tq2l
kubectl scale deployment myweb --replicas=3
kubectl get pods

myweb-97dbf5749-8tq2l   1/1     Running       0          12m
myweb-97dbf5749-9bm8l   1/1     Running       0          3m13s
myweb-97dbf5749-n29m2   1/1     Running       0          3m13s
curl 192.168.100.100:**31891**
kubectl delete service myweb-svc
kubectl delete deployment myweb

필기노트 시작


AmazonECR


AWS CLI 설치 및 구성

iam을 테라폼사용하던 계정말고 하나 더 추가 해주는게 좋음
이미지를 registrypush 하려면 AWS CLI가 필요함

  • IAM 계정 생성(프로그래밍 방식)
  • docker vm에 aws 명령설치
  • aws 명령 인증 구성
aws configure list		# aws configure 잘 되었는지 확인

AmazonECR 생성

Elastic Container Service/리포지토리/리포지토리 생성

항목설정값
표시여부 설정프라이빗
리포지토리 이름유일한 이름으로 설정
태그 변경 불가능비활성화됨
이미지 스캔 설정활성화됨
KMS 암호화비활성화

/리포지토리 생성/클릭


이미지 Push

/Amazon Elastic Container Registry/Repositories/푸시 명령어보기/클릭

docker login --help

### 순서 : 먼저 태그를 aws형식에 맞게 추가해주고
###       docker login을 해주고 해당 레포지토리에 push 해준다.
docker tag wepserver:django 238663298897.dkr.ecr.us-east-1.amazonaws.com/repush:alpine
docker images
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 238663298897.dkr.ecr.us-east-1.amazonaws.com
docker push 238663298897.dkr.ecr.us-east-1.amazonaws.com/repush:alpine

취약점확인도 가능하다.


Amazon ECS

/서비스/EC2/보안그룹/보안그룹생성

항목설정값
보안그룹 이름djangowebcontainer
유형TCP
포트8000
주소모든곳

/서비스/ECS/

/서비스/ECS/클러스터 생성

항목설정값
클러스터이름mycontainer
네트워킹기본값유지 하면서 보안그룹도 추가
인프라기본값 유지
모니터링활성화

생성

컨테이너를 서비스개념으로 관리하고 시작을하면 테스크에서 관리

/서비스/ECS/테스크 정의/새 태스크 구성

항목설정값
태스크 정의 패밀리djangoweb-task
이미지 URI238663298897.dkr.ecr.us-east-1.amazonaws.com/repush:alpine
이름djangoweb
컨테이너 포트8000

httpd이미지로 바꾸어서 해보기,
ECR이 프라이빗이라서
역할을 세팅해주어야함

환경

항목설정값
앱환경AWS Fargate
운영 체제Linux/X86_64
CPU0.25 vCPU
메모리0.5GB
모니터링기능활성화

다음

검토 하고 생성하면 됨

/서비스/ECS/클러스터/배포

항목설정값
애플리케이션 유형서비스
패밀리djangoweb
계정1
서비스 이름myweb-svc
원하는 태스크2

배포


태스크/컨테이너선택/퍼블릭IP/주소열기

삭제할때는
/서비스/ECS/서비스/삭제/서비스강제삭제


클러스터를 지우고

/cloudwatch/로그그룹


쿠버네티스


도커 비용 정책 때문에
대안이 되고 있는게 podman

명령어는 똑같음
그리고 podman의 장점 중에 하나가 데몬이 없다는 것임

데몬이 죽으면 컨테이너가 모두 죽을 수가 있음 근데 데몬이 없다보니 그런 실패지점이 없음

Podman은 docker compose에 대응하는 기능이 아직 없다.

지금까지이 IT페러다임을 바꿨다라고 할 정도로 쿠버네티스의 영향력은 어마어마하다고 한다.
인터넷의 핵심은 쿠버네티스다..
쿠버네티스는 종합예술이다..

https://kubernetes.io/ko/

https://www.youtube.com/watch?v=BE77h7dmoQU

https://www.youtube.com/watch?v=318elIq37PE

쿠버네티스를 설계한 철학이 나옴
1편은 번역이 되었는데 2편은 아직 번역은 안되어있음

Honeypot이라는 유튜브 계정은 원래 구인구직사이트인데 REDHAT관계자들과 같이 영상작업을 한것이 몇몇 있음

쿠버네티스 문서 번역률은 중국어가 가장 많이 되어있고 그 다음으로 한국어임 재능기부 형태로 되어가고있음

kubernetes는 조타수라는 뜻임

https://www.cncf.io/
container ecosystem 을 관리해줌

https://landscape.cncf.io/

군청색은 졸업프로젝트
하늘색은 인큐베이팅임
가장 큰 것들은 메인 프로젝트
회식들은 cncf가 관리하지않는 다른 외부의 오픈소스 또는 사용제품들을 의미

https://research.google/pubs/pub43438/
구글의 논문
아주 큰 클러스터를 관리하기 위한 기법으로 Borg를 추천하고있음
https://storage.googleapis.com/pub-tools-public-publication-data/pdf/43438.pdf


쿠버네티스란 무엇인가?

쿠버네티스는 PaaS임
그리고 기본적으로 immutable을 기준으로 만들어졌음
다만 mutable도 계속 추가할 예정
로그나 모니터링기능은 없음
소스나 배포기능은 없음

쿠버네티스의 아키텍처

꼭 기억하두기
클러스터는 여러대를 묶어서 관리하는 개념
Control Plane
Node
각각 VM을 사용함

Node는 컨테이너를 실행해주는 역할
Docker나 Podman같은게 설치 되어있어야함

Control Plane은 Node들을 관리함
다만 Control Plane이 단일 실패지점이 될 수 이썽서 똑같은게 여러 개 있음

이런 그림들이 바로 그런 내용임
3대식 두는게 기본임

다만 이런건 짝수대로 설정하면 안됨
split brain

흔히 아는 미니언즈들과 비슷한 내용
인종차별 문제와 상표 문제로 인해서 이름이 바뀌었다.

Cluster는 짝수로 묶지 않는다

헬스체크를 할 때 문제가 생긴다.
4개중에 1개가 네트워크가 끊어진 경우
과반수정책, 정족수정책이라고 한다.
최악의 시나리오이가 한데
딱 동률로 장애가 생겼을 경우

누구를 죽일 것인지에 대해서 혼란스럽게 됨

API
모든 쿠버네티스 서버는 API를 거쳐서 통신하게 된다.
kubectl

CM conrol manager
쿠버네티스는 컨테이너를 직접 관리하지 않는다.
Pod 파드 를 관리하게 된다.

C-C-M cloud controller manager
cloud와 연결할 때 관리하는 건데 노출되어있지 않아서 크게 다룰 일은 없다.

sched 스케줄러

어떻게 리소스를 배치할 것인가에 대한 제어

etcd etd demon임
etc에는 설정이 들어가 있다 윈도우에 제어판과 같은 역할
엣씨디 라고 읽음
key value storage로 되어있음
스토리지 종류중에 데이터베이스가 있는거임 헷갈려하지말기
선언적이다 desire
절차적이다..
테라폼이 대표적인 선언형
엔서블은 절차적임
선언의 형식은 yaml로 한다.
etcd도 클러스터형식으로 해주는게 좋음

Kubelet
CRI Container Runtime Interface
ex) Docker
CRI가 설치되어 있고 Pod이라는 개념으로 컨테이너를 관리함

k-proxy
네트워크의 정책을 iptables 정책을 세팅해줌
docker-proxy와 같은 작업을 해줌


각각의 모든 구성들도 결국 컨테이너이기 때문에
이 컨테이너들을 관리하기 위해서 kubelet k-proxy는 control plane에도 존재한다.

애드온

추가 기능들을 사용하게 해줌

주요 애드온
DNS (kube-dns)
Service Discovery
특정 컨테이너가 특정 컨테이너를 찾는 서비스
docer compose에서 컨테이너끼리 이름주소로 통신하는 개념

컨테이너 리소스 모니터링
대표적으로 Prometheus가 있음
프로메테우스는 어디서든 사용할 수 있는거임

클러스터-레벨 로깅
elk
Elastic search
오픈소스가 아님


Kubernetis 설치

Kubeadm
Kubespray (Kubeadm + Ansible)

Kops 는 EC2 인스턴스테 쿠버네티스 자동으로 설치해주는 것
그럴꺼면 그냥 관리형 쓰는게 나음

Docker Desktop -Kubernetes
단점은 너무 기본적인 내용만 사용 가능

minikube
로컬환경에 가상화를 올려서 쿠버네티스를 구성해줌 편해서 학습용으로는 좋지못함


k8s 설치

https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

kubeadm은 쿠버네티스를 설치하기 위한 도구임

포트번호가 정리되어있는 문서 추가 예정

런타임 설치는 도커설치 되어있으면 넘어감


세 가지를 설치를 하고 쿠버네티스를 설치하게 됨

https://github.com/kubernetes/kubernetes
쿠버네티스 버전을 볼 수 있는데
현재 최신 버전은 1.24.0인데 아직 검증이 안되어있기 때문에
dev -> alpha -> beta -> rc -> stable

1.22.8버전을 설치할 예정

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
cat /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

아직 설치하지 말고

apt-cache madison kubeadm | grep 1.22.8
apt-cache madison kubectl | grep 1.22.8
apt-cache madison kubelet | grep 1.22.8
sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y
kubeadm version
kubectl version
kubelet --version

### 반드시 버전이 같아야함

apt upgrade하면 버전이 자동으로 업그레이드 되므로 버전을 잠궈주어야한다.

sudo apt-mark hold kubeadm kubelet kubectl

k8s 클러스터 생성

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

https://github.com/kelseyhightower/kubernetes-the-hard-way
쿠버네티스를 어렵게 설치하는 방법.. 쿠버네티스의 본질을 알 수 있다고 한다.


쿠버네티스 자격증도 있음
시험이 performance 베이스이다
실제 명령어를 사용해야함
실습형임
쿠버네티스와 RedHat자격증이 실무형임 그래서 자격증을 인정해주는 편임

오류발생

kubelet이 작동을 하는 상태에서 실행해주어야 함

https://github.com/kubernetes/kubeadm/issues/2605
소프트웨어 설치라는게 항상 같은 상황이 아니다.

뭐가 안되면 구글링할게 아니라
https://github.com/kubernetes/kubernetes
issue 눌러보면 지금까지 있었던 이슈들이 다 나와있다


이거를 opne issue면 해결이 안된 것임

{
"exec-opts": ["native.cgroupdriver=systemd"]
}
이거를 설정해서 도커를 다시 재설정하고 쿠베렛을 재시작 해주면 된다.

docker info | grep 'Cgroup Driver'		#Cgroup Driver: 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

해주고 다시 명령어를 실행하주면 설치가 성공됨

성공화면은 복시해서 잘 메모장에 저장해놓고


이 부분은 인증파일임 매우 중요한 파일

kubectl get nodes

https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model

https://projectcalico.docs.tigera.io/about/about-calico

/Install/k8s/Self-managed on-premises

https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises

강의자료 확인 후 추가해주어야함

kubectl get pods -A #모든 pod의 목록을 보여주라는 뜻
coredns가 kubdns

kubectl get nodes			# Ready 상태가 되어야함

간단한 예제

kubectl create deployment myweb --image=ghcr.io/c1t1d0s7/go-myweb
### 컨테이너를 만드는 명령어
kubectl get deployments,replicasets,pods
### 명령어 확인


이 상태가 되어야함

kubectl expose deployment myweb --port=80 --protocol=TCP --target-port=8080 --name myweb-svc --type=NodePort
쿠버네티스는 포트포워딩이 없고 외부로 포트를 노출시키는 방식임
서비스라는 이름으로 불림

30000번대의 포트랑 본인의 ip와 조합을 해서 포트로 접속을 하면

kubectl scale deployment myweb --replicas=5

### pod의 개수를 5개로 만듬


부하 분산을 확인할 수 있음

삭제하려면
kuberctl delete service myweb-svc
kuberctl delete deployment myweb

쿠버네티스에서
문서에
개념을 보면서 한 번 공부 해보는걸 추천함

post-custom-banner

0개의 댓글