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 에 아래 내용을 설정합니다.
|
패키지 업데이트
# 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를 설치해야 합니다.
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 |