본문 바로가기

Tech

쿠버네티스 찍먹해보기

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

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

 

목표는 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: 로 바꾸고 해도됨 그럼 아마 오는 어떠한 라우트는 해당 서비스로 꼽힘

 

 

 

뭐 대충은 찍먹해봤고

대충 이런느낌이긴한데

 

 

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

근데 언제?..