https://blog.wonizz.tk/2019/08/16/kubenetes-install-guide/
Kubeadm을 사용하여 Kubernetes 클러스터를 구성하는 방법에 대해 설명한다.
K8s는 Worker Node에 명령을 내리는 Master Node와 실제 Container가 구동되는 Wokre Node로 구성되어 있다.
기본적으로 쿠버네티스는 컨테이너를 클러스터링 해주는 도구이다보니, 도커가 사전에 설치되어 있어야 한다. 또한, 마스터와 워커노드가 준비되어 있어야 한다.
swapoff -a # paging 과 swap 기능을 끕니다.
echo 0 > /proc/sys/vm/swappiness # 커널 속성을 변경해 swap을 disable 합니다.
sed -e '/swap/ s/^$*/$/' -i /etc/fstab #Swap을 하는 파일 시스템을 찾아 disable 합니다.
systemctl disable firewalld
systemctl stop firewalld
modprobe br_netfilter
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
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
exclude=kube*
EOF
yum
을 통한 설치yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
kubeadm init
#그럼 설치가 진행되고 마지막에 다음과 비슷한 로그가 출력된다.
Your Kubernetes master has initialized successfully!
kubeadm
: 클러스터를 부트스트랩하는 명령이다. 쿠버네티스에서 제공하는 기본적인 도구이며, k8s 클러스터를 가장 빨리 구축하기 위한 다양한 기능을 제공한다.
kubelet
: 각 노드에서 실행되는 기본Node Agent
이다.api-server
와 통신하며,PodSpec
을 사용해PodSpec
에 기술된 컨테이너들이 정상적으로 작동되도록 돕는다. 관리자가Pod
를 배포하려고 할 경우,api-server
를 비롯한 컨트롤 플레인의 컴포넌트들은 명령에 대한 인기 및 인증을 수행하고, 선언된 상태와 일치하지 않는Pod
가 있는지 확인하고, 어떤Node
에Pod
를 배치하면 좋을지 결정한다. 어디에 배치할지는Master Node
의 컴포넌트들 정확히는Scheduler
가 결정하지만 실제로Container runtime
에 배치를 명령하는 것은Kubelet
의 역할이다. 만약,Worker Node
에서 동작중인Kubelet
이 정지되면 컨테이너 런타임에 요청을 보내는 역할을 수행하는 컴포넌트가 정지되었으므로Pod
생성, 삭제 등이 해당Node
에서 정상적으로 수행되지 않는다.
참고:[Worker Node] Kubelet
kubectl
: 쿠버네티스 클러스터에 명령을 내리는 CLI(Command Line Interface)이다.
명령어:kubectl [COMMAND][TYPE][NAME][FLAGS]
- COMMAND: create, get, describe와 같이 하나 혹은 여러개의 리소스에 대한 operation 종류를 선언한다.
- TYPE: resource type에 대해 선언한다.
- NAME: 특정 리소스의 이름을 선언한다.
- FLAGS: 추가적인 OPTION 선언
api-server
: 마스터 노드의 중심에서 모든 클라이언트, 컴포넌트로부터 오는 요청을 전부 받아낸다.
- api서버 주소 확인:
kubectl cluster-info
마스터 노드가 활성화 되면 아래의 로그가 출력된다.
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
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/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec
여기서 일반 사용자가 kubectl
을 사용할 수 있도록 로그 중간에 있는 명령어를 복사해서 실행한다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec
해당 커맨드를 복사하지 않고 지워진 경우에 다음과 같이 토큰의 확인이 가능하다.
kubeadm token list
해당 토큰은 24시간 동안만 사용이 가능하다. 새로운 토큰이 필요한 경우 다음 명령어를 실행한다.
kubeadm token create
쿠버네티스 설치 완료 후 다음 명령어로 확인한다.
CNI를 설치하면 CoreDNS Pod 가 정상적으로 동작하게 된다. 다음 명령어로 각 노드와 상태를 확인할 수 있다.
kubectl get no
다음 명령어로 쿠버네티스의 구성 요소가 모두 동작하는 것을 확인할 수 있다.
kubectl get componentstatuses
간다한 Pod를 배포해서 동작을 확인한다. 아래와 같은 pod-test.yaml
파일을 생성한다.
apiVersion: apps/v1beta1
kind: Deployment
metadata:
# Deployment 객체의 Unique한 명칭
name: deployment-example
spec:
# Deployment label selector for pod
selector:
matchLabels:
app: nginx
# 2 Pods should exist at all times.
replicas: 2
template:
metadata:
labels:
# Pod의 라벨
app: nginx
spec:
containers:
- name: nginx
# Run this image
image: nginx:1.10
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
run: nginx-svc
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
protocol: TCP
selector:
app: nginx
deployment 안에 pod를 배포하기 위한 내용들을 기입하였다.
아래의 spec대로 2개의 replica를 생성하기 때문에 pod는 아래와 같이 생성된다.
containers:
- name: nginx
image: nginx:1.10
service
는 로드밸런스의 기능을 하는데, 그 타입이 3종류(ClusterIP,noteType,DNS)가 있다.
8080포트로 접속이 되면, target(nginx)의 pod으로 80포트로 분산하겠다라는 내용의 서비스이다.
ports:
- port: 8080
targetPort: 80
protocol: TCP
selector:
app: nginx