Contents

Creating kubernetes clusters using kubeadm

GCP, AWS와 같은 Cloud 환경이 아닌 물리 서버에 kubernetes cluster 구성해보자. Creating a single master cluster with kubeadm

Maser node setting

1
$ sudo kubeadm --kubernetes-version=1.13.2 init

init을 실행하면 worker node 에서 master node로 접속할 수 있는 token hash 값을 내준다. 이것을 이용해 master node에 접속한다.

ex) kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

Note
만약 [ERROR Swap]: running with swap on is not supported. Please disable swap 에러가 발생한다면 swapoff를 해주면된다.
1
$ sudo swapoff -a

To make kubectl work for your non-root user, run these commands, which are also part of the kubeadm init output:

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Installing a pod network add-on

문서에 보면 여러가지 network를 설정할 수 있는 것들이 존재하는데 Canal을 사용하였다.

1
2
$ kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
$ kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml

잘 작동하고 있는지 pod을 확인하자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ kubectl get pods -n kube-system

NAME                          READY   STATUS              RESTARTS   AGE
canal-vb5fw                   0/3     ContainerCreating   0          27s
coredns-86c58d9df4-mf68s      0/1     Pending             0          2s
coredns-86c58d9df4-zbxnp      0/1     Pending             0          2s
etcd-eta                      1/1     Running             0          26s
kube-apiserver-eta            1/1     Running             0          45s
kube-controller-manager-eta   1/1     Running             0          33s
kube-proxy-tww4r              1/1     Running             0          82s
kube-scheduler-eta            1/1     Running             0          24s
Note
만약 coredns가 fail이 나거나 error가 발생하면 다음 설정으로 해결할 수 있다.
1
2
3
$ kubectl -n kube-system edit configmap coredns
loop 삭제
$ kubectl -n kube-system delete pod -l k8s-app=kube-dns

Joining your nodes

아까 master node에서 init할 때 나온 token hash값을 이용해서 node들을 join 시켜보자.

worker node에서는 init 할 필요없이 바로 join 명령어만 실행 하면된다.

1
$ kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

master에서 확인해보면,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ kubectl get pods -n kube-system

NAME                          READY   STATUS    RESTARTS   AGE
canal-6gg89                   3/3     Running   0          24m
canal-7dhgw                   3/3     Running   0          24m
canal-vb5fw                   3/3     Running   0          24m
coredns-86c58d9df4-mf68s      1/1     Running   0          24m
coredns-86c58d9df4-zbxnp      1/1     Running   0          24m
etcd-eta                      1/1     Running   0          24m
kube-apiserver-eta            1/1     Running   0          25m
kube-controller-manager-eta   1/1     Running   0          24m
kube-proxy-57qh5              1/1     Running   0          24m
kube-proxy-tww4r              1/1     Running   0          25m
kube-proxy-x6rng              1/1     Running   0          24m
kube-scheduler-eta            1/1     Running   0          24m

node 개수 만큼 canal, proxy등이 추가 된것을 확인 할 수 있다.

1
2
3
4
5
6
$ kubectl get nodes

NAME    STATUS   ROLES    AGE   VERSION
chi     Ready    <none>   14m   v1.13.2
delta   Ready    <none>   14m   v1.13.2
eta     Ready    master   16m   v1.13.2

pod test하기

조대협님 블로그 node.js 코드 참조

Deployment를 올리고

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jaejin-node-test
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: stupid-server
        image: opiximeo/jaejintest:v1
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

외부에서 접속하기 위해 service를 올린다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
  name: hello-node-svc
spec:
  selector:
    app: myapp
  ports:
  - port: 5920
    protocol: TCP
    targetPort: 8080
  externalIPs:
  - {your server ip}

cloud에서 service에 type: LoadBalancer를 설정해주면 자동으로 외부 IP를 가져오지만 cloud에서 올린게 아니라서 자동으로 가져오지는 못한다.

따라서 externalIPs 옵션을 줘서 접속할 수 있는 IP를 명시해주면 된다.

http://{your server ip}:5920