K8S 실습

반영환·2023년 7월 17일
0

k8s

목록 보기
2/14
post-thumbnail

K8S 실습

실습 환경

EC2 3대 - centos7

VPC - default

K8S - 1.23v

docker - latest

EC2 구성

centos7 이미지 파일로 t2.medium 으로 생성해준다.
2코어 이상이 필요하므로 적절한 리소스를 사용하자

2024년 6월 21일 부로 오류가 발생했다. 다른 버전을 사용하자

추후 각 ec2에 동일한 포트를 열어주기 위해 생성할 때 같은 보안그룹을 설정해준다.

NACL과 보안그룹은 다른 영역의 내용이다. 서브넷 NACL을 개방하더라도 적용되지 않는다.

ec2에 접근시 유저 이름을 centos 로 설정해야 정상적으로 접속된다.

예를 들어

ssh -i "key_file_name.pem" ec2-user@publicDomainName

이라면, ec2-usercentos 로 설정해야 정상적으로 접속된다.

포트 설정

위의 포트를 사설에서만 접근 가능하도록 TCP포트를 열어준다. ec2들이 위치하는 VPC의 서브넷의 IPv4 CIDR를 넣어주면 된다.

vpc cidr를 넣었는데 안됐다 왜지?
서브넷을 넣어야지...

docker 설치

각 ec2에 접근할 수 있는 터미널을 3개 열어서 접속하자

이후 각 노드에 docker를 설치해주자

docker install for centos7

sudo -i 로 root 계정으로 설치를 진행하자

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

systemctl start docker

systemctl enable docker
# docker를 항상 ec2가 시작하면 실행되게 설정

docker ps 명령어로 docker daemon이 잘 실행되는지 확인한다.

docker daemon.json 설정

우리가 사용할 cGroupDriver 를 systemd로 설정하고, overlay2로 storage driver를 사용할 것임을 명시하자.

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

systemctl restart docker

K8S Repository 설정

k8s yum 파일 레포지토리에서 k8s를 당겨와 설치할 것이기 때문에 해당 레포 파일을 만들어준다.

k8s repo file create

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Kubernetes 저장소

구글이 호스팅하던 저장소가 사라져서 위 baseurl이 아닌 아래 코드를 넣어야 한다.

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

disable SELinux

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

disable firewall

systemctl stop firewalld && systemctl disable firewalld

K8S 설치

sudo yum install -y  kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17 --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

K8S config file 설정

iptables 관련 설정과 ip-foward 설정이다.

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

disable swap

kubelet을 잘 작동시키기 위해 swap 옵션을 꺼야한다.

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

Control Plane 설정

control plane이 될 노드에 아래 명령어로 설정해준다.

kubeadm init

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

kubectl get nodes를 했을 때 status가 notready이다.
이는 CNI 설정을 하지 않아서 그런것이므로 CNI설정을 해주자.

CNI 설정

CNI Integrating K8S


CNI를 설정하기 전 포트를 열어주자

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

위 weave cni는 aws linux1 에서는 호환이 안된다. calio를 사용하자.

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

왜 Control Plane 에서만 CNI 설정을 하나요?
이후 결과값을 보면 daemonset 이라는 부분이 있는데 daemonset은 클러스터의 모든 노드에 같은 사항을 관리하는 데몬이므로 C/P에서만 설정해주어도 모든 노드에 설치되게 된다.

Worker Node 설정

CNI 설정 이후에 위에서 나온 join 값을 워커 노드에 붙여서 복사해준다

kubeadm join <컨트롤플레인IP>:6443 --token <토큰내용> --discovery-token-ca-cert-hash sha256:<토큰내용>

띄어쓰기를 주의해서 붙여넣어야한다!!

이후 C/P에서 파드들이 잘 올라왔는지 확인해본다.

kubectl get pods -o wide —all-namespaces

status가 ready라면 잘 진행된 것이다.

POD 배포

kubectl create deploy sample-dp --image=nginx --replicas=3 

kubectl get all

로 배포된 거 확인

나는 에러가 발생했음.

kubectl exec -it pod/ID — /bin/bash # 파드 내부 진입

kubectl describe pod/sample-dp-69d8974f8f-6t5mb # 상태 확인

23-07-16

나의 경우에는 failed to set up sandbox container 라고 떴었음

kubectl run pod-exam --image=nginx:1.14

해당 파드가 올라간 노드에 가서 docker img pull을 해봤는데 잘 됐음
즉, 노드와 외부 인터넷의 연결 문제가 아닌, 클러스터 내부 네트워크 문제였음.

원인을 파악한 결과 클러스터 내부에서 사용되는 포트를 NACL에서 개방을 했기에 문제가 발생했음.

이전 포스트에서 말했듯이 NACL에서 개방하는 포트와 보안그룹에서 개방하는 포트는 다르므로 EC2 각각에서 포트를 개방해 주어야 했음.

23-07-17

VPC의 CIDR로 포트를 개방해주었는데 kubectl 명령어가 작동하지 않았음.
삭제하고 다시 모든 IP로 포트를 개방해보든, VPC CIDR로 개방하는 방법을 바꾸어보든 해야함.

VPC Subnet CIDR 로 개방해야 하며,
인증서 문제때문에 kubectl 명령어가 작동하지 않은 것.

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  
# 를 kubeadm init 이후에 넣어주거나 ,

export KUBECONFIG=/etc/kubernetes/admin.conf

# 를 넣어주어야 함
profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글