ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 찍먹해보기
    Tech 2021. 8. 21. 14:41

    쿠버네티스라고 몇년전부터 쿠버네티스가 너도나도 쓰기 시작했는데, 

    놀랍게도 저는 아직 만져본적이 없습니다 짜잔~ 물론 만질 기회는 있었는데 아쉽게도 퇴사를 해버렸네요. 

     

    목표는 Pod은 뭐고 Service는 뭐고 Deployment 는 뭐고 Ingress는 뭐고 느낌이였는데

    오늘은 그걸 한번 해보자! 정도 목표로 해본거고, 일단 정확한 가이드는 아니고 이것저것 해본 그냥 기록이니 쉽게 넘겨주십쇼

     


    설치

     

    설치환경: Amazon Lightsail 

     

    k8s을 통짜로 설치하기에는 안쓰는것도 많고, 지금은 찍먹 해보는거니  k3s을 선택했습니다.

    막상 구축해보고 보니 단순 서비스는 이걸로 돌려도 될것같은 기분이 들긴하네요. (나중에 확장할때는 좀 생각해보고..)

     

    - Lightweight Kubernetes - k3s.io

    - 설치한 호스트에서는 문제 없었는데, 제 맥에서 kubectl쓸려니까 오류가 있어서, 이 포스트를 참조하여 k3s.service 을 수정했습니다.

     

    CLI/GUI

    맥에서 서버쪽으로 kubectl 컨트롤할수 있도록 설정해놔서 그냥 로컬에서 작업했다.

     

    - kubectl apply -f <파일명>.yml 하면 적용이고

    - kubectl delete -f <파일명>.yml 하면 날라감

    - kubectl exec -it <podname> <command line> 하면 docker exec 와 유사하게 돌아감.

     

    https://github.com/derailed/k9s 이런거랑 https://k8slens.dev/ 가 있으니 이런거 써도 될것같음

     

    물론 kubectl 열심히 쳐도 볼수는 있는데 그냥 물리적으로 GUI로 잘돌아가는지 보는건 편하니까

    테스트할때는 cli로 kubectl을 일일이 입력했고, 결과는 k8slens 켜두고 걍 아 올라갔네 이런식으로 보긴함.

    설정

    기본적으로 모든 namespace 는 default로 알고있습니다. (정확히는 미지정?)  일단 당장은 상관없지만 분리하고싶으니 이걸 apply

    apiVersion: v1
    kind: Namespace
    metadata:
      name: mytest

     

     

    Redis 올려보기

    이건 https://kubernetes.io/ko/docs/tutorials/configuration/configure-redis-using-configmap/ 을 참고하긴 했는데

    여기서 확인한건 ConfigMap을 파일 취급해서 걍 붙일수있는거, 그리고 테스트로 잘뜨나 확인이였는듯

     

    설명 가이드라인에서는 redis-config.yml을 따로 분리했는데 귀찮으니 한파일에 다 넣어버림.

    --- 을 쓰면 한파일에 여러개 설정 가능하다.

     

    apiVersion: v1
    kind: Pod
    metadata:
      name: redis
      namespace: mytest
    spec:
      containers:
      - name: redis
        image: redis:latest
        command:
          - redis-server
          - "/redis-master/redis.conf"
        env:
        - name: MASTER
          value: "true"
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: "0.1"
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
        - mountPath: /redis-master
          name: config
      volumes:
        - name: data
          emptyDir: {}
        - name: config
          configMap:
            name: redis-config
            items:
            - key: redis-config
              path: redis.conf
    
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: redis-config
    data:
      redis-config: |
        maxmemory 2mb
        maxmemory-policy allkeys-lru

     

    근데 이것도 deployment 로 바꾸고 Service 에서 app으로 연결할수있는데

    이설정 그대로 쓰면 master redis node가 여러개 뜰꺼라 (..) 작성하다가 버린코드 혹시몰라 일단 노트용으로 업.

    더보기
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redis
      namespace: mytest
    spec:
      selector:
        matchLabels:
          app: redis
      replicas: 1 
      template:
        metadata:
          labels:
            app: redis
        spec:
          containers:
          - name: redis
            image: redis:latest
            command:
              - redis-server
              - "/redis-master/redis.conf"
            env:
            - name: MASTER
              value: "true"
            ports:
            - containerPort: 6379
            resources:
              limits:
                cpu: "0.1"
            volumeMounts:
            - mountPath: /redis-master-data
              name: data
            - mountPath: /redis-master
              name: config
          volumes:
            - name: data
              emptyDir: {}
            - name: config
              configMap:
                name: redis-config
                items:
                - key: redis-config
                  path: redis.conf
    
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: redis-config
    data:
      redis-config: |
        maxmemory 2mb
        maxmemory-policy allkeys-lru

    그다음 nginx

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: mytest
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 1 
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80

     

    근데 deployment 로 nginx을 띄우면 deployment>replicaset>pod 만 딱 뜨고 내부에서만 쓸수있다.

    이걸 ingress로 연결할려면 일단 service을 만들어라.. 라고 해서

    apiVersion: v1
    kind: Service
    metadata:
      namespace: mytest
      name: mywebservice
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80

    이것도 넣고 

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        kubernetes.io/ingress.class: "traefik"
    spec:
      rules:
      - host: <your_host>
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: mywebservice
                port:
                  number: 80

     

    인터넷에 일부 문서는 netwokring.k8s.io/v1beta 인데 v1 오면서 backend , patchtype(required) 로 뭔가 바뀜

    - host: 부분을 날릴려면 http: 부분에 - http: 로 바꾸고 해도됨 그럼 아마 오는 어떠한 라우트는 해당 서비스로 꼽힘

     

     

     

    뭐 대충은 찍먹해봤고

    대충 이런느낌이긴한데

     

     

    좀더 열심히해봐서 이런 느낌으로 가볼려고합니다.

    근데 언제?..

     

     

     

    댓글

Designed by Tistory.