주요글: 도커 시작하기
반응형


Centos 7 버전에 쿠버네티스(kubernetes)를 설치하는 과정을 정리한다. 보다 자세한 내용은 다음 문서를 참고한다.

 

0. Centos 7 준비

쿠버네티스 테스트 용도로 세 개의 가상 머신을 준비했다. 각 가상 머신에 Centos 7을 설치했고 IP와 호스트 이름을 다음과 같이 설정했다.

  • 172.16.1.100 k8s-master
  • 172.16.1.101 k8s-node1
  • 172.16.1.102 k8s-node2
각 서버의 /etc/hosts 파일에도 위 내용을 추가했다.

[Centos 7 호스트 이름 변경 명령어]

hostnamectl을 사용하면 Centos에서 호스트 이름을 변경할 수 있다.

# hostnamectl set-hostname 호스트이름


1. 도커 설치

전체 서버에 도커를 설치한다. https://docs.docker.com/install/linux/docker-ce/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 install docker-ce


# systemctl start docker && systemctl enable docker


2. kubeadm 설치 준비

kubeadm을 설치하려면 몇 가지 준비를 해야 한다. 전체 서버에서 다음을 진행한다.


SELinux 설정을 permissive 모드로 변경


# setenforce 0


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


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


firewalld 비활성화


# systemctl stop firewalld

# systemctl disable firewalld


스왑 오프


스왑 끄기:

# swapoff -a


/etc/fstab 파일에 아래 코드 주석 처리:

#/dev/mapper/centos-swap swap                    swap    defaults        0 0


서버 재시작:

# reboot



3. 쿠버네티스 설치 준비

쿠버네티스 YUM 리포지토리 설정:

# 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


kubeadm 설치:

# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes


# systemctl enable kubelet && systemctl start kubelet



[쿠버네티스 구성 요소]

쿠버네티스를 구성하는 컴포넌트에 대해 알고 싶다면 https://kubernetes.io/ko/docs/concepts/overview/components/ 문서를 읽어보자. 이 문서를 빠르게 훑어보고 다음 내용을 진행하면 설치 과정에서 용어나 메시지를 이해하는데 도움이 된다.


4. 마스터 컴포넌트 설치

kubeadm init 명령으로 마스터 노드 초기화


kubeadm init 명령어를 이용해서 마스터 노드를 초기화한다. --pod-network-cidr 옵션은 사용할 CNI(Container Network Interface)에 맞게 입력한다. 이 글에서는 CNI로 Flannel을 사용한다고 가정한다.


# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.16.1.100

...생략

[addons] Applied essential addon: CoreDNS

[addons] Applied essential addon: kube-proxy


Your Kubernetes master 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


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 172.16.1.100:6443 --token yrc47a.55b25p2dhe14pzd1 --discovery-token-ca-cert-hash sha256:2a7a31510b9a0b0da1cf71c2c29627b40711cdd84be12944a713ce2af2d5d148



마스터 초기화에 성공하면 마지막에 'kubeadm join ....'으로 시작하는 명령어가 출력된다. 이 명령어를 이용해서 작업 노드를 설치하므로 잘 복사해 놓자.


환경 변수 설정

root 계정을 이용해서 kubectl을 실행할 경우 다음 환경 변수를 설정한다.


# export KUBECONFIG=/etc/kubernetes/admin.conf


CNI 설치

이 글에서는 Flannel을 설치한다. 설치 명령어는 다음과 같다.


# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml


각 CNI별 설치 명령어는 Creating a single master cluster with kubeadm 문서를 참고한다.


마스터 실행 확인


마스터를 설치했다. 다음 명령어를 실행해서 결과를 확인한다.


# kubectl get pods --all-namespaces

NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE

kube-system   coredns-86c58d9df4-78jbg             1/1     Running   0          9m3s

kube-system   coredns-86c58d9df4-q7mwf             1/1     Running   0          9m3s

kube-system   etcd-k8s-master                      1/1     Running   0          13m

kube-system   kube-apiserver-k8s-master            1/1     Running   0          13m

kube-system   kube-controller-manager-k8s-master   1/1     Running   0          13m

kube-system   kube-flannel-ds-amd64-zv8nc          1/1     Running   0          3m11s

kube-system   kube-proxy-xj7hg                     1/1     Running   0          14m

kube-system   kube-scheduler-k8s-master            1/1     Running   0          13m


5. 노드 컴포넌트 설치

kubeadm init 명령을 이용해서 설치할 때 콘솔에 출력된 메시지에 kubeadm join 명령어가 있었다. 이 명령어를 노드 컴포넌트로 사용할 서버에서 실행한다. 이 예에서는 k8s-node1 서버에서 아래 명령어를 실행했다.


# kubeadm join 172.16.1.100:6443 --token yrc47a.55b25p2dhe14pzd1 --discovery-token-ca-cert-hash sha256:2a7a31510b9a0b0da1cf71c2c29627b40711cdd84be12944a713ce2af2d5d148


첫 번째 슬레이브 노드 추가 후 마스터 노드에서 kubectl get nodes 명령을 실행해보자. master 역할을 하는 k8s-master 노드와 방금 추가한 k8s-node1이 노드 목록에 표시된다. 노드를 추가하자 마자 노드 목록을 조회하면 다음 처럼 아직 사용 준비가 안 된 NotReady 상태임을 알 수 있다.


[root@k8s-master ~]# kubectl get nodes

NAME         STATUS     ROLES    AGE   VERSION

k8s-master   Ready      master   18m   v1.13.2

k8s-node1    NotReady   <none>   30s   v1.13.2


k8s-node2 노드에서 두 번째 슬레이브 노드를 추가한 뒤에 다시 노드 목록을 살펴보자. 새로 추가한 노드가 목록에 보인다.


[root@k8s-master ~]# kubectl get nodes

NAME         STATUS     ROLES    AGE     VERSION

k8s-master   Ready      master   21m     v1.13.2

k8s-node1    Ready      <none>   3m28s   v1.13.2

k8s-node2    NotReady   <none>   15s     v1.13.2


kubectl cluster-info 명령어를 실행하면 클러스터 정보를 확인할 수 있다.


[root@k8s-master ~]# kubectl cluster-info

Kubernetes master is running at https://172.16.1.100:6443

KubeDNS is running at https://172.16.1.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy


To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


6. 클러스터 테스트

마스터와 슬레이브를 설치했으니 간단한 예제를 실행해보자.


luksa/kubia 도커 컨테이너 이미지를 이용해서 팟 만들기:


요즘 학습하고 있는 '쿠버네티스 인 액셕' 책의 예제로 테스트했다. 다음 명령을 실행하자.


# kubectl run kubia --image=luksa/kubia --port 8080 --generator=run-pod/v1

replicationcontroller/kubia created


이 명령은 도커 이미지(luksa/kubia)를 이용해서 쿠버네티스 배포 단위인 파드(pod)를 클러스터에서 실행한다. 참고로 luksa/kubia 이미지는 호스트 이름을 응답하는 간단한 웹 서버다.


파드가 포함한 컨테이너에 연결할 수 있도록 서비스를 생성한다.


[root@k8s-master ~]# kubectl expose rc kubia --type=LoadBalancer --name kubia-http

service/kubia-http exposed


kubectl get services 명령어로 생성한 서비스 정보를 보자. 내가 테스트한 환경에서는 LoadBalancer 타입 서비스가 클러스터 IP로 10.101.195.144를 사용하고 있다.


[root@k8s-master ~]# kubectl get services

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE

kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP          3h22m

kubia-http   LoadBalancer   10.101.195.144   <pending>     8080:31701/TCP   15s


쿠버네티스 클러스터를 설치한 서버에서 이 클러스터 IP를 이용해서 8080 포트로 연결해보자. 다음과 비슷한 결과가 나오면 쿠버네티스가 정상적으로 동작하고 있는 것이다.


# curl 10.101.195.144:8080

You've hit kubia-ckh8w




+ Recent posts