ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네이버 클라우드에 Kubernetes (k8s) cluster 구성하기 (Calico)
    NAVER Cloud 2018. 11. 30. 16:20

    Kubernetes 관련 다양한 매니지드 형태의 상품들을 클라우드 서비스에서 제공하고 있으나 VM 을 활용하여 Kubernetes Cluster 환경을 구성해 보았다. 

    CNI 는 Calico 를 사용한다. 


    1. 네이버클라우드플랫폼에서 VM 생성하기 

    총 4대의 서버를 생성한다. 1대는 cluster 설치 playbook 을 수행할 Ansible 서버이고 나머지 3대는 K8S master, node 서버로 구성한다. 

    ansible 수행은 서버가 아니라 PC 에서도 가능하다. 






    1-1) ACG (Security Group) 설정

    각 서버 별 용도에 맞게 ACG 룰을 설정한다. 


     Server

     Protocol

     Port

     용도

     Ansible

     TCP

     22

     SSH

     Master Node

     TCP

     22

     SSH

     TCP

     6443 

     Kubernetes API Server

     TCP

     2379-2380 

     etcd server client API 

     TCP

     10250 

     Kubelet API 

     TCP

     10251

     Kube-scheduler 

     TCP

     10252

     Kube-controller-manager

     TCP

     10255 

     Read-Only Kubelet API 

     Worker Node TCP  22  SSH 
     TCP 10250

     Kubelet API

     TCP 10255 Read-Only Kubelet API
     TCP 30000-32767

     NodePort Services



     

    1-2) VM 생성

    필요한 SPEC 에 맞게 각 용도 별 VM 을 생성한다. OS 는 CentOS 를 사용한다. 

    서버 생성 방법은 NCP 가이드 참고 ( http://docs.ncloud.com/ko/compute/compute-1-1-v2.html )


    1-3) Master / Worker Node 에 Public IP 할당하기

    Ansible 서버의 경우 포트 포워딩 설정해서 ssh 접속만 하면 되므로 Public IP 는 필요치 않다. 

    하지만 서비스 포트로 접근이 필요한 Master/Node 서버에는 Public IP 를 할당해야 외부에서 접근이 가능하다. 





    2. Ansible 설치하기


    2-1) ansible 서버의 ssh key 생성 및 master/node 서버에 key 복사

    ansible 서버에서 kubernetes cluster 설치를 위해 master/node 서버 접근 시 패스워드 입력 없이 접근하기 위해 ansible 서버의 키를 master/node 서버에 복사한다.


    ANSIBLE 서버에서 실행 (키 생성/키 복사)


    ssh-keygen

    cp id_rsa.pub root@$master/nodeIP:id_rsa.pub


    Master/Node 서버에서 실행 


    mkdir /root/.ssh (디렉토리가 있으면 생성하지 않아도 됨)

    cat id_rsa.pub >> /root/.ssh/authorized_keys



    2-2) ansible 패키지 설치


    yum install epel-release -y

    yum install ansible -y



    2-3) swapoff


    swapoff -a



    2-4) ip forward 설정


    sysctl -w net.ipv4.ip_forward=1



    2-4) Git clone kubespray


    git clone https://github.com/kubernetes-incubator/kubespray.git 

    cd kubespray 

    sudo pip install -r requirements.txt



    2-5) Python 3 설치


    sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm 

    sudo yum install -y python36u python36u-libs python36u-devel python36u-pip



    2-6) 인벤토리 파일 수정


    cp -r inventory/sample inventory/ncloud
    cd /kubespray
    declare -a IPS=(10.41.4.220 10.41.2.83 10.41.0.188) <- Master/Node 서버의 Public IP 입력

    CONFIG_FILE=inventory/ncloud/hosts.ini python3.6 contrib/inventory_builder/inventory.py ${IPS[@]}


    /kubespray/inventory/ncloud/hosts.ini 파일을 열어보면 아래와 같이 설정되어 있음을 확인할 수 있다. 


    [all]

    node1    ansible_host=10.41.4.220 
    node2    ansible_host=10.41.2.83
    node3    ansible_host=10.41.0.188 

    [kube-master]
    node1
    node2

    [etcd]
    node1
    node2
    node3

    [kube-node]
    node1
    node2
    node3

    [k8s-cluster:children]
    kube-master
    kube-node

    [calico-rr]

    [vault]
    node1
    node2
    node3



    2-7) Cluster Services, Pods Subnet IP range 설정


    네이버클라우드플랫폼에서는 지정되지 않은 사설 IP 를 사용할 경우 drop 되어 통신이 안되는 경우가 있다. 

    따라서 docker/k8s 사용시에는 아래와 같은 IP range 를 사용하는 것을 권장한다. 


    vi /kubespray/inventory/ncloud/group_vars/k8s-cluster/k8s-cluster.yml


    -> kube_service_addresses: 172.16.0.0/13


    -> kube_pods_subnet: 172.24.0.0/13


    2-8) K8S Cluster deploy


    ansible 서버에서 playbook 을 실행시키고 설치 status , 에러를 확인한다. (아래 커맨드를 모두 붙여서 한줄에 쓴다.)


    ansible-playbook -i inventory/ncloud/hosts.ini cluster.yml -b -v --private-key=~/.ssh/id_rsa --extra-vars "sysctl_file_path=/etc/sysctl.d/kubespray_sysctl.conf"




    3. k8s cluster 상태 확인


    ansible 로 설치한 k8s cluster 가 정상적으로 설치 되었는지 Master 서버에 접속하여 확인한다. 


    Master 서버에서 확인


    # kubectl get nodes


    NAME      STATUS    ROLES         AGE       VERSION
    node1     Ready     master,node   5m        v1.11.2
    node2     Ready     master,node   5m        v1.11.2

    node3     Ready     node          5m        v1.11.2


    # kubectl get pods --all-namespaces 


    NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
    kube-system   calico-node-2w7pq                       1/1       Running   0          5m
    kube-system   calico-node-pk6st                       1/1       Running   0          5m
    kube-system   calico-node-w5f55                       1/1       Running   0          5m
    kube-system   kube-apiserver-node1                    1/1       Running   0          5m
    kube-system   kube-apiserver-node2                    1/1       Running   0          5m
    kube-system   kube-controller-manager-node1           1/1       Running   0          6m
    kube-system   kube-controller-manager-node2           1/1       Running   0          6m
    kube-system   kube-dns-6d54bdd9d6-rrp4m               3/3       Running   0          5m
    kube-system   kube-dns-6d54bdd9d6-xsw99               3/3       Running   0          4m
    kube-system   kube-proxy-node1                        1/1       Running   0          5m
    kube-system   kube-proxy-node2                        1/1       Running   0          5m
    kube-system   kube-proxy-node3                        1/1       Running   0          5m
    kube-system   kube-scheduler-node1                    1/1       Running   0          6m
    kube-system   kube-scheduler-node2                    1/1       Running   0          6m
    kube-system   kubedns-autoscaler-76f87d889d-dgs6z     1/1       Running   0          4m
    kube-system   kubernetes-dashboard-8595fbc877-v8rc2   1/1       Running   0          4m

    kube-system   nginx-proxy-node3                       1/1       Running   0          5m


    반응형

    댓글

Designed by Tistory.