-
쿠버네티스 찍먹해보기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: 로 바꾸고 해도됨 그럼 아마 오는 어떠한 라우트는 해당 서비스로 꼽힘
뭐 대충은 찍먹해봤고
좀더 열심히해봐서 이런 느낌으로 가볼려고합니다.
근데 언제?..
'Tech' 카테고리의 다른 글
[iOS] WebView in TableView구성 (0) 2022.02.24 아이폰에서 갤럭시 Z 플립3 넘어가기 (0) 2021.09.17 iOS 개발시 Notification Service Extension 가 작동하지 않을때 (0) 2020.12.31 Codable 여러 타입 지원하기 (는 사실상 String) (0) 2020.12.17 알뜰폰(MVNO) 사용기 (0) 2020.08.29