본문 바로가기
Delvelopment/Self-MSA구축기

GCP(Google Cloud Platform) 로 쿠버네티스 설치 및 Docker 클러스터 구성하기

by 제제킴 2019. 12. 8.
반응형

 

Kubernetes 가이드 문서

https://kubernetes.io/ko/docs/concepts/overview/components/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

인스턴스 기본 사양

 

- Master Node 최소 사양 - CPU 2 Core , RAM, 2G

- Workder Node 최소 사양 - CPU 1 Core, RAM 1G

 

1. 인스턴스 생성하기.

- 나는 CentOS 7 로 셋팅할 계획이다. 

- Master Node는 CPU 2Core 로 생성!!!

 

 

- 3개의 인스턴스를 생성한다. 

 (Master, Workder 2개 )

 

 

- 생성을 완료 했으니. SSH 통신방법으로 서버에 접근을 해보자.

 

컬럼명이 "연결" 하단 SSH 옆 버튼을 누르면 "브라우저 창에서 열기" 가 있다. 선택.

 

 

CentOS7 에 Kubernetes 설치

 

각 인스턴스 Centos7 의 passwd 변경 

sudo passwd
새비밀번호
새빌밀번호 검증

권한이 없다면 (https://dev-jj.tistory.com/5) 참고.

 

GCP, AWS, NCP root 계정 ssh접속 권한 부여.

클라우드 서비스를 이용하다보면 root 권한으로 작업해야 가장 편하다. GCP 는 사용자 계정을 바로만들어버려서 root 권한을 풀어줘야한다. 방법은 간단하다 계정 패스워드 설정 sudo passwd (새 비밀번호 입력) r..

dev-jj.tistory.com

각 인스턴스 hostname 변경

hostnamectl set-hostname master-1
비밀번호 입력.

hostnamectl set-hostname work-1

hostnamectl set-hostname work-2



cat << EOF >> /etc/hosts

(마스터IP) master-1
(Work-1 IP) work-1
(Work-2 IP)  work-2
EOF

위 IP는 환경에 맞게.

 

 

Docker(도커) 설치

참고 문서 https://docs.docker.com/install/linux/docker-ce/centos/

 

Get Docker Engine - Community for CentOS

To get started with Docker Engine - Community on CentOS, make sure you meet the prerequisites, then install Docker. Prerequisites Docker EE customers To install Docker Enterprise Edition (Docker EE),...

docs.docker.com

참고.  (https://linoxide.com/linux-how-to/how-to-install-docker-on-centos/).

반응형
yum install -y yum-utils device-mapper-persistent-data lvm2

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

-도커 버전 확인
yum list docker-ce --showduplicates | sort -r
 
-도커 설치. ( 버전은 꼭 쿠버네티스가 지원하는 버전으로 )
yum install docker-ce 
위 명령어로 에러가 뜬다면. 아래 명령어를 입력.
( dnf -y  install docker-ce --nobest)
OR
도커 버전 선택 설치.
yum install -y docker-ce-18.06.3.ce

도커 실행
systemctl enable --now docker

도커를 확인하고 싶다면 아래명령어.
systemctl status  docker

도커가 설치  되고 상태를 확인하기 위해 명령어를 입력하게 되면 아래와 같이 나타난다.

 

 

Kubeadm 설치

 

CentOS SElinux 설정이 필요하다.

(enforce, permissive, disable 세 가지 모드가 있으며 RHEL/CentOS 를 설치하면 default 로 enforce mode 로 동작하며 SELinux 의 rule 에 어긋나는 operation 은 거부된다.)

 

현재 SELinux 동작 모드 확인 명령어

sestatus

 

Current Mode 를 permissive로 변경.

setenforce 0

sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

 

iptable 설정. 

/bin/su -c "echo 'net.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.d/k8s.conf"
/bin/su -c "echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.d/k8s.conf"

명령어 입력 후 위 반영사항 확인.
sysctl --system

 

Firewalld 비활성화.

sudo systemctl stop firewalld
sudo systemctl disable firewalld

OR

Master node 
sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10251/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10252/tcp
sudo firewall-cmd --reload


Work Node
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
sudo firewall-cmd --reload



pod network add-on
sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
sudo firewall-cmd --reload

reoo

Swap OFF

sudo swapoff -a

 

서버 재시작

sudo reboot

 

쿠버네티스 repo  설정

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

OR

vim /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*

-----------------------------
kubeadm 설치
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

------------------------------
부팅 시 kubelet 자동시작 설정 // 실행
systemctl enable kubelet && systemctl start kubelet




 

kubeadm init Master Node

 kubeadm init --apiserver-advertise-address=0.0.0.0

 

 

에러가 발생했다.. ㅠㅠ 

 

[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

[WARNING FileExisting-tc]: tc not found in system path

 

ㅠㅠ.... 이렇게 3시간이라는 시간을 삽질을..

 

쿠버네티스에서 지원하는 Docker 버전이 일치하지 않았다, 또한 api ip에 말썽이 있었다.

그리고  kubeadm init --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=0.0.0.0 이 명령어를 사용안하고 내 IP를 이용했다.

 

만약.. 하다가 잘안된다면 몇가지 명령어를 찾게 될거다..

리셋...
kubeadm reset   

중단
systemctl stop kubelet

https://codeday.me/ko/qa/20190720/1109597.html

 

설치완료 ㅠㅠ 하단 명령어 대로 디렉토리와 파일을 복사한다..

 

 

상태 조회.

kubectl get pods -n kube-system

kubectl get pods --all-namespaces

 

pod network add-on이 설치되어 있지 않은 상태에서는 CoreDNS가 아직 시작되지 않은 상태를 확인할 수 있다.

 

--상태

systemctl status kubelet

-- 로그

journalctl -xefu kubelet

 

  Kubernetes 환경에서 Pod들이 통신하려면 pod network add-on이 있어야 합니다. pod network add-on이 설치되기 전에는 CoreDNS가 시작되지 않습니다. 'kubeadm init' 이후에 'kubectl get pods -n kube-system' 명령어로 확인해보면 CoreDNS가 아직 시작되지 않은 상태를 확인할 수 있습니다. (https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)

 

만약 하다가 잘안된다면 쿠버네티스 공홈을 참고하자.

 

따라서 우리는 Calico 를 사용합시다.

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

드디어 All Running

모두 Running 중이다!!!

 

 

kubeadm Join

이제 Worker 노드들을 추가해보자.

Work 노드에 kubeadm 까지 설치 한다..

 

 

해당 명령어를 입력했을때. (Master 노드)

kubeadm init --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=0.0.0.0

하단에 아래 와 같은 조인 문법이 하나가 생성된다.

kubeadm join 10.146.0.10:6443 --token 9wmpej.uazb3oemhgee1mba \
    --discovery-token-ca-cert-hash sha256:16aea0ce55363be1a609f4ca162d412c0a8c3eaca482e5ff02cea0d10e86824e

위 명령어를 Work 노드에 실행한다.

Work 노드를 Master 노드에 추가완료!

 

노드 조회
kubectl get nodes

클러스터 정보 조회
kubectl cluster-info


kubectl get pods --all-namespaces

 

 

자식 노드들 까지 클러스터를 이루게 되었다.

 

Kubernetes Dashboard 설치하자.

Dashboard 설치 방법 참고. https://github.com/kubernetes/dashboard

 

Kubernetes Dashboard 설치 방법에는 Recommended setup과 Alternative setup 등 두 가지가 있다.

Alternative setup 설치 방법은 HTTPS를 사용하지 않고 HTTP를 사용하여 Dashboard에 접속하는 방법으로 권장하지 않습니다.

 

HTTPS 셋팅을 위해선 SSL 셋팅이 필요.

1234

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

 

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


kubectl edit service kubernetes-dashboard -n kube-system
아래 부분 수정.

ports:
- nodePort: 31055
   port: 443
   protocol: TCP
   targetPort: 8443
selector:
   k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}

 

Dashboard 접속정보 확인

kubectl get service -n kube-system

 

Dashboard 계정 생성

kubectl create serviceaccount cluster-admin-dashboard-sa

kubectl create clusterrolebinding cluster-admin-dashboard-sa --clusterrole=cluster-admin --serviceaccount=default:cluster-admin-dashboard-sa

 

Dashboard 접속시 필요한 토큰 정보 확인 (복호화 https://jwt.io/)

kubectl get secret $(kubectl get serviceaccount cluster-admin-dashboard-sa -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
eyJhbGciOiJSUzI1NiIsImtpZCI6Imh6enJ4MERNbHVralQ1blgzTjFzVWZfOXcxazB4RzhGR2xwSFBNUFNDcDgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImNsdXN0ZXItYWRtaW4tZGFzaGJvYXJkLXNhLXRva2VuLXhqd3oyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImNsdXN0ZXItYWRtaW4tZGFzaGJvYXJkLXNhIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNDA4NDJmZGYtYzQxMy00MmM2LWEwYjYtYmE1ZGVhZjRiNGVjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6Y2x1c3Rlci1hZG1pbi1kYXNoYm9hcmQtc2EifQ.MhjcFs22qvBHmAEKW2zOpgCT7vGqVnqMhwNDrJSmHEqVROqIkRLb9EPceupjgAeNoHIvk9t-PAi8oh9ZKV_CBrkLv_9Kwtw8B-FKtDz9ZodN-vLZr_LejT3dFJ1FOG0Ni73yfyAsigKgl82bBcZlC7mgQZowxXsUbprijEMBJmmFOqmUs8KdI5kk-YAQK9GGPAMuu9FtILTZTO_ZAphJXlamHQRXGp1AZ0mA1cwsrhied_V3jKAISo8sNAU-Z1X70Ow0QiqXJ2XcMumTwOSUZCPoHLrey2TWgdgGN41XUX3jZ1aU59k6k1bUwZT3Wqru3HRgVLL_dPADNp012Lnyjg[root@master certs

 

실행

kubectl proxy

localhost:포트번호 하면 실행된다...

 

근데 우리는 GCP라서 내부망이 아니잖아. 다시 셋팅을 해보자..

 

셋팅은 다음편에...

 

 

반응형

댓글