DevOps/쿠버네티스 23

쿠버네티스, 물리장비에 올릴까? 가상장비에 올릴까? 머신별 장단점 알아보기.

Kubernetes Micro Service Architecture(이하 MSA) 개발방식이 유행을 타면서 이와 동시에 docker와 같은 container application들을 orchestration하는 도구인 Kuberntes(이하 k8s)의 관심도도 엄청나게 높아지고 있다. k8s에 대한 관심이 지속적으로 늘어남과 동시에 개발자들은 효율적인 machine(host)의 resource(cpu, ram등)의 사용을 위해 아래와 같은 질문이 자연스럽게 나눠지곤한다. k8s를 물리장비에 올릴까? 가상장비에 올릴까? 어디에 올렸을때 효과적일까? 상기와 같은 질문을 하기 전에 k8s의 목적에 대해 명확히 알아야 한다. k8s는 container orchestration도구일 뿐이다. container a..

Elasticsearch와 Kibana, filebeat 를 활용한 쿠버네티스 로깅 아키텍쳐

Elasticsearch와 Kibana 그리고 filebeat를 활용하면 간단하고 효과적으로 쿠버네티스의 log를 수집하고 조회할 수 있다. 구성Log를 수집하여 데이터를 저장 및 조회하는 Elasticsearch pod쿠버네티스의 각 node에서 daemonset으로 띄워져 log를 수집하여 elasticsearch로 전송하는 Filebeat pod수집한 log를 visualize하여 확인할 Kibana pod그림. Elasticsearch와 Kibana, filebeat를 사용한 kubernetes logging 아키텍쳐 elasticsearch.yaml# 엘라스틱서치 image를 가져와서 pod으로 띄웁니다.# PVC를 사용하는 경우와 PVC를 사용하지 않는 경우로 사용할 수 있습니다. 1) PVC..

쿠버네티스 Multi-container pod 종류 및 예제

Pod은 쿠버네티스에서 배포할 수 있는 최소 모델이다. Pod은 클러스터에서 프로세스로 실행된다. Pod은 application container(혹은 containers), storage resource, unique IP, option 으로 이루어져 있다. Docker는 쿠버네티스에서 사용 가능한 가장 널리쓰이는 컨테이너이다.(다른 컨테이너 모델도 상용 가능) Pod 모델 종류 1. 1개 컨테이너 - 1개 POD 모델 "one-container-per-Pod"은 쿠버네티스에서 가장 널리 쓰이는 케이스. 한개의 pod이 1개의 container을 감싸고 있으며, 쿠버네티스가 pod을 관리. 2. 2개 이상 컨테이너 - 1개 POD 모델 2개 이상의 container가 리소스를 밀접하게 공유해야하는 상황..

쿠버네티스 kubectl 설명 및 예제 모음

kubectl은 쿠버네티스 클러스터에 명령을 내리는 CLI(command line interface)입니다. kubectl 문법(바로가기) kubectl 예제(바로가기) kubectl 문법 terminal window에서 아래와 같은 명령어로 kubectl을 동작 가능합니다. kubectl [COMMAND] [TYPE] [NAME] [FLAGS] - COMMAND : create, get, describe와 같이 하나 혹은 여러개의 리소스에 대한 operation 종류를 선언합니다. - TYPE : resource type(설명 바로가기)에 대해 선언합니다. 리소스 타입은 case-sensitive하고 아래와 같이 선언 가능합니다. $ kubectl get pod pod1 $ kubectl get pod..

쿠버네티스 로그 아키텍쳐 개요 및 방법

Logging Architecture로그들은 에러를 디버깅하거나 클러스터의 status에 대해 자세히 알 수 있다. 앞에서 말한 목적때문에 대부분의 애플리케이션들은 standard output으로 로그파일을 남기고 있다. 그러나, 컨테이너 엔진 혹은 이전의 애플리케이션의 로깅 방법은 쿠버네티스에서의 로그 확인에 적절하지 않다. 사용자는 컨테이너 crash, pod 삭제, node VM이 죽는 경우에도 로그를 확인을 원할 수 있다. 그러므로, 로그는 모니터링 하고자 하는 쿠버네티스와는 무관한(별개의) storage와 lifecycle을 가져야한다. 이러한 컨셉을 cluster-level-logging 이라고 부른다. cluster-level-logging은 각각의 분리된 저장소, 분석 솔루션, 대시보드가 ..

쿠버네티스 RBAC(Role-based Access Control) 상세 설명 및 예제

RBAC는 enterprise 쿠버네티스 환경에서 node 혹은 네트워크 리소스를 접근할때 role을 부여하는 작업이다. 특징RBAC는 rbac.authorization.k8s.io API를 사용k8s 1.8부터 RBAC mode가 stable함RBAC 활성화를 위해 --authorization-mode=RBAC 설정 필요API 살펴보기Role and ClusterRoleRole은 쉽게말하면 권한 모음이다. 직관적으로 어떤어떤 권한을 부여 가능. ClusterRole은 Role과 비슷하지만 cluster기반 권한 부여이므로, node, endpoint, 모든 namespace에 대한 권한 셋팅 가능 example : default라는 이름의 namespace에 pod 읽기권한(get, watch, lis..

[쿠버네티스 기초]spring boot rest application POD 배포하기(part2)

준비물 20min 쿠버네티스가 준비된 클러스터환경 Intellij or eclipse docker docker hub에 올라간 이미지 쿠버네티스에 배포 ※ 쿠버네티스의 kubectl 명령어에 대해서는 쿠버네티스 kubectl 설명 및 예제 모음(바로가기) 포스트 참고 1. 쿠버네티스에 docker hub 관련 secret을 등록한다. (쿠버네티스 시크릿? - OAuth token, password 등 민감 정보를 Object type으로 선언) $ kubectl create secret docker-registry my-secret --docker-server=hub.docker.com --docker-username=choco4235 --docker-password=password1234 --docke..

[쿠버네티스 기초]spring boot rest application POD 배포하기(part1)

준비물 20min쿠버네티스가 준비된 클러스터환경Intellij or eclipsedockerspring boot application 및 쿠버네티스에 올라갈 이미지 준비1. spring boot rest api application을 spring.io 예제 홈페이지(바로가기) 에서 받는다.2. Intellij 혹은 eclipse에서 실행시켜본다.3. Dockerfile 생성 FROM openjdk:8-jdk-alpine RUN apk add --no-cache curl tar bash VOLUME /tmp ADD build/libs/gs-rest-service-0.1.0.jar app.jar ENV JAVA_OPTS="" ENTRYPOINT ["java","-jar","/app.jar"] 4. Docke..

젠킨스(with 쿠버네티스 플러그인)가 쿠버네티스에서 동작하는 원리, 생명주기, 특징

기존 VM으로 운영되던 Jenkins는 master가 있고 slave(vm n대 설정)를 연결시키면 slave가 job을 master로 부터 받아서 수행했엇다. 하지만 VM으로 운영되는 Jenkins(master-slave) 구조는 아래와 같은 단점이 있다. Job에 필요한 plugin들을 master에 설치, 관리 필요Job에 비해서 slave가 많으면 비효율적임 (slave가 놀고 있음)Job에 비해서 slave가 적으면 비효율적임 (slave가 부족해서 기다리는 job이 많아짐) 즉, Job이 늘어나고 줄어듦에 따라 Jenkins slave를 늘리거나 줄여야하는(사람이 직접 설치해야하는) 단점!! Jenkins(with kubernetes plugin)가 있다면 이야기는 달라진다. Jenkins m..

쿠버네티스 yaml 선언시 어떤 apiVersion을 사용해야 할까?

쿠버네티스의 yaml을 배포할때 어떤 apiVersion을 사용해야할지 감이 잡히지 않는다. 외국의 블로그 포스팅(바로가기)에서 감사하게도 각 kind에 따른 apiVersion을 정의 해주었다.- 2018년 6월 4일 updated versionWhich apiVersion should I use?KindapiVersionCertificateSigningRequestcertificates.k8s.io/v1beta1ClusterRoleBindingrbac.authorization.k8s.io/v1ClusterRolerbac.authorization.k8s.io/v1ComponentStatusv1ConfigMapv1ControllerRevisionapps/v1CronJobbatch/v1beta1Daemon..

쿠버네티스 yaml 스펙 상세 설명

쿠버네티스의 pod, service, ingress 등을 배포하기 위해서는 아래와 같은 예시 yaml 파일을 배포한다. apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 8090특징띄어쓰기 구분을 잘해야한다. - 각 셋팅의 하위 셋팅은 종속적이기 때문에 띄어쓰기가 틀리게 되면 적용 실패된다. - tab보다는 space를 추천원하고자 하는 kind에 따라 apiVersion 종류가 달라진다. apiVersion 설명- 스크립트를 실행하기 위한 쿠버네티스 API 버젼v1쿠버네티스에서 발행한 첫 stable release API (대부분의 ap..

쿠버네티스에서 POD, Node의 리스소 관리(CPU, memory, 등)

쿠버네티스에서의 리소스## 아래 예제는 unmanaged pod라고 보면됨.(실제로 이렇게 쓰지 않음) apiVersion: v1 kind: Pod metadata: name: requests-pod spec: containers: - image: busybox command: ["dd", "if=/dev/zero", "of=/dev/null"] name: main resources: requests: #미니멈 개념, 최소 X가 필요하다. cpu: 200m #200밀리코어 memory: 10Mi #10메가 ## pod A가 request설정, pod B도 request설정 pod C도 request설정 그러나 실제 usage는 너무 작다## 즉, 실제 CPU사용량은 request와는 무관하다.(작을수도,..

쿠버네티스 Deployment를 통한 배포 및 롤백

쿠버네티스 롤백$ k rollout status deployment kubia## deployment 확인하여 error가 있는지 확인 $ k rollout undo deployment kubia## 이전 버젼으로 deploynment 배포(롤백) 특정버젼으로 롤백하기$ k rollout undo deployment kubia --to-revision=1## revision 숫자로 돌아감. 배포관련 옵션 설정spec: strategy: maxSurge: 1 ## 최대 신규 버젼 배포추가 가능건 maxUnavailable: 0 type: RollingUpdate ## rolling update에 있어서 새버젼을 먼저 배포하고 기존 배포건을 지울 것인지, 혹은 기존배포건을 지우고 새버젼을 배포할 것인지 설정..

쿠버네티스를 통한 지속적 배포 전략(rolling, blue green) 실습

쿠버네티스 배포 ## pod들이 배포되어있을때 어떻게 배포할까? ## green blue전략 : 똑같은 수의 pod을 추가로 만들어서 service가 바라보는 쪽을 변경하는 전략. 그러나 리소스가 제한적일 때는 적용 힘듦. ## Rolling update전략 : scale out하면서 기존의 version1 pod들을 제거하는 전략. zero down time, 리소스가 적더라도 적용 가능. 그러나 일정시간에는 고객에게 version1, version2가 혼재함. ※ update version마다 rc가 만들어져야함 중요!! 그러므로 name에 version명을 적어주는게 좋음. apiVersion: v1 kind: ReplicationController metadata: name: kubia-v1 sp..

쿠버네티스 배포를 하기 위한 준비 readinessProbe, livenessProbe

쿠버네티스의 배포 ## 쿠버네티스의 배포는 아래와 같이 진행됨## pod 삭제(kill) -> restart(redeploy) -> okReadiness probes## probe check, 응답이 없으면 end point로 보내지 않는다.(해당 pod정보를 유효하지 않는다고 판단한다.) ## liveness probe : 응답없으면 kill, 정상적인 image인지 판단## readiness probe : 대기, 기다리다가 사용자 connection가능하면 연결시켜줌 ## 보통 2개를 동시에 사용한다. 서로 보완하는 관계## tcp socket, http health 등 사용가능 nginx-ingress-controller.yml apiVersion: extensions/v1beta1 kind: De..

INGRESS를 사용한 쿠버네티스 네트워크 심화(sticky session, ssl connection)

Annotation## label(key=value)이랑 비슷하지만 annotation은 label로 적합하지 않은 값 컨트롤 가능## ingress controller에 추가할 기능들을 annotation으로 설정 하면 좋음 Ingress sticky Session## clientIP의 ip로 부터 호출이 오면 해당 호출을 받은 pod에만 지속적으로 가도록(설정하지 않으면 round robin으로 pod이 계속 바뀐다.## NGINX는 cookie만 가능 - cookie로 같은 컴퓨터로 부터 호출인지 판단함. apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/affinity: "co..

INGRESS를 사용한 쿠버네티스 네트워크 설치 및 연결

## nginx와 INGRESS를 사용하여 쿠버네티스 내부의 어떤 Node에 해당하는 Service로 보낼지 규칙을 정할 수 있다. 예를 들면 zuul 처럼 ## 기본적으로 host기반 그 뒤에 path 기반 ex) kubia.example.com/kubia -> service 1ex) kubia.example.com/foo -> service 2ex) foo.exmple.com -> service3 Namespace 생성하기namespace.yml apiVersion: v1 kind: Namespace metadata: name: ingress-nginx $ k create -f namespace.yml Namespace안에 서비스 생성하기default-backend.yaml apiVersion: ex..

쿠버네티스 service를 사용한 네트워크 설정

POD 배포하기 test-pod.yml apiVersion: v1 kind: ReplicationController metadata: name: kubia spec: replicas: 3 selector: app: kubia template: metadata: labels: app: kubia spec: containers: - name: kubia image: reg.cloud.com/kubia ports: - containerPort: 8080 $ k create -f test-pod.yml## test pod 실행 총 3개 실행 8080으로 열기Service 배포하기test-service.yml apiVersion: v1 kind: Service metadata: name: kubia spec: p..

쿠버네티스 service를 통한 네트워크 설정 개념정리

kubernetes에는 3개의 service라고 불리는 네트워크 객체가 있다. Load balancer > Node Port > ClusterIP 총 3개의 service 존재 네트워크 종류별 사용 연결 예제 stateless application으로 띄울 경우 ip는 항상 바뀌므로 이를 명심하여 사용. ClusterIP * 내부 POD끼리만 통신가능, 외부는 안됨 * 내부 ip를 알아내기 위해 internal DNS를 사용 Node Port * 외부 사용자 혹은 client와 통신하기 위함 * Node Port를 만들면자동으로 clusterIP가 생성됨. * 내부 clusterIP가 아닌 또 다른 클러스터 바깥의 Load balancer을 통해서 요청이 들어옴. 해당 요청이 다시 clusterIP의 내..

쿠버네티스 RC를 통한 POD생성 및 Probe를 통한 health check

yml파일을 사용해서 쿠버네티스에서 pod만들기 multiContainer.yml apiVersion: v1 kind: Pod metadata: name: multi labels: app: wordpress spec: containers: - name: wordpress image: reg.cloud.com/wordpress ports: - containerPort: 80 - containerPort: 443 env: - name: WORDPRESS_DB_HOST value: 127.0.0.1 - name: WORDPRESS_DB_USER value: wordpress - name: WORDPRESS_DB_PASSWORD value: password - name: db image: reg.cloud.co..

728x90
반응형