Sub7_Kubernetes

Kubernetes 설치, 도커설치, 애드온설치(Metallb, rook-ceph, ingress-nginx, metrics server)

HEONPOLI 2021. 7. 19. 23:01

https://github.com/HEONPOLI/k8sProj/blob/master/k8sinstall.md

 

*도커설치

ce => community edition ⇒ 공짜, 서버역할

ce-cli => client

 

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

installation for ubuntu

 

sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

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-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo docker run hello-world ##설치확인



*kubeadm, kubelet, kubectl 설치

 

**컨트롤, 노드 공통

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

 

*클러스터 구성(워커노드 1개, calico 네트워크 대역 사용)

**컨트롤 플레인(k-control)에서

 

sudo kubeadm init --control-plane-endpoint 192.168.200.50 --pod-network-cidr 192.168.0.0/16 --apiserver-advertise-address 192.168.200.50

<이거 끝나면 join 명령어 나옴>

 

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config


kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

kubectl taint nodes --all node-role.kubernetes.io/master- # 이거해줘야 rook-ceph 정상적으로 받아올 수 있다. 노드1개의 클러스터 구성이므로 수행



**워커노드(k-node1)에서

sudo su -

위에서 join 명령어 나온거 혹은

 

sudo kubeadm join 192.168.200.50:6443 --token <토큰찾은거> --discovery-token-ca-cert-hash <해시값 찾은거>

 

토큰찾기: 

kubeadm token list # k-control에서

해쉬값 찾기: 

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
  openssl dgst -sha256 -hex | sed 's/^.* //'

 

만약에 토큰이 없어졌다? kubeadm token create 하고 그거 list로 검색해서 쓴다



*k8s 버전관리, 버전업그레이드

https://kubernetes.io/ko/releases/version-skew-policy/#kubectl

<버전이 얼만큼 차이나도 되는지.. skew 확인>

API Server 가 가장 먼저 업그레이드 되어야한다..

kubelet

kubelet은 kube-apiserver보다 최신일 수 없으며, 2단계의 낮은 마이너 버전까지 지원한다.

따라서 kubelet upgrade 전에 apiserver를 먼저 업그레이드해줘야한다.

kube-controller-manager, kube-scheduler 그리고 cloud-controller-manager

kube-controller-manager, kube-scheduler 그리고 cloud-controller-manager는 그들과 통신하는 kube-apiserver 인스턴스보다 최신 버전이면 안 된다. kube-apiserver 마이너 버전과 일치할 것으로 예상하지만, 최대 한 단계 낮은 마이너 버전까지는 허용한다(실시간 업그레이드를 지원하기 위해서).

kubectl

kubectl은 kube-apiserver의 한 단계 마이너 버전(이전 또는 최신) 내에서 지원한다.

 

API server -> kubeadm(kube-controller-manager, kube-scheduler, cloud-controller-manager) -> kublet,kubectl 순서로 업그레이드

 

원칙: 마이너버전 2개를 뛰어넘어서 업그레이드 불가하다. 

Ex) 1.18.19-00 → 1.20.03-00 (X)

1.18.19-00 → 1.19.12-00 → 1.20.03-00 (O)



1.18.20-00 에서 1.19.12-00 으로의 업그레이드 진행예시

 

*순서

control-plane

kubeadm (api, cm , ccm sche)

kubectl, kubelet

node

kubeadm (proxy)

kubectl/kubelet

 

**control plane에서..

#kubeadm 설치에서 apt-mark hold 로 전체 업데이트시에 kubeadm, kubelet, kubectl 등을 같이 업그레이드 되지 않게 hold 해놨는데 held package의 업데이트를 허용한다의 명령어 수행

sudo apt-get update && sudo apt-get install -y --allow-change-held-packages kubeadm=1.18.20-00

 

sudo kubeadm upgrade plan

sudo kubeadm upgrade apply v1.18.20

 

sudo apt-get update && \

    sudo apt-get install -y --allow-change-held-packages kubelet=1.18.20-00 kubectl=1.18.20-00

 

sudo systemctl daemon-reload

sudo systemctl restart kubelet



**node 에서..

sudo apt-get update && \

sudo apt-get install -y --allow-change-held-packages kubeadm=1.18.20-00



sudo kubeadm upgrade node

 

sudo apt-get update && \

sudo apt-get install -y --allow-change-held-packages kubelet=1.18.20-00 kubectl=1.18.20-00



sudo systemctl daemon-reload &&\

sudo systemctl restart kubelet

 

kubectl get nodes 로 1.18.20 버전 확인



**노드 추가,삭제

클러스터 구성에 노드를 추가: kubeadm join 명령문을 새로 생성한 노드에 적용해주면 되는데

가정:

  1.  docker run time이 설치되어있다.
  2. kubectl, kubelet, kubeadm 버전의 SKEW가 Control Plane과 일치

가정에 맞다면

 

토큰찾기: 

kubeadm token list # k-control에서

해쉬값 찾기: 

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
  openssl dgst -sha256 -hex | sed 's/^.* //'

 

조인하기:

sudo kubeadm join 192.168.200.50:6443 --token <토큰찾은거> --discovery-token-ca-cert-hash <해시값 찾은거>

 

클러스터 구성에서 노드를 삭제

*해당 노드에서..

  1. kubeadm reset 
  2. output으로 나온 디렉토리 하위항목들 rm -rf 명령어로 제거
  3. sudo apt remove kubeadm kubelet kubectl # 세게 다 제거

*컨트롤 플레인에서..

  1. kubectl delete node [해당노드 이름]




*Metallb 설치

<config.yaml> 파일 작성해놓고 시작

 

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml

kubectl apply -f config.yaml 

 

시스템 돌아가는 거 확인 → kubectl get all -n metallb-system 

다 running이면 된다. completed 있을 수도?



*인그레스(ingress-nginx) 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yam

 

위에거 다 create 되고, kubectl get all -n ingress-niginx 로 확인

ingress-nginx-controller가 running이나 컴플리티드면 밑으로 진행 

 

kubectl edit svc -n ingress-nginx ingress-nginx-controller

 

spec 밑의 아무부분에 위와같이 입력후 저장



*rook-ceph 설치(워커노드1개임을 가정함)

https://rook.io/



git clone --single-branch --branch v1.6.7\
https://github.com/rook/rook.git

cd rook/cluster/examples/kubernetes/ceph

kubectl create -f crds.yaml -f common.yaml -f operator.yaml

 

위의 명령어 치고

kubectl get po -n rook-ceph # operator 돌아가고 있는지 확인해야함 

돌아갔따?

그러면 밑으로 진행

 

kubectl create -f cluster-test.yaml # 이거 시간 오래걸림

 

kubectl get all -n rook-ceph로 진행확인, 아마 watch 하면 느려서 업데이트 안된느거처럼 보여

 

이렇게 다 준비되고 완료되면 



kubectl create -f csi/rbd/storageclass.yaml # 블록스토리지 설치




kubectl create -f filesystem-test.yaml # 파일시스템 설치 

 

kubectl -n rook-ceph get pod -l app=rook-ceph-mds

이거 명령어치고

 

NAME                                      READY     STATUS    RESTARTS   AGE

rook-ceph-mds-myfs-7d59fdfcf4-h8kw9       1/1       Running   0          12s

rook-ceph-mds-myfs-7d59fdfcf4-kgkjp       1/1       Running   0          12s

이런식으로 myfs 해당하는 파드 다 러닝 된 다음에 밑으로 진행



kubectl create -f csi/cephfs/storageclass.yaml #파일 스토리지 설치



*Metrics Server 설치

https://github.com/kubernetes-sigs/metrics-server

 

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

yaml 파일만 따로 받아온다. 

 

<components.yaml>

yaml 파일 argument 항목에서 --kubelet-insecure-tls 를 추가해준다.

 

kubectl create -f components.yaml # 메트릭스 서버 설치