목차
- 쿠버네티스 설치 실습
- Load balancer인 haproxy 설치, 설정
- Kubeadm 설치
- kubeadm, kubelet 및 kubectl 설치
- 설치 완료 후
- Kubectl?
- 인증서
- 팁
쿠버네티스 설치 실습
Load balancer인 haproxy 설치, 설정
# sudo setenforce 0
# sudo yum install haproxy -y
# sudo vi /etc/haproxy/haproxy.cfg
frontend kubernetes-master-lb
bind 0.0.0.0:16443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
option tcplog
server master1 <vm instance ip>:6443 check
server master2 <vm instance ip>:6443 check
server master3 <vm instance ip>:6443 check
설정을 해줬으니 haproxy를 reload후 재시작합니다
# sudo systemctl daemon-reload
# sudo systemctl restart haproxy
16443 포트가 Listen 중인지 확인
# sudo netstat -nltp
haproxy 설치 완료!
이제 16443 포트로 와서 Load balancing이 될 것입니다.
Kubeadm 설치
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- 설치 전,
- 리눅스 기반, 2GB Ram, 2 CPU 이상의 성능
- SWAP 미사용 (카카오 기본 이미지에 SWAP 미설정됨)
- 고유한 hostname, MAC, UUID, 포트 개방, 네트워크 연결
[전체 노드] # hostname 으로 hostname 확인 후 /etc/hosts 에 반영 (worker도)
hostname을 치면 아래와 같이 나옵니다. 이제 이것을 /etc/hostname에 넣어줍니다.
# sudo vi /etc/hosts
나머지 노드에도 모두 적용합니다.
- MAC 주소 및 UUID가 고유한지 확인
- 네트워크 어댑터 확인
- 카카오 내 VM은 1개만 이므로 관계없음
- [전체 노드] br_netfilter 모듈 로딩 : 리눅스 노드의 iptables가 브리지 된 트래픽을 올바르게 보기 위한 요구 사항
모든 노드에 적용합니다.
- 주요 포트 확인
- 외부에서 쿠버네티스 API를 접근 시 6443 포트 사용
- [전체 노드] CRI (Container runtime interface) 설치 필요 : Docker 설치/시작
# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(모든 노드에 적용)
# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
(cat /etc/yum.repos.d/docker-ce.repo 로 확인)
(동일하게 모든 노드에 적용)
# sudo yum install docker-ce -y
(동일하게 모든 노드에 적용)
Configuring the container runtime cgroup driver
Configuring the kubelet cgroup driver
# sudo vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdr iver=systemd
(동일하게 전체 노드에 적용)
새롭게 설정했으므로 reload 합니다
# sudo systemctl daemon-reload
# sudo systemctl start docker && sudo systemctl enable docker
(start : 프로세스 실행 , enable : 도커를 저절로 실행되게 끔 자동실행)
(정상 작동 시 Created symlink...)
(동일하게 모든 노드에 적용)
도커 설정 확인
# sudo docker info | grep -i cgroup
kubeadm, kubelet 및 kubectl 설치
[전체 노드] Redhat 배포판 버전으로 따라 하기
permissive로 변경하기 위해 아래와 같이 설정합니다.
# sudo setenforce 0
# sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[전체 노드] 단, kubelet / kubeadmin / kubectl 은 최신보다 한 단계 낮은 버전으로 설치 (향후 교육과정 고려)
# sudo yum info kubelet --disableexcludes=Kubernetes -y
# sudo yum install kubelet-1.21.0 --disableexcludes=kubernetes -y
# sudo yum install kubectl-1.21.0 --disableexcludes=kubernetes -y
# sudo yum install kubeadm-1.21.0 --disableexcludes=kubernetes -y
# sudo systemctl enable --now kubelet
앞에서 도커의 cgroup driver를 systemd로 설정했기에, 쿠버도 마찬가지로 설정
# sudo vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 내에
[Service]
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd --runtime-cgroups=/systemd/system.slice --kubeletcgroups=/systemd/system.slice"
daemon reload, kubelet restart 수행.(모든 노드)
이제 필요한 패키지는 모두 설치 완료. 클러스터를 만들어야 함
[컨트롤 첫 번째만] (etcd가 함께 포함된) Stack Control node 설치
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
Stacked control plane and etcd nodes
sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs
Your Kubernetes control-plane has initialized successfully!
정상적으로 생성되었습니다.
이 결과 메시지를 아래처럼 txt 파일 형태로 만들어 놓습니다.
[결과 메시지에 따라 이어서 진행]
[결과 메세지에 따라 진행]
(다른 마스터 노드 2,3에서 진행)
You can now join any number of the control-plane node running the following command on each as root: kubeadm join
Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use "kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root: (워커 노드 1,2에서 진행)
마스터 노드
위의 master-01 노드에서 복사해서
아래의 master-02 노드에 루트 권한으로 접근해 붙여넣기 합니다.(master-03 노드도 동일)
붙여 넣기 후 아래의 세 문장을 입력합니다
워커 노드
master-01 노드에 있었던 명령어를 복사해서
루트권한으로 worker 노드에 붙여 넣기 합니다.
kubectl get nodes 명령어로 설치가 된 것을 확인할 수 있습니다.
설치 완료!!!
설치 완료 후
Kubectl?
- Kubectl 은 쿠버네티스 클러스터를 제어하기 위한 커맨드 라인 도구
kubectl [command] [TYPE] [NAME] [flags]
- command : 명령을 하려는 '동사', 예: create, get, describe, delete
- TYPE : 리소스 타입
- NAME : 리소스 이름
- flags : 선택적 옵션
kubectl help를 사용하여 command를 확인 가능 (-- help)
kubectl에서 자주 사용하는 output flag는 -o wide, -o yaml, -o json, --sort-by=<jsonpath_exp> 등
--dry-run=client -o yaml > filename.yaml
인증서
Preflight-check가 완료되면 kubeadm은 CA(자체 인증) 파일과 키를 생성
pki => public key infrastructure
.crt => 서버 인증서
.key => 서버 개인키
팁
자동 완성 설정 : https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-bash-completion
Bash
sudo yum install -y bash-completion
source /usr/share/bash-completion/bash_completion # bash-completion 패키지를 먼저 설치 후, bash의 자동 완성 셸에 설정
echo "source <(kubectl completion bash)" >> ~/.bashrc # 자동 완성을 bash 셸에 영구적으로 추가
kubectl completion bash >/etc/bash_completion.d/kubectl # root 권한으로 실행
Reference
https://classlion.net/class/detail/21
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] APIs and Access(1) (0) | 2021.10.25 |
---|---|
[Kubernetes] Kubernetes Architecture(4)[쿠버네티스 리소스 : 컨트롤러 오브젝트, 로드밸런서 오브젝트, 스토리지 오브젝트] (0) | 2021.10.23 |
[Kubernetes] Kubernetes Architecture(3)[쿠버네티스 리소스 : 워크로드 오브젝트] (0) | 2021.10.20 |
[Kubernetes] Kubernetes Architecture(1) (0) | 2021.10.18 |
[Kubernetes] 쿠버네티스(Kubernetes)란 무엇인가? (0) | 2021.10.18 |