kubectl get service -n kube-system
회사에서 업무 테스트를 위해 쿠버네티스를 구성해야 되는 일이 생겨서 구글링을 하면서 따라하다가...
하라는데로 하는데 안되서 삽질을 하다가 혹시 나중에 참고하기 위해 포스팅 합니다.
도커도 개념만 알고 쿠버네티스도 어떻게 나온제품인지만 알고 사용도 안해봤기 때문에 무작정 따라하기에만 좋고 트러블슈팅은 해드릴수가 없습니다.
이 글을 보고 따라하시는 분들은 가상환경에서 하시고 꼭 스냅샷을 찍어두세요...꼭!!!!ㅠㅠ
이 글은 삽질하다 다음 포스터들을 보고 설치한 내용입니다.
https://www.cubrid.com/blog/3820603
https://zunoxi.github.io/devops/2020/04/27/devops-k8s-install-k8s/
두 블로그에 설명이 잘되어 있어서 큰 도움이 되었습니다.
1. 작업환경
kvm에 centos7 release 7.9.2009 를 사용하여 OS를 설치하였습니다.
사양 | |
vCPU | 2 |
MEM | 2048 MB |
디스크 | 60 GB |
디스크는 실사용 목적이 아닌 테스트 목적이여서 크게 신경 안쓰고 적용하였습니다.
쿠버네티스는 서버가 최소 2대가 필요합니다.
Master - 1대
Worker - 1대
하지만 대부분의 글에 3대로(Master 1대, Worker 2대) 되어 있길래 저도 3대로 구성하였습니다.
2. OS 기본 세팅
OS 기본 세팅에는 호스트네임, selinux, 방화벽 등 기본 세팅을 진행합니다.
(master 서버 구성 후 가상환경 복사를 해도 되기때문에 master 노드에서만 실행하셔도 됩니다.)
2-1. hostname
각 서버별로 설정해줍니다.
아래 명령을 실행 후 hostname 명령을 치면 설정된 것을 확인 가능합니다.
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-worker1
hostnamectl set-hostname k8s-worker2
2-2. /etc/hosts
ip는 사용하시는 ip로 변경해주세요. hostname 부분도 바꾸셨으면 변경해서 추가하시면 되요.
cat << EOF >> /etc/hosts
192.168.0.127 k8s-master
192.168.0.128 k8s-worker1
192.168.0.129 k8s-worker2
EOF
2-3. selinux
seliinux는 permissive로 세팅해 줍니다.
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sestatus
2-4. 방화벽
CentOS7 에서는 firewalld를 사용합니다. firewalld를 끄고 진행해도 되지만 firewalld 를 설정합니다.
2-4-1. 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
2-4-2. Worker 노드
firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
firewall-cmd --reload
2-4-3. pod network add-on(Master, Worker)
firewall-cmd --permanent --zone=public --add-port=179/tcp
firewall-cmd --reload
2-5. SWAP
Master, Worker 노드 모두 swap을 꺼줘야합니다.
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
2-6. iptable 커널 옵션
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
2-7. 쿠버네티스 Yum Repositotu 설정
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
3. Docker 설치
쿠버네티스는 Docker를 기반으로 하기 때문에 쿠버네티스 설치 전 docker를 설치해줘야합니다.
전 docker와 kubernetes를 마지막 버전으로 설치했더니 오류가 나서 버전을 정해서 설치하겠습니다.
- | 버전 |
Docker | 18.06.2.ce |
kubernetes | 1.15.5 |
3-1. docker 설치에 필요한 Yum Package 설치
yum install -y yum-utils device-mapper-persistent-data lvm2
3-2. Docker CE Repositoty 추가
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3-3. Docker-ce 설치
yum install docker-ce-18.06.2.ce
4. Kubernetes 설치
1
4-1. kubelet, kubeadm, kubectl 설치
yum install -y --disableexcludes=kubernetes kubeadm-1.15.5-0.x86_64 kubectl-1.15.5-0.x86_64 kubelet-1.15.5-0.x86_64
여기까지 설치하고 가상환경에서 master 노드를 복사해서 worker노드들을 만들어 주고,
hostname과 firewalld 설정을 worker 노드용으로 설정해주시면 됩니다.
5. Master node 설정
5-1. Docker 실행
systemctl daemon-reload
systemctl enable --now docker
5-2. Kubernetes 실행
systemctl enable --now kubelet
저는 여기서 삽질을 했습니다.
kubelet이 잘 실행 되었나 확인을 하는데 계속 오류가 나서 해결해 볼려고 별 삽질을 다했는데....
다 지우고 다른 버전으로 설치해보고 하다가 이 포스팅 글에 있는 버전으로 설치하고
이 다음에 실행하는 kubeadm init을 실행하니 정상 실행이....
(눈물ㅜㅠ..공부가 더 필요한 부분이네요.
우선 머리가 아파서 이 버전으로 쭉 진행하고 있습니다.)
5-3. Kubernetes 초기화 실행
kubeadm init으로 쿠버네티스 클러스터를 구축합니다.
kubeadm init --pod-network-cidr=172.16.0.0/16
쿠버네티스 초기화가 정상적으로 진행되면 다음과 같이 나옵니다.
마지막에 있는 kubeadm join을 잘 적어두셔야 worker 노드에 사용 할 수 있습니다.
쿠버네티스 초기화 후 정상 동작하는 kubelet의 모습
5-4. Regular user 설정
이 부분을 해줘야 root 계정으로 kubectl을 사용 할 수 있습니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6. Worker node 설정
6-1. Docker 실행
systemctl daemon-reload
systemctl enable --now docker
6-2. Kubernetes 실행
systemctl enable --now kubelet
6-3. Kubernetes 노드 연결
Master 노드에서 kubeadm init 을 하고 나온 마지막 kubeadm join을 넣어줍니다.
kubeadm join 192.168.0.127:6443 --token `~~~1 \
--discovery-token-ca-cert-hash sha256:21312312313213123123213123
6-4. Master 노드에서 Worker 노드 확인
kubectl get nodes
7. Kubernetes Master Node 네트워크 설정
아래 명령어를 치면 Coredns가 pending 상태인 것을 확인 할 수 있다.
kubectl get pods -n kube-system
kubectl get pods --all-namespaces
7-1. Calico 설치
쿠버네티스의 pod network add-on 중 하나인 Calico설치
curl -O https://docs.projectcalico.org/v3.9/manifests/calico.yaml
sed s/192.168.0.0\\/16/172.16.0.0\\/16/g -i calico.yaml
kubectl apply -f calico.yaml
설치가 완료되고 아래 명령어로 확인하면 calico가 PodInitializing, ContainerCreating으로 나오고 몇분이 지나면 모두 Running으로 나온다.
kubectl get pods -n kube-system
kubectl get pods --all-namespaces
7-2. DashBoard 설치
이 부분은 Cubrid 블로그의 부분을 그대로 사용했습니다.
kubectl proxy 없이 Dashboard에 직접 접속하기위해 유효한 인증서를 사용하여 보안 HTTPS연결을 설정해야 한다.
7-2-1. 인증서 생성
mkdir ~/certs
cd ~/certs
openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
openssl req -new -key dashboard.key -out dashboard.csr
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
7-2-2. Recommended setup
kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
7-2-3. Dashboard 서비스를 NodePort 방식으로 변경
Dashboard 서비스를 NodePort 방식으로 변경하면 'kubectl proxy' 없이 NodePort를 통해서 직접 접속할 수 있습니다.
kubectl edit service kubernetes-dashboard -n kube-system
7-2-4. Dashboard 접속정보 확인
kubectl get service -n kube-system
7-2-5. Dashboard 계정 생성
kubectl create serviceaccount cluster-admin-dashboard-sa
kubectl create clusterrolebinding cluster-admin-dashboard-sa --clusterrole=cluster-admin --serviceaccount=default:cluster-admin-dashboard-sa
7-2-6. Dashboard 접속 시 필요한 계정 토큰 정보 확인
kubectl get secret $(kubectl get serviceaccount cluster-admin-dashboard-sa -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
여기서 나오는 토큰을 복사해줍니다.
7-2-7. Dashboard 접속 확인
같은서버라면 https://localhost:31055 로 하면 접속이 되고 외부접속이라면 https:/ip:31055로 하면 접속이 됩니다.
여기까지 쿠버네티스 구성부터 대쉬보드까지 구성해보았습니다.
사용방법은 좀 나중에 테스트 해보고 포스팅하겠습니다.
'소프트웨어 > Linux' 카테고리의 다른 글
[yum][Errno 14] curl#6 - "Could not resolve host: ; 알 수 없는 오류" (0) | 2022.08.10 |
---|---|
ntfs usb 마운트하기 (0) | 2022.02.03 |
[redhat8]xrdp-윈도우에서 원격으로 리눅스 접속 (0) | 2021.03.09 |
[레드햇]Subscription-manager register 오류 시 (2) | 2020.10.21 |
[centOS]XRDP-윈도우에서 원격으로 리눅스 접속 (1) | 2020.05.20 |