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> |
|
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 |