1. Kubeadm

Kubeadm으로 설치를 하면 각 모듈들이 process로 올라가지 않고 container로 올라간다. process로 설치하면 약간 까다롭지만 환경 외부에서 볼 수있는등의 장점이 있다. etcd는 DB를 가지고 있어 이를 외부로 빼주는 방식으로 구성해야 한다.


ETCD 

- CoreOS의 Distributed Opensource Database

- Object 들이 저장되는 key-value 저장소

- ETCD 자체도 3중화 해서 사용할 수 있다.


POD 

- Container의 집합으로 K8s를 이용한 배포 및 실행의 최소 단위

- Pod 안의 container는 resource 를 공유

 . Networks/IP, volumes, Port Space, Port Space, hostname, CPU/Memory

- POD 내부의 resource들끼리 경합이 발생하니 잘 조절해야 한다.

- POD는 container를 관리하고, POD는 K8s가 관리한다.


LABEL

- Object 관리를 위해 존재하는 key-value pair 메타데이터

- Selector를 이용해서 특정 POD만 작업할 수 있다.


Replication Controller 

- Pod의 라이프사티클 관리

- replicas를 이용해 replication 의 숫자를 제어

- 이제 Deployment를 사용한다. (history를 가지고 있고, rollback이 가능하다.)

- Label에서 == 만 사용할 수 있다.(Deployment는 != 도 사용할 수 있다.)

- Batch Job을 위해서는 따른 object를 사용하여 life cycle을 관리한다.


Service

- 하나 처럼 행동하는 Pod들의 그룹

- etcd 에 등록되어 있는 object로 서비스에 등록된 것들간의 관계를 연결시켜 준다.

- frontend pod -> service -> backend pod로 구성하면 pod들이 죽었다 살아나도 서비스 유지할 수 있다.

- serivce가 만들어지면 iptables에 있는 것들을 모두 조정한다.(kublet을 이용해 모든 node의 iptables를 변경)

- 일반적으로 replication controller와 service의 yml 두개를 만들어서 사용한다.

- type을 적어서 LB등의 역활을 하도록 사용할 수 있다.



 Kubernetes Migration

- Nginx, Sprint boot, MySql 3개으 vm을 k8s로 변경


실습

namespace 만들기 -> secret 만들기 -> pv , pvc만들기 -> deployment 만들기


1. Namespace

- 논리적인 tenant 구분

- Node, Presistent Volumes(PV) 와 같이 Admin이 관리하는 k8s Object

- user, environment, pjt등 구분 가능

- object들을 사용하려면 같은 namespace에서 생성 해야 한다.(기본: default, 시스템: kube-system)


- yaml 파일을 다시 만들때 apply를 사용한다.


- Tenant 별로 resource를 관리해주기 위해 ResourceQuta


ResourceQuta Object(https://kubernetes.io/docs/concepts/policy/resource-quotas/)

- ns에 computer resoure 를 제약 조건

- request, limit 항목을 설정 가능

- CPU, Memory, Storage Resource 외에 Object들의 숫자제어

- 분수단위로 Request 가능



2. Secret

- k8s 에서 password, token, key 등을 관리하는 object

- secret을 이용해 object를 만들고 이를 이용하여 접속하도록 한다.

- 파일로 만들 수도 있다.


kubectl create secret docker-registry redii --doceker-server=<your-private-registory-url> --docker-username=<your-name> --docker-password=<your-pwrod> --docker-email=<your-email> 


 

kubectl create secret generic mysql-pass --namespace=dev --from-file=password.txt 


3. PV, PVC(user for nfs)

- volume을 어떻게 활용할까해서 나온 개념

- volume을 사용할 수 있는 pool을 만들어 준다.

- nfs, aws ebs등 거의 모든 storage 사용가능

- DB의 경우 외부 볼륨을 사용할 경우 성능이 떨어질 수 있다.(성능을 고려한 arch. 가 필요하다.)

- pv를 pvc를 이용해 사용할 수 있도록 한다(1:1의 관계). pod는 pvc를 이용해서 사용한다.


pv.yml

- local

apiVersion: v1

kind: PersistentVolume

metadata:

  name: mysql-pv

  labels:

    tier: db

spec:

  capacity:

    storage: 1Gi

  accessModes:

    - ReadWriteOnce

  persistentVolumeReclaimPolicy: Recycle

  hostPath:

    path: "/mnt/local/vol/0"


---


apiVersion: v1

kind: PersistentVolume

metadata:

  name: was-pv

  labels:

    tier: was

spec:

  capacity:

    storage: 1Gi

  accessModes:

    - ReadWriteOnce

  persistentVolumeReclaimPolicy: Recycle

  hostPath:

    path: "/mnt/local/vol/1"


- nfs


apiVersion: v1

kind: PersistentVolume

metadata:

  name: mysql-pv

  labels:

    tier: db

spec:

  capacity:

    storage: 1Gi

  accessModes:

    - ReadWriteOnce

  persistentVolumeReclaimPolicy: Recycle

#  claimRef:

#    namespace: default

#    name: mysql-pvc

  nfs:

    path: /root/nfs/vol/0

    server: 172.28.128.101


---


apiVersion: v1

kind: PersistentVolume

metadata:

  name: was-pv

  labels:

    tier: was

spec:

  capacity:

    storage: 1Gi

  accessModes:

    - ReadWriteOnce

  persistentVolumeReclaimPolicy: Recycle

  nfs:

    path: /root/nfs/vol/1

    server: 172.28.128.101


 


pvc.yml


apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: mysql-pvc

  namespace: dev

spec:

  accessModes:

    - ReadWriteOnce

  selector:

    matchLabels:

      tier: db

  resources:

    requests:

      storage: 1Gi



- pv를 생성하고 pvc를 만들면 bound 되었다고 나오고 ns/pvcname이 나오게 된다.



-


3. Deployments

- Deployment -> Replica Set(Replication Controller) -> Pod


* Cluster, Context, User

- cluster 별로 user 관리가 가능하다. 

- context는 cluster와 user의 조합으로 생성하여 multi tenant 를 사용할 수 있도록 한다.


- apply를 이용하여 deploy를 생성하면 history를 관리해주고 rollback도 된다.


kubectl apply -f mysql.yml 


mysql.yml

# Headless service used by WordPress

apiVersion: v1

kind: Service

metadata:

  name: mysql

  namespace: dev

  labels:

    name: mysql

spec:

  ports:

    - port: 3306

      name: mysql

      targetPort: 3306

      protocol: TCP

  selector:

    name: mysql


---


apiVersion: v1

kind: Service

metadata:

  name: mysql-client

  namespace: dev

  labels:

    name: mysql

spec:

  type: NodePort

  ports:

    - port: 3306

      name: server

      targetPort: 3306

      protocol: TCP

      nodePort: 30306

  selector:

    name: mysql


---

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
  namespace: dev
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        imagePullPolicy: IfNotPresent
#        resources:
#          limits:
#            cpu: 1000m
#            memory: 512Mi
#          requests:
#            cpu: 500m
#            memory: 512Mi
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password.txt
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: db-nfs
          mountPath: /var/lib/mysql
      volumes:
      - name: db-nfs
        persistentVolumeClaim:
          claimName: mysql-pvc
      nodeSelector:
        kubernets.io/hosttype: db



* 라벨 생성하기


 kubectl label nodes <hostname> <key>=<value>

#kubectl label nodes host03-03.cloud.com kube.io/hosttype=db


kubectl create secret generic mysql-pass --namespace=dev --from-file=password.txt 


kubecadm 설치시 port range가 default로 지정되어 있다.

- kubelet의 설정을 바꾸거나, node port를 바꾼다.


* Config Map

- 설정 파일들을 쉽게 다루기 위해서 사용한다.

- ConfigMap object를 만든다.


kind: ConfigMap

apiVersion: v1

metadata:

  # Must match the 'spring.application.name' property of the application

  name: emp-configmap

  namespace: dev

data:

  application.properties: |

    # Override the configuration properties here

    # EMBEDDED SERVER CONFIGURATION (ServerProperties)

    server.port=8088


    # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)

    spring.jpa.hibernate.ddl-auto=validate

    spring.jpa.generate-ddl=false

    spring.jpa.show-sql=false


    spring.datasource.url=jdbc:mysql://mysql/test

    spring.datasource.username=root

    spring.datasource.password=roqkf12#

    spring.datasource.driverClassName=com.mysql.jdbc.Driver

    spring.datasource.test-on-borrow=true

    spring.datasource.validation-query=SELECT 1

    spring.datasource.initialize=true


    # SPRING MVC (WebMvcProperties)

    spring.view.prefix=/WEB-INF/jsp/

    spring.view.suffix=.jsp



- Image  만들기

dockerfile

FROM java:latest


COPY entrypoint.sh /entrypoint.sh

COPY application.properties.template /etc/config/application.properties.template

COPY spring-boot-emp-0.0.1-SNAPSHOT.jar /app.jar

ENTRYPOINT [/entrypoint.sh]

CMD [java -Dspring.config.location=/etc/config/application.properties -jar /app.jar"]


WAS 

apiVersion: v1

kind: Service

metadata:

  name: spring-emp-env-svc

  labels:

    name: spring-emp-env-svc

spec:

  type: NodePort

  ports:

    - port: 8088

      name: server

      targetPort: 8088

      protocol: TCP

      nodePort: 30088

  selector:

    app: was

 


apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: spring-emp-env

spec:

  replicas: 2

  template:

    metadata:

      labels:

        app: was

        name: spring-emp-env

    spec:

      containers:

      - name: spring-emp-env

        image: spring-emp-env

        imagePullPolicy: IfNotPresent

        env:

        - name: DATASOURCE_URL

          value: mysql:3306

        - name: DATASOURCE_DATABASE

          value: test

        - name: DATASOURCE_USER

          value: root

        - name: DATASOURCE_PASSWORD

          value: roqkf12#

        ports:

        - containerPort: 8088

 

- test table이 없으므로 만들어 준다.

 


- 아직 /etc/config/application.properties 를 가지고 있지 않음 이미지

FROM java:latest


EXPOSE 8080

COPY spring-boot-emp-0.0.1-SNAPSHOT.jar /app.jar

ENTRYPOINT exec java -Dspring.config.location=/etc/config/application.properties -jar /app.jar

- config 파일을 Dspring.config.location=/etc/config/application.properties에서 가져오도록 옵션을 바꾸었다.

- configmap을 만든다.

kind: ConfigMap

apiVersion: v1

metadata:

  # Must match the 'spring.application.name' property of the application

  name: emp-configmap

  namespace: dev

data:

  application.properties: |

    # Override the configuration properties here

    # EMBEDDED SERVER CONFIGURATION (ServerProperties)

    server.port=8088


    # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)

    spring.jpa.hibernate.ddl-auto=validate

    spring.jpa.generate-ddl=false

    spring.jpa.show-sql=false


    spring.datasource.url=jdbc:mysql://mysql/test

    spring.datasource.username=root

    spring.datasource.password=roqkf12#

    spring.datasource.driverClassName=com.mysql.jdbc.Driver

    spring.datasource.test-on-borrow=true

    spring.datasource.validation-query=SELECT 1

    spring.datasource.initialize=true


    # SPRING MVC (WebMvcProperties)

    spring.view.prefix=/WEB-INF/jsp/

    spring.view.suffix=.jsp

 



apiVersion: v1

kind: Service

metadata:

  name: spring-emp-svc

  namespace: dev

  labels:

    name: spring-emp-svc

spec:

  ports:

    - port: 8080

      name: server

      targetPort: 8088

      protocol: TCP

  selector:

    app: was


---


apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: spring-emp-configmap

  namespace: dev

spec:

  replicas: 2

  template:

    metadata:

      labels:

        app: was

        name: spring-emp-configmap

    spec:

      containers:

      - name: spring-emp-configmap

        image: spring-emp-configmap

        imagePullPolicy: IfNotPresent

        resources:

          limits:

            cpu: 300m

            memory: 200Mi

          requests:

            cpu: 200m

            memory: 200Mi

        ports:

        - containerPort: 8088

        volumeMounts:

        - name: config-volume

          mountPath: /etc/config

      volumes:

        - name: config-volume

         configMap:
            name: emp-configmap


horizontal-pod-autoscale을 이용하기 위해서는 heapster가 설치되어 있어야 한다.

- heapsters는 cAdvisor에서 각 node의 사용정보를 가져온다.


'디지털 양피지 > Docker' 카테고리의 다른 글

openshift2  (0) 2017.07.04
8. Open Shift  (0) 2017.07.04
6. Kubenetes 리소스 관리  (0) 2017.06.30
6. Kubernetes 설치  (0) 2017.06.30
6. Kubernetes  (0) 2017.06.30
Posted by 빨간 양말