Install Kubernetes Cluster on Ubuntu 22.04 with kubeadm
[ 설치환경 ]
- OS : Ubuntu 22.04 LTS(2 CPU, 4GB Memory, 20GB Disk 이상)
- master node : 1대(hostname : master)
- worker node : 2대(hostname : worker-1, worker-2)
설치순서
✔ 공통 설치(master node, worker node 에 설치)
1) CRI 설치
2) kubeadm, kubectl, kubelet 설치
3) CNI 설치
✔ master node
- kubeadm init 실행
✔ worker node
- kubeadm join 실행
1. 공통 설치(master node, worker node 에 설치)
1) CRI 설치(Container Runtime Interface)
도커 이미지를 관리해주는 CRI를 설치합니다. CRI는 많은 종류가 있는데 본 문서에서는 containerd 를 설치합니다.
sudo apt-get update
sudo apt-get install containerd
2) kubernetes 설치 전 환경설정
- br_netfilter 모듈을 로드합니다. br_netfilter 모듈이 로드되었는지 확인하려면
lsmod | grep br_netfilter 를 실행하면 됩니다.(kubernetes documents 에서 "container runtimes"로 검색)
sudo modprobe br_netfilter
- iptables가 브리지된 트래픽을 보게 하기
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
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
- ip_forward 설정
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
- swap off
$ sudo swapoff -a
- port 확인
master node에 6443, 8080 port 가 사용중인지 확인합니다. 사용 중인 서비스가 없어야 합니다.
쿠버네티스 API 서버는 2개의 포트에서 HTTP를 서비스합니다.
- 8080 port : 스트 및 부트스트랩을 하기 위한 것이며 마스터 노드의 다른 구성요소 (스케줄러, 컨트롤러 매니저)가 API와 통신
- 6443 port : TLS를 사용
telnet 10.10.1.15(예시, master node IP Address) 6443
- 방화벽 open(서버 방화벽 disable)
방화벽이 설정을 확인한 다음 방화벽이 enable되어 있으면 방화벽을 disable 합니다.
## 방화벽 설정 확인
sudo ufw status
## 방화벽 disable
sudo ufw disable
3) kubectl, kubeadm, 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
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
2. master node 설치
1) control plane 구성
control plane은 master node에만 구성합니다.(multi master 구성시에는 multi master 에 구성)
contron plane을 구성한다는 것은 kube-apiserver, kube-controller-manager, kube-scheduler, etcd, coreDns 를 설치하는 것입니다. 사용자가 kubeadm init 명령어만 수행하면 kubeadm 이 알아서 구성을 해줍니다.
kubeadm init 명령어로 control plane 을 구성합니다. 명령어 수행 제일 하단에 아래와 같이 kubeadm join 으로 시작하는 정보가 표시됩니다. 이 명령어는 나중에 worker node 에서 수행하여 cluster를 구성하는 명령어입니다. 별도로 저장해 놓습니다.
$ kubeadm init
## 수행결과
...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
...
kubeadm join 10.10.1.20:6443 --token x8g6zc.1yb94eh1u1940rrj \
--discovery-token-ca-cert-hash sha256:996f5ea00339533897cd991fb005349eeb366af000b13c8458f9743d5ada230c
root와 일반 user가 쿠버네티스 명령어를 사용할 수 있도록 환경 설정(master node에 설정)을 합니다.
root 유저로 kubectl 명령어를 수행하려면 root 유저로 아래를 설정합니다.
export KUBECONFIG=/etc/kubernetes/admin.conf
일반 유저로 kubectl 명령어를 수행하기 위해 일반 유저로 아래를 설정합니다.
mkdir -p $HOME/.kube
## admin.conf 파일은 kubelet 설치 시 생성
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
참고) 쿠버네티스 클러스터 구성 시 pod 의 네트워크 대역을 설정할 수 있습니다.
kubeadm init --pod-network-cidr=10.244.0.0/16;
2) CNI 설치(master node에 설정)
CNI(Container Network Interface)를 설치하여 Pod 간 통신을 할 수 있도록 합니다.
pod 네트워크 애드온 종류는 많습니다(calico, canal, flannel, romana, weave net 등).
원하는 네트워크 애드온을 마스터 노드에 설치합니다.
본 문서에서는 weave network add on 을 설치합니다.
Weave Net을 설치하기 전에 TCP 6783 및 UDP 6783/6784 포트가 방화벽에 의해 차단되지 않았는지 확인해야 합니다.
아래 명령어로 weave network add-on을 설치합니다.
<weabenet 설치>
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
## 실행결과
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created
2022.10.20 일 기준으로 kubectl 버전에 따라 위의 명령어가 수행되지 않을 경우, 아래 명령어를 수행한다
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
<calico 설치>
1. operator 설치
kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
2. calico 설정 파일 다운로드
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.3/manifests/custom-resources.yaml -O
3. calico 설치
kubectl create -f custom-resources.yaml
<flannel 설치>
주의할 점 : master node에서 컨트롤 플레인 설정 시 반드시 --pod-network-cidr=10.244.0.0/16 옵션으로 수행해야 한다
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
아래 명령어로 flannel CNS를 설치한다.
kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
3. worker node Join
worker node를 master node에 join 시킵니다.
master node 에서 수행한 kubeadm init 명령어의 실행 결과창에서 보여진 kubeadm join으로 시작되는 부분을 실행해 줍니다.
kubeadm join 10.10.1.15:6443 --token 2gcmlw.zfvrc2b42j3q30zk \
--discovery-token-ca-cert-hash sha256:aeb530a1ee53667a603d53d9d9abe12a32009b9f432b0fbca40fa1116c1fcc46
4. 쿠버네티스 구성 확인
마스터 노드(control-plane 노드)에서 kubectl get nodes 로 node 정보를 확인합니다. 아래와 같이 조회되면 정상입니다.
STATUS 가 모두 Ready 상태여야 합니다.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 10h v1.23.6
worker-1 Ready <none> 9h v1.23.6
worker-2 Ready <none> 2m40s v1.23.6
5. kubectl 예제
kubectl get 명령어로 클러스터를 구성하고 있는 node 정보를 볼 수 있습니다.
## node 정보조회
$ kubectl get nodes
## node 정보 상세조회
$ kubectl get nodes -o wide
컨테이너를 실행하면서 kubectl 명령어 사용하기
아래 명령어는 nginx 최신 버전의 이미지로 webserver 라는 이름의 pod를 생성하고 실행하라는 내용입니다.
$ kubectl run webserver --image=nginx:latest --port 80
pod/webserver created
생성된 pod를 확인합니다. 아래 내용을 보면 현재 상태가 container creating 인 것을 확인할 수 있습니다. pod가 정상적으로 생성완료되면 running으로 상태가 변경됩니다. 현재 진행되는 상태를 보려면 kubectl describe pods 명령어를 수행합니다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 0/1 ContainerCreating 0 23s
## pods 정보 확인
$ kubectl get pods webserver -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
webserver 1/1 Running 0 49m 10.44.0.1 node-1 <none> <none>
## pods 상태 상세확인
$ kubectl describe pods webserver
## 실행결과
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 57s default-scheduler Successfully assigned default/webserver to node-1
Normal Pulling 56s kubelet Pulling image "nginx:latest"
Normal Pulled 48s kubelet Successfully pulled image "nginx:latest" in 8.496066344s
Normal Created 48s kubelet Created container webserver
Normal Started 48s kubelet Started container webserver
node-1에서 10.44.0.1 IP로 nginx 웹서버가 작동하고 있는 것을 확인할 수 있습니다.
컨테이너 확인하기
curl 명령어로 위에서 생성한 nginx pod 가 정상 동작하는지 확인해 봅니다.(참고. elinks(이링크스)라는 유닉스 기반 운영 체제를 위한 텍스트 기반 콘솔 웹 브라우저로 웹 페이지를 확인할 수 있습니다.)
curl 10.44.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
....
kubectl create 명령어
파일 또는 표준 입력에서 리소스를 생성합니다. JSON and YAML 형식의 파일을 사용할 수 있습니다.
usage:
kubectl create deployment NAME --image=image -- [COMMAND] [args...] [options]
kubectl create deployment mainui --image=httpd:latest --replicas=3
생성된 pod를 확인합니다.
1) kubectl get deployment.apps 명령어로 확인
kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
mainui 3/3 3 3 46s
2) kubectl get pods 명령어로 확인
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mainui-7bdb5f79fb-4qvhc 1/1 Running 0 3m29s
mainui-7bdb5f79fb-btblc 1/1 Running 0 3m29s
mainui-7bdb5f79fb-nrdv5 1/1 Running 0 3m29s
webserver 1/1 Running 0 128m
배포한 웹서버의 웹페이지 변경하기
kubectl exec 명령어로 위에서 생성한 webserver pod의 웹페이지를 변경해 봅니다.
kubectl exec 명령어는 동작중인 컨테이너의 셸에 접근할 수 있도록 해주는 명령어입니다.
kubectl exec --stdin --tty webserver -- /bin/bash
또는
kubectl exec -it webserver -- /bin/bash
## 실행결과(컨테이너에 접속됨)
root@webserver:/#
nginx 웹페이지는 /usr/share/nginx/html 디렉토리에 있습니다. index.html 파일이 웹서버의 첫 웹페이지입니다.이 웹페이지를 원하는 내용으로 변경하고 curl이나 elinks 로 변경된 내용을 확인합니다.
# cat > index.html
NGINX 웹서버입니다.
ctrl + D 를 클릭하여 저장합니다.
# exit
$ curl 10.44.0.1
NGINX 웹서버입니다.
nginx log도 확인해 봅니다. nginx log는 컨테이너의 /var/log/nginx 밑에 access.log, error.log 파일입니다.
$ kubectl logs webserver
...
10.32.0.1 - - [05/May/2022:16:27:14 +0000] "GET / HTTP/1.1" 200 615 "-" "ELinks/0.13.1 (textmode; Linux 5.13.0-1024-gcp x86_64; 153x16-2)" "-"
10.44.0.0 - - [05/May/2022:18:15:45 +0000] "GET / HTTP/1.1" 200 29 "-" "curl/7.68.0" "-"
10.44.0.1 - - [05/May/2022:18:16:20 +0000] "GET / HTTP/1.1" 200 29 "-" "curl/7.74.0" "-"
이제 외부에서 pod에 접속할 수 있도록 port-forward 명령어를 사용합니다.
아래 명령어는 외부에서 8080으로 접속하면 pod의 80 port로 forwarding 하는 예시입니다.
$ kubectl port-forward --address=0.0.0.0 webserver 8080:80
다른 서버에서 curl 명령어를 사용하여 웹서버 페이지를 호출해 봅니다.
$ curl http://10.10.1.35:8080
NGINX 웹서버입니다
위에서 생성한 mainui pod의 개수를 3개에서 kubectl edit 명령어로 변경해 봅니다.
아래 명령어를 수행하면 mainui pod에 대한 설정값을 vi 에디터로 불러옵니다. 여기서 변경하고자 하는 값을 변경하면 됩니다. 본 문서에서는 replicas를 3개에서 5개로 변경해 보겠습니다. 변경 후 :wq 로 저장하고 vi 에디터를 빠져나옵니다.
kubectl edit deployments.app mainui
....
spec:
progressDeadlineSeconds: 600
replicas: 5
...
pod 갯수가 변경되었는지 확인합니다. 아래와 같이 mainui pod가 5개로 변경된 것을 볼 수 있습니다.
kubectl get pods
## 실행결과
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mainui-7bdb5f79fb-4qvhc 1/1 Running 0 76m
mainui-7bdb5f79fb-8t9r9 1/1 Running 0 2m23s
mainui-7bdb5f79fb-btblc 1/1 Running 0 76m
mainui-7bdb5f79fb-nrdv5 1/1 Running 0 76m
mainui-7bdb5f79fb-q6nlg 1/1 Running 0 61s
webserver 1/1 Running 0 3h20m
pod 생성할 내용을 파일로 생성해 봅니다.
--dry-run 플래그를 사용하여 실제로 제출하지 않고 클러스터로 보낼 오브젝트를 미리 볼 수 있습니다.
리다이텍션으로 파일로 저장할 수도 있습니다.
kubectl run webserver --image=nginx --port 80 --dry-run=client -o yaml > webser.yaml
yaml 파일로 pod를 생성합니다. 기존에 생성한 이름과 동일한 pod를 생성하므로 기존 pod를 삭제한 후 실행합니다.
## 기존 webserver pod 삭제
$ kubectl delete pod webserver
## yaml 파일로 pod 생성
$ kubectl create -f webserver.yaml
## 생성된 pod 확인
$ kubectl get pods
[참고] kubectl create vs apply
kubectl create
kubectl create는 명령형 관리를 위한 것입니다. 이 접근 방식에서는 생성, 교체 또는 삭제하려는 항목을 Kubernetes API에 알립니다. 간단히 말해서 create는 새 객체를 생성합니다. 리소스가 이미 있는 경우 오류가 발생합니다.
kubectl apply
kubectl apply는 다른 변경 사항을 개체에 적용하더라도 라이브 개체에 적용했을 수 있는 변경 사항(즉, 규모를 통해)이 "유지 관리"되는 선언적 관리 접근 방식의 일부입니다.
apply는 우리가 필요로 하는 것을 정의함으로써 기존 객체를 점진적으로 변경합니다. 리소스가 이미 있는 경우 오류가 발생하지 않습니다.
pod 삭제
예제) kubectl delete pods <pod> : <pod> 부분에 삭제할 pod 이름을 입력합니다.
kubectl delete pods webserver
'쿠버네티스' 카테고리의 다른 글
쿠버네티스 - play with k8s (0) | 2022.10.20 |
---|---|
CKA 자격증 취득하기 - 시험예상 문제 (0) | 2022.06.09 |
쿠버네티스 보충 (0) | 2022.06.08 |
CKA 자격증 취득하기 #2 (0) | 2022.05.23 |
CKA 자격증 취득하기 #1 (0) | 2022.05.18 |