반응형

 

Spring boot Application 을 Dockerfile 로 build 할 때에 profile 값을 전달 해야해서 찾아본 것을 적어보았다.

profile 값을 전달하기 위해서는 다음과 같은 방법들이 있다. 

 

1.Dockerfile 에 profile 값을 넣고 build 를 한다.

FROM java:8
ADD target/app.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=dev","-jar","/app.jar"]

2.Docker run 할때 환경 변수로 전달한다.

docker run -d -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=dev" --name rest-api dockerImage:lates

3.DockerCompose 로 전달한다.

version: "3"
services:
	rest-api:
	image: rest-api:0.0.1
	ports:
		- "8080:8080"
	environment:
		- "SPRING_PROFILES_ACTIVE=dev"

 

여기에서 난 1번을 선택해서 적용을 했는데 한가지 Dockerfile 에 전달되는 profile 값이 변경 될수 있도록 하고 싶었다. 그럴려면 docker build 시점에 값을 넘겨줘야 하는데 document를 찾아보니 ARG 를 사용하게 되면 docker build 시점에 값을 넘길수가 있다.

FROM ubuntu
VOLUME /tmp
ADD app.jar app.jar
RUN bash -c 'touch ./app.jar'
ARG SPRING_PROFILES_ACTIVE
RUN echo $SPRING_PROFILES_ACTIVE
ENV SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar","./app.jar"]
docker build --build-arg SPRING_PROFILES_ACTIVE=dev .

결과적으로 docker build 시에 --build-arg 로 SPRING_PROFILES_ACTIVE 값을 넘겨주고 Dockerfile 에서는 전달 받은 SPRING_PROFILES_ACTIVE 값을 ENV 로 등록을하면 ENTRYPOINT 에 -D 옵션을 넣어서 실행하지 않아도 자동으로 profile 이 적용되서 실행이 된다.

 


참고자료

https://docs.docker.com/engine/reference/builder/#arg

https://stackoverflow.com/questions/43707770/spring-boot-in-docker

 

728x90
반응형
반응형

최근에 Kubernetes에 어플리케이션을 올리다가 몇일간 맨붕 상태가 온 내용을 남겨두고자 한다. 

 

Kubernetes 클러스터에 my-test1 이라는 네임스페이스로 ingress, servcie, deployment 를 생성하였다. 

 

여기 까지는 문제가 없었는데 도메인을 설정하고 tls 를 설정하면서 문제가 발생했다.

 

1. test.com 이라는 도메인으로 사설 인증서 생성.

2. crt 파일과 key 파일을 이용해서 secret 생성

3. ingress 에 tls 설정에 host와 tls 를 설정.

 

위와같이 진행을 하고 접속을 해봤다. 

그런데 이상하게 브라우저에서 "주의요함" 부분을 클릭해보면 내가 만든 사설인증서의 도메인이 나오는게 아니라 Kubernetes의 Fake 인증서가 나왔다. 분명히 나는 인증서를 설정했는데..

 

이것때문에 원인을 찾느라 한참 고생했다.

 

결국 원인을 찾았는데 문제는 동일한 도메인을 사용하는 다른 ingress 들 때문이었다. 

 

내가 사용중인 네임스페이스의 ingress 를 생성하면 kube-system 에 있는 ingress-constroller 에 등록이 된다. 이때에 내가 설정한 어플리케이션 뿐만 아니라 다른 네임스페이스의 어플리케이션의 ingress 도 생성하면 동일하게 등록이 된다. 

 

이때에 중요한 점은 같은 도메인일 경우이다.

 

만약 내가 ingress 의 tls 설정을 아래와 같이 했다고 가정해보자

 

tls:
- hosts:
- test.com
secretName: my-test-secret

 

그런데 다른 어플리케이션에서 ingress 를 아래와 같이 설정을 했다.

 

tls:
- hosts:
- test.com

 

이럴 경우 아래쪽에 ingress 의 설정에 secret 이 없기때문에 Fake 인증서를 사용하게 된다. 아마도 순서에 영향을 받지 않나 싶다. 결과적으로 ingress 를 반영을 하게되면 kube-system의 ingress-controller 에 반영이 되고 결국 내부의 nginx.conf 파일에 반영이 되기 때문에 아마도 순서에 영향을 받을 것 같긴 하다. 

 

따라서 같은 도메인일 경우에는 namespace 별로 secret을 다 만들어서 같이 설정을 해두던지 아니면 하나의 ingress 에서만 secret 설정을 하고 나머지는 tls 설정을 삭제 해줘야 한다.

 

이것때문에 너무 시간도 많이 낭비했는데.. 역시 모르면 몸이 고생이다. ㅠㅠ

 

728x90
반응형
반응형

ReplicaSet 은 Replicatation Controller 의 새로운 버전이다.

 

다른것은 다 동일한데 아래와 같은 차이점이 존재 한다.

 

ReplcaSet : Set-based Selectors

Replicatation Controller : Equality-based Selectors

 

  Equality-based  Set-based
support  Service, Replication Controller Job, Deployment, ReplicaSet, Daemon Set
Operation  =, ==, != in, notin, exists
Example  enviroment=prd enviroment in (prd)
Command Line kubectl get pods -l enviroment=prd kubectl get pods -l 'enviroment in (prd)'
Manifest selector: 
  enviroment: prd
selector:
 matchExpressions: 
   - {key: enviroment, operation: In, values: [prd]}

 

추가적으로 sectors 에 matchLabels 가 존재할 경우 아래와 같은 차이점이 있다.

Manifest

selector:
  app: nginx 

selector: 
  matchLabels: 
     app: nginx
support  Services, Replication Controller ReplicaSets, Deployments, Jobs, DaemonSet|

 

참고자료

https://www.youtube.com/watch?v=Y5ADo_tjfIs&list=PLMPZQTftRCS8Pp4wiiUruly5ODScvAwcQ&index=19

728x90
반응형
반응형

Kubernetes를 사용하면서 자주 사용하는게 kubectl 명령어 이다. 그리고 그중에서 컨테이너를 생성할때 항상 kubectl create 명령어를 사용했다. 그런데 사용하다보니 어떤 글에는 create 를 사용하고 어디에서는 apply 를 사용하는 것을 보게 되었다. 그래서 이 차이점이 궁금해서 이렇게 정리하게 되었다. 


아래 내용들은 kubernetes document 에서 요약한 내용들이다. 

https://kubernetes.io/docs/concepts/overview/object-management-kubectl/overview/



Kubernetes 에서 Object Management 에는 3가지가 있다. 


Management technique

Operates on

Recommended environment 

Supported writers 

 Imperative commands

 Live objects 

 Development 

 1+ 

 Imperative object configuration

 Individual files  

 Production 

 1 

 Declarative object configuration

 Directories of files 

 Production 

 1+ 



Imperative Commands


장점

- 클러스터에 특정 오브젝트를 한번에 실행하거나 시작할수 있는 가장 쉬운 방법이다. (실제 이미지 바로 실행 시킨다. )


단점

- 기존 설정에 대한 히스토리를 제공하지 않는다. (그래서 위에 권장 환경이 Development 인것 같다.)

- 변경사항이나 audit 내역, 템플릿등을 제공하지 않는다. 


ex)

kubectl run nginx --image nginx



Imperative object configuration


- 최소한 1개 이상의 YAML 이나 JSON 포맷의 파일을 이용해서 Object 를 생성한다. 


ex)

kubectl create -f nginx.yaml

Imperative object configuration vs Imperative Commands

장점

- 설정파일 내용을 Git 같은 곳에 저장이 가능하기 때문에 설정에 대한 변경 히스토리가 확인 가능하다. 

- 새로운 Object를 생성하기 위한 템플릿을 제공한다. 

단점

- YAML 파일 작성이 필요하며 템플릿 사용을 위해 Object schema 에 대해서 이해가 필요하다.


Imperative object configuration vs Declarative object configuration 

장점
- 더 간단하고 이해하기 쉽다.

단점

- 파일로 적용할때에만 동작한다. 디렉토리는 불가능.

- 실행중인 object 를 update 하기 위해서는 설정파일에 반영을 해야 한다. 



Declarative object configuration

- 모든 설정 파일들은 디렉토리 안에 들어있고 오브젝트를 생성하거나 패치 한다.


ex)

kubectl apply -f configs/


Declarative object configuration vs Imperative object configuration

장점

- 실행중인 오브젝트 직접 적용한 변경사항을 설정파일에 merge 하지 않더라도 유지된다.(???)


단점

- 디버깅 하기 어렵고 예상한 결과가 아닐 경우 이해하기 어렵다.

- diffs 를 사용한 부분 업데이트는 복잡한 병합과 패치를 만들게 된다.


Imperative commands 나  Imperative object configuration 는 이해가 되는데  Declarative object configuration 은 약간 이해가 안된다. 


https://kubernetes.io/docs/concepts/overview/object-management-kubectl/declarative-config/


여기 있는 샘플을 가지고 확인해보자.


sample_deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
cs



Create : kubectl apply -f sample_deployment.yaml 

Live configuration : kubectl get -f sample_deployment.yaml -o yaml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kind: Deployment
metadata:
  annotations:
    # ...
    # This is the json representation of simple_deployment.yaml
    # It was written by kubectl apply when the object was created
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}
  # ...
spec:
  # ...
  minReadySeconds: 5
cs


kubectl.kubernetes.io/last-applied-configuration 어노테이션에 보면 sample_deployment.yaml  에 적용한 내용들이 나와있다. 


다시 아래와 같이 명령어를 실행해보고 확인해보자.


kubectl scale deployment/nginx-deployment --replicas=2

Live configuration : kubectl get -f sample_deployment.yaml -o yaml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # note that the annotation does not contain replicas
    # because it was not updated through apply
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}
  # ...
spec:
  replicas: 2 # written by scale
  # ...
  minReadySeconds: 5
cs


이 경우에는 apply를 하지 않았기 때문에 kubectl.kubernetes.io/last-applied-configuration 어노테이션에 포함되지 않았다.


sample_deployment.yaml 파일을 수정해보자. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.11.9 # update the image
        ports:
        - containerPort: 80
cs


nginx image 버전이 1.7.9 에서 1.11.9 로 변경 되었다.


Create : kubectl apply -f sample_deployment.yaml 

Live configuration : kubectl get -f sample_deployment.yaml -o yaml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # The annotation contains the updated image to nginx 1.11.9,
    # but does not contain the updated replicas to 2
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.11.9","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}
    # ...
spec:
  replicas: 2 # Set by `kubectl scale`.  Ignored by `kubectl apply`.
  # minReadySeconds cleared by `kubectl apply`
  # ...
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.11.9 # Set by `kubectl apply`
cs


확인을 해보면 apply 로 적용한 nginx 버전은 kubectl.kubernetes.io/last-applied-configuration 어노테이션에 포함 되어있다. 하지만 replicas 는 포함되지 않았다.


Warning: Mixing kubectl apply with the imperative object configuration commands create and replace is not supported. This is because create and replace do not retain the kubectl.kubernetes.io/last-applied-configuration that kubectl apply uses to compute updates


그리고 위와 같은 주의 사항도 있다. apply 는 create 나 replace 를 지원하지 않는다는 거다. 이유는 create 나 replace 는 kubectl.kubernetes.io/last-applied-configuration 어노테이션을 유지 하지 않기 때문이라고 한다. 



apply 와 create 의 차이점을 찾아보다가 여기까지 오게 되었다. 결과적으로 가장 큰 차이점은 apply 를 할 경우에는 기존 설정에 대한 정보를 가지고 있다는 점인것 같다. 


apply 이외에도 다른 명령어들이 있지만 우선은 이것만 이해하는걸로 하자.





728x90
반응형
반응형

Cluster

- Master, Node 2가지 타입의 리소스가 존재한다.

- Master : cluster를 관리한다. 

- Node : Worker Machine 으로 제공되는 VM 또는 물리적 컴퓨터이다. 

            각각의 Node 는 Node 를 관리하고 Kubernetes master와 커뮤니케이션을 할수 있는 Kubelet 이라는 agent 를 가지고 있다. 

            Node 는 master 가 노출시켜놓은 Kubernetes API 를 사용해서 통신을 한다. 





https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/

Pod

- Deployment 를 생성하게 되면 Deployment는 Pod 를 생성하고 그 안에 Container 를 넣는다. 

- Pod 는 1개 이상의 어플리케이션 컨테이너와 그 컨테이너들이 공유하는 리소스의 그룹이다. 

- 공유 리소스는 volume, clusterIP 가 있다. 

- Pod 안에 있는 Container 들은 IP 와 port 를 공유한다. 

- Pod 는 Unique IP address 를 가지고 있다.


https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/



Service

- Pod 의 논리적 집합과  그것을 접근 할수 있는 정책을 정의 해준다. 

- Service 가 설정하는 Pod 의 논리적 집합은 LabelSelector 로 정의 한다. 

- 다음과 같은 type 이 존재한다. 


 type

 내용 

 ClusterIP 

 default 이다. cluster 의 internal IP 만 노출 시키기 때문에 cluster 내부에서만 접근 가능하다. 

 NodePort 

 각각의 NodeIP 에 서비스를 노출시킨다. NodePort 서비스가 라우팅 할 ClusterIP 서비스가 자동으로 생성된다. 클러스터 외부에서 <NodeIP>:<NodePort> 로 접근 가능하다. 

 LoadBalancer 

 external IP 를 생성하여 클러스터 외부에서 접근 가능하게 해준다. ClusterIP 와 NodePort는 자동으로 생성된다.




https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/

728x90
반응형
반응형

Docker 로 mysql 를 올려봤다. 


실행시키는 방법은 아주 간단하다.


docker run --name mysql-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<password> -d mysql


이렇게 하면 mysql container 가 구동된다.


docker container ps 


CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES

e99420ff2ee4        mysql               "docker-entrypoint.s…"   26 minutes ago      Up 6 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-db


여기까지는 쉬웠다. 

그런데 내 로컬 컴퓨터에서 저 DB 에 접속을 하려고 하니.. .접속이 안됐다. 참고로 저 위치는 AWS 에 있는 EC2 에 ubuntu를 올려서 설치한 것이다.


먼저 AWS 보안 그룹을 추가했다.


그래도 안된다.


그 다음에 mysql 설정을 찾아봤다.


docker exec -it mysql-db bash


이렇게 하면 container 안으로 들어올 수 있다.  container에 들어와서 mysql -u root -p 를 이용해서 mysql 로 접속한다.


mysql> select host from mysql.user where user='root';

+-----------+

| host      |

+-----------+

| %         |

| localhost |

+-----------+

2 rows in set (0.00 sec)


저렇게 쿼리를 했을 때 %가 포함되어있으면 root 계정에 한해서 모든 접속을 허용한다고 한다.... 그런데 안되네?????


계속 해서 에러가 난다.


Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found


이 에러는 mysql 의 password 방식이 변경되서 나는 에러라고 한다. 

그래서 다시 검색!!!! 그러던 중 아래와 같은 글을 발견했다.


https://stackoverflow.com/questions/49194719/authentication-plugin-caching-sha2-password-cannot-be-loaded


먼저 /etc/mysql/my.cnf 파일에 아래와 같은 설정을 추가한다. 


[mysqld]

default_authentication_plugin=mysql_native_password


그래도 안된다...


ALTER USER 'username'@'ip_address' IDENTIFIED WITH mysql_native_password BY 'password';


나같은 경우는


ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '<password>';


이렇게 실행을 했더니 드디어 접속이 됐다. 

하아... 정말 길고 긴 여정이었다. 

docker로 mysql 은 설치 했는데 접속을 할줄 몰라서 고생하고, 어떻게 접속을 해야 하는지 몰라서 찾아보고...

접속을 했는데 편집기가 설치가 안되어 있어서 vim 도 다시 설치하고...

정말 알아야 할게 너무 많구나.

그런데.. 내가 원래 하려던 것은 이게 아니었는데 DB 를 준비하려고 하다 보니 이런 삽질을 했다...ㅠㅠ


728x90
반응형
반응형

Docker 를 사용하려면 기본적으로 루트 권한이 필요하다. 그래서 그냥 쓰려면 매번 sudo 를 붙여 쓰던지 아니면 root 권한으로 변경해서 사용해야 한다.

root 로 변경해서 사용하기는 좀 그렇고 현재 사용중인 사용자를 docker 그룹에 등록을 해주면 된다.



sudo usermod -aG docker [현재 사용자]


usermod : 사용자 속성을 변경하는 명령어

-G (--groups) : 새로운 그룹을 말한다.

-a(--append) : 다른 그룹에서 삭제 없이 G 옵션에 따른  그룹에 사용자를 추가한다.


그리고 나서 우분투를 재기동 해주면 sudo 없이 사용할 수 있다.


sudo systemctl reboot


또는


sudo -su - [현재사용자]


로 해주면 재기동 없이 사용할수 있다. 



혹시라도 다음과 같은 에러가 발생한다면..


Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied


/var/run/docker.sock 파일의 권한을 변경한다.

sudo chmod 666 /var/run/docker.sock


728x90
반응형
반응형

1. RBAC Authorization


개개인의 Role  의해서 network resource  access 할수 있도록 허용한다.

RBAC  rbac.authorization.k8s.io API 그룹을 사용한다.

RBAC  사용하기 위해서는 apiserver start 시에 --authorization-mode=RBAC 또는 /etc/kubernetes/manifests/kube-apiserver.yaml 파일에 kube-apiserver 항목에 --authorization-mode=RBAC  설정해주면 된다.


2. Role & ClusterRole


- Role  단일한 namespace 있는 resource 에 대한 권한을 정의한다.

role.yaml

1
2
3
4
5
6
7
8
9
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
cs
apiGroups & resources : 어떤 Resource 대한 Rule 인지를 정의한다.

Verbs : 어떤 operation  할지 정의한다.


- Cluster Role  모든 namespace  대한 권한을 정의한다. 

clusterrole.yaml

1
2
3
4
5
6
7
8
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]
cs

Role 정의와 동일하지만 metadata  namespace 항목만 빠져있다.


3. RoleBinding & ClusterRoleBinding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
RoleBinding
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: Group
  name: group1
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: group12
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io
cs


Binding을 통해서 각각의 group 에 role 과 clusterrole 을 바인딩을 했다. role 은 group1, clusterrole 은 group2 에 바인딩을 했다. 


이렇게 바인딩이 끝나면 Group 에 따라서 호출할 수 있는 API 가 달라지게 된다. 



728x90
반응형
반응형

현재 AWS  EC2 에 올라가 있는 ubuntu 에 kubernetes를 설치해 보았다. 

그런데 설치를 하다보니 프리티어로 받은 t2.micro 가지고는 너무 성능이 느렸다. 거의 접속도 못할 지경에 이르렀다. 그래서 어차피 설치하고 지울거니깐 t2.large로 올렸다.


설치 전에 Docker 가 먼저 설치 되어 있어야 한다.

(Docker 가 설치 안되어 있다면 https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository 여기 참고하거나 아래 링크 에도 내용은 나와있다.)


https://kubernetes.io/docs/setup/independent/install-kubeadm/


여기에 들어가보면 친절하게 설치 하는 방법을 찾을 수 있다.

내용을 살펴보면 Docker 설치도 포함하고 있어서 Docker 가 설치되어 있지 않다면 그대로 따라 하면 된다.


그리고 나는 Ubuntu 에 설치를 하니 아래와 같이 명령어를 실행 했다. 혹시 명령어 실행중 permission 에러가 나면 sudo 붙이고 실행 하면 된다.

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

이렇게 하면 kubelet, kubeadm, kubectl 이 설치가 된다.


https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/


그 다음 스텝으로 위 링크로 들어가서 클러스터를 생성 하면 된다.


여기 나와 있는 내용중에 보면 사양이 나와있다. 

  • One or more machines running a deb/rpm-compatible OS, for example Ubuntu or CentOS
  • 2 GB or more of RAM per machine. Any less leaves little room for your apps.
  • 2 CPUs or more on the master
  • Full network connectivity among all machines in the cluster. A public or private network is fine.

최소 사양이다. 이러니 t2.micro 로는 역부족이었다.

kubeadm init <args> 

이렇게 명령어를 날리면 뭔가 내용이 올라오면서 설치가 된다. args는 다양하게 있으나 나는 우선 필요가 없어서 안 넣었다. 설치가 완료되면 아래와 같은 내용들이 나온다. (ip랑 port, 토큰 부분은 ㅌㅌㅌ로 처리했다.)


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 <ip>:<port> --token ㅌㅌㅌㅌㅌㅌㅌㅌ --discovery-token-ca-cert-hash sha256:ㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌ


잘 읽어보면 cluster 시작하려면 .kube에 config 파일을 만들라는 내용이 있다. 아주 편리하게 저 내용을 그대로 복사해서 붙여넣으면 된다. 그리고 아래 join에 나오는 내용은 잘 복사해서 저장해두자.


이렇게 하고 "kubectl get pods --all-namespaces" 라고 치면 아래와 비슷하게 나온다. 


NAMESPACE     NAME                                       READY     STATUS    RESTARTS   AGE

kube-system   coredns-78fcdf6894-86s7n                   0/1       Pending   0          7m

kube-system   coredns-78fcdf6894-ngk7x                   0/1       Pending   0          7m

kube-system   etcd-ip-172-31-22-134                      1/1       Running   0          7m

kube-system   kube-apiserver-ip-172-31-22-134            1/1       Running   0          7m

kube-system   kube-controller-manager-ip-172-31-22-134   1/1       Running   0          6m

kube-system   kube-proxy-46x54                           1/1       Running   0          7m

kube-system   kube-scheduler-ip-172-31-22-134            1/1       Running   0          6m


그리고 위에도 써있듯이 cluster에 network를 배포해야 한다. 

위 링크(https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network 또는 https://kubernetes.io/docs/concepts/cluster-administration/addons/) 따라가보면 종류별로 방법이 있다. 설치하고 나서 다음과 같이 확인 해보면 된다.


 kubectl get nodes

NAME               STATUS    ROLES     AGE       VERSION

ip-111-11-11-111   Ready     master    32m       v1.11.2


아직 node 를 추가 못해봤는데 다음에는 node 도 따로 추가해봐야겠다.


728x90
반응형

+ Recent posts