kubernets

[Ubuntu] kubernetes 설치

IT공부 2023. 2. 16. 14:29
반응형

1. 초기 설정(master/worker node)

  • 2G 이상 메모리
  • 2 CPU core 이상
  • 방화벽 off, 설정
  • 보안그룹 설정(AWS)
  • Swap off (필수)

방화벽 설정

sudo ufw disable

Master node 

Protocol Direction Port Range Purpose Used By
TCP Inbound 6443* k8s api server All
TCP Inbound 2379 - 2380 etcd server client api kube-apiserver, etcd
TCP Inbound 10250 kubelet API Self, Control plane
TCP Inbound 10251 kube-schedular Self
TCP Inbound 10252 kube-controller-manager Self

Worker node 

Protocol Direction Port Range Purpose Used By
TCP Inbound 10250 kubelet API Self, Control palne
TCP Inbound 30000-32767 NodePort Servicest All
CentOS 방화벽 설정 # Master

firewall-cmd --permanent --zone=public --add-port=6443/tcp
firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --permanent --zone=public --add-port=10251/tcp
firewall-cmd --permanent --zone=public --add-port=10252/tcp
firewall-cmd --reload

# Worker

firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
firewall-cmd --reload

* 방화벽 사용을 안하는경우
sudo systemctl stop firewalld && systemctl disable firewalld
Ubuntu 방화벽 설정 Ubuntu는 기존에 방화벽이 활성화 되어 있지 않기 때문에 활성화를 해주어야 한다.
- sudo ufw enable // 활성화
- sudo ufw disable // 비활성화
- sudo ufw status // 현재 상태 확인

# Master

sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10251/tcp
sudo ufw allow 10252/tcp

# Worker

sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp

add-on Weave Networks를 사용하는 경우 추가

sudo ufw route allow in on weave out on weave 

보안그룹 설정(AWS)

allow-kubernetes 라는 이름의 보안그룹을 생성합니다.
inbound/outbound 는 설정하지 않습니다.

protect-kubernetes 라는 이름의 보안그룹을 생성합니다.
inbound 에 아래 내용을 설정합니다.

  • 유형 : 모든 TCP
  • 포트범위 : 0 – 65535
  • 소스 : allow-kubernetes
allow-kubernetes, protect-kubernetes 를 모든 master/node 에 할당해 줍니다.

 

패키지 업데이트

# CentOS
sudo dnf -y update 

# Ubuntu
sudo apt-get update

swap off

sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab


swap: 메모리가 부족하거나 절전모드 상태에서 디스크 일부공간을 메모리처럼 사용하는 기능 
쿠버네티스에서는 스왑기능을 관리해야 하기 때문에 기존 시스템의 스왑기능을 꺼야 함.


*  kubernetes 사용을 위해 swapoff -a을 해줘야 하는데 swapoff failed: cannot allocate memory 에러가 발생 하게 되면

echo "3" > /proc/sys/vm/dro_caches

위와 같이캐시 메모리를 삭제하거나 Virtual Machine 자체의 메모리를 증가시켜주면 에러가 해결된다.

Docker, containerd 설치(모든 master, worker node)

kubenetes는 컨테이너 기반으로 작동하므로, Docker, containerd를 설치해야 합니다.

https://min-12.tistory.com/94

 

kubernetes 설치

kubelet, kubeadm, kubectl 설치 (모든 master, worker node)

 

iptables 관련 설정

iptables가 bridged traffic을 바라보게 만든다.

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

* br_netfilter 커널 모듈 활성화 

br_netfilter 커널 모듈을 사용하면 브릿지를 통과하는 패킷이 필터링 및 포트 전달을 위해 iptables에 의해 처리되고 클러스터의 쿠버네티스 Pod는 서로 통신이 가능해진다.

 

Repository 등록

sudo apt-get update

sudo apt-get install -y apt-transport-https ca-certificates

sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

echo "deb [signed-by=/etc/apt/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 install -y kubelet kubeadm kubectl

// 설치 가능한 버전 확인
sudo apt-cache madison kubelet      


sudo apt-get install -y kubelet=1.23.16-00 kubeadm=1.23.16-00 kubectl=1.23.16-00 

sudo apt-mark hold kubelet kubeadm kubectl

sudo systemctl enable kubelet
sudo systemctl start kubelet
 
sudo systemctl daemon-reload

sudo systemctl restart kubelet

** 처음 kubelet 실행이 실패하는 이유는 kubelet init 가 아직 실행되지 않아서 입니다.
  • kubeadm : 클러스터를 구축하기 위한 툴
  • kubelet : 클러스터의 각 노드에서 실행되는 에이전트이며 피드에서 컨테이너가 정상적으로 동작하도록 관리
  • kubectl : 클러스터와 통신하기 위한 명령 util

Control-plane 구성 (master only)

master node에서만 실행합니다.

sudo kubeadm init

kubeadm init 실행 시 에러

해결 방안)

sudo mkdir -p /etc/docker

cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
    "max-size": "100m"
},
"storage-driver": "overlay2" }
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
kubeadm join 10.1.2.97:6443 --token 0zuf8p.h3qofny02p6zyys2         --discovery-token-ca-ce78056bab0badbd840cbac88388a29d0455f90428057c550dd9a251c67

위 명령을 이용해 worker_node가 master에 조인 가능

아래 명령을 설정을해서  kubectl을 사용할 수 있습니다.

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

dotest@k8s-master:~/.kube$ kubectl get nodes
NAME         STATUS            ROLES                  AGE     VERSION
k8s-master   Ready    control-plane,master       10m       v1.23.16

kubectl bash 자동완성 적용

source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >>~/.bashrc

 

Pod network 애드온 설치 (master only)

 

Calico 설치

sudo curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O

sudo kubectl apply -f calico.yaml

확인 : kubectl get po -n kube-system

 

Calico 설치 확인

watch kubectl get pods -n calico-system

 

설치 안

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml

 

 

pod 간 통신을 위한 add-n Weave Net works을 설치합니다.

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

Worker Node를 구성하지 않을 경우 (master only)

테스트 용도로 하나의 서버에 마스터 노드만 구성하고, 그 위에 Pod를 실행하려는 경우 아래 명령을 실행

# kubectl taint nodes --all node-role.kubernetes.io/master-

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

Worker node 구성 (worker node only)

아래 명령으로 Worker node를 등록합니다.

kubeadm join 10.1.2.97:6443 --token 0zuf8p.h3qofny02p6zyys2         --discovery-token-ca-cert-hash sha256:6371aab78056bab0badbd840cbac88388a29d0455f90428057c550dd9a251c67

Master 에서 노드 확인하기 (master)

아래 명령으로 정상적으로 Node가 등록된 것을 확인할 수 있습니다.

dotest@k8s-master:~$ kubectl get nodes
NAME          STATUS   ROLES                       AGE   VERSION
k8s-master    Ready    control-plane,master   84m   v1.23.16
k8s-worker1   Ready    <none>                       55m   v1.23.16
k8s-worker2   Ready    <none>                       55m   v1.23.16

nginx 실행 및 삭제

테스트 용도로 nginx 실행

 

port 정리

 

nodePort : 외부 포트

  • 아무 노드에서도 이포트로 접근하면 service port로 포워딩된다.
  • 반드시 외부아이피 + 노드포트로 접속해야 한다.

port : 서비스 포트

  • pod port로 포워딩하기 위한 중간 포트
  • Worker 노드에서만 사용 할 수 있다.
  • 클러스터아이피 + 서비스포트로 접속해야 한다.

containerPort(targetPort) : Pod의 포트

  • Pod의 포트
  • Worker 노드에서 사용가능
  • Pod아이피 + 컨테이너포트로 접속해야 한다.

Deployment 생성

vi nginx-deployment.yaml
---------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3                 # 3개의 pod
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80   # 컨테이너 포트(pod 포트)
kubectl apply -f nginx-deployment.yaml
kubectl get deployments

kubectl get pod



kubectl get pod -o yaml | grep nodeName



kubectl get pod -o yaml | grep " podIP: "

Service 생성

k8s 내부 아이피를 이용해 접속이 가능하지만, 클러스터 외부에서 접속하기 위해서는 서비스를 생성해야한다.

vi nginx-svc.yaml
---------------------------
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  type: NodePort     # 서비스 타입
  ports:
  - nodePort: 31001  # 외부 포트
    port: 8080       # 서비스 포트
    targetPort: 80   # 컨테이너 포트(pod 포트)
    protocol: TCP
    name: http
  selector:
    app: nginx
kubectl apply -f nginx-svc.yaml

kubectl get svc | grep my-nginx



http://<node 서버 아이피>:31001/ 로 접속하면 nginx 가 실행된 것을 확인할 수 있다.

Worker 노드에서는 노드아이피 + 서비스포트로 접속이 가능하다.

노드아이피 + 노드포트로는 접속할 수 없다.

Master 노드 Worker 의 외부아이피 + 노드포트 를 이용해 접속할 수 있다.


nginx 삭제

# service 삭제
kubectl delete -n default
service my-nginx

# deployments 삭제
kubectl get deployments
kubectl delete deployments nginx-deployment

 

 

- k8s 설정

kubeadm 도구 사용

 

- kubeadm init

  • kubernetes 컨트롤 플레인 노드르 초기화한다.
  • 즉, 마스터 노드를 초기화 

init 시 에러 

kube@docker-ubuntu:/etc/docker$ sudo kubeadm init
[init] Using Kubernetes version: v1.26.1
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: time="2023-02-20T11:48:08+09:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
kube@docker-ubuntu:/etc/docker$ journalctl -xe kubelet
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.


해결방법

sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
sudo kubeadm init

 

- kubeadm join

  • kubernetes 워커 노드를 초기화하고 클러스터에 연결한다.

- kuberadm upgrade 

  • kubernets 클러스터를 업그레이드 한다.

- kuberadm config

- kuberadm reset

- kuberadm version

 

- 마스터 노드 설정

kubeadm init <args> 명령어로 실행

 

  • --pod-network-cidr : Pod 네크워크를 설정할 때 사용
  • --apiserver-advertise-address : 특정 마스터 노드의 API Server 주소를 설정할 때 사용 

kubeadm init --pod-network-cidr=192.168.0.0/16 

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

kubernets 잘못 설정 하였을 때

# kubeadm 초기화

$ sudo kubeadm reset

$ sudo systemctl restart kubelet

$ sudo reboot

 

 

워커 노드(조인)

 

kubeadm join 10.100.0.107:6443 --token kz8yxq.2eewjcu1s0oyg98g \
        --discovery-token-ca-cert-hash sha256:859ae7737061a84f7a3266c59313722c57e34d1546eaa8a2f0c93afbffacc6be

Master node 

워커 노드 확인

kubectl get node -o wide

 

아래와 같은 에러가 발생할 시

root@k8s-master:~# kubectl get node -o wide
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

 

추가

root@k8s-master:~# export KUBECONFIG=/etc/kubernetes/admin.conf

 

**  설정을 잘 못하여 다시 설정을 해야 하는 경우

워커 노드 재설정

$ kubeadm reset
# y 입력하여 진행

# cni 삭제
$ rm -r /etc/cni/net.d/*
$ rm -r /etc/kubernetes/*

마스터 노드 재설정

# 기존에 등록된 워커노드 삭제

$ sudo kubectl delete node wnode01

 

# Deployment

kubectl create deployment mainui --image=httpd --replicas=3

kubectl get deploy 

kubectl get deployments.apps

 

# yaml 

kubectl run webserver --image=nginx:1.14 --port 80 --dry-run -o yaml > webserver-pod.yaml

kubectl create -f webserver-pod.yaml

'kubernets' 카테고리의 다른 글

[kubenetes] worker노드 삭제 후 다시 조인  (0) 2023.03.06
[CentOS] Docker 설치  (0) 2023.02.21
[k8s] TLS certificate errors  (0) 2023.02.21
[Ubuntu]Docker 설치  (0) 2023.02.16