쿠버네티스 찍먹해보기
쿠버네티스라고 몇년전부터 쿠버네티스가 너도나도 쓰기 시작했는데,
놀랍게도 저는 아직 만져본적이 없습니다 짜잔~ 물론 만질 기회는 있었는데 아쉽게도 퇴사를 해버렸네요.
목표는 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: 로 바꾸고 해도됨 그럼 아마 오는 어떠한 라우트는 해당 서비스로 꼽힘
뭐 대충은 찍먹해봤고
좀더 열심히해봐서 이런 느낌으로 가볼려고합니다.
근데 언제?..