Kubernetes 시작하기
설치
Docker Desktop 을 설치하고, 설정에서 Kubernetes 를 설정하는 방법으로 간단히 윈도우에 k8s 를 설치해 사용해 볼 수 있습니다.
Hello, World!
아래 파일을 생성합니다.
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-server
labels:
app: server
spec:
replicas: 2
selector:
matchLabels:
app: server
template:
metadata:
name: nginx-server
labels:
app: server
spec:
containers:
- name: server
image: nginx:1.23.3
ports:
- containerPort: 80
아래 명령을 이용해 Deployment 를 생성합니다.
# kubectl delete -f nginx-deployment.yaml
kubectl create -f nginx-deployment.yaml
kubectl get pods
-------------------
NAME READY STATUS RESTARTS AGE
nginx-server-5d4b88c67-rmlc2 1/1 Running 0 83s
nginx-server-5d4b88c67-tqs5x 1/1 Running 0 83s
kubectl logs nginx-server-5d4b88c67-rmlc2
하지만 현재 상태에서는 nginx 에 접속할 방법이 없습니다.
Deployment 에 접근하기
Deployment 에 접근하는 방법은 여러가지가 있습니다.
Pod 에 로그인하기
아래 명령을 이용해 컨테이너에 로그인할 수 있습니다.
디버깅시 여러모로 유용합니다.
kubectl exec nginx-server-5d4b88c67-rmlc2 -it -- /bin/sh
Pod 에 브라우저로 접근하기
위에서 containerPort: 80
으로 설정하였으므로, 컨터이너 포트는 80 입니다.
kubectl port-forward nginx-server-5d4b88c67-rmlc2 9090:80
위 명령을 실행해 주면 http://127.0.0.1:9090/ 으로 브라우저를 이용해 접근이 가능합니다.
NodePort 를 통해 접근
kubectl expose deployment nginx-server --type=NodePort --name=nginx-service-nodeport
kubectl get service
-------------------
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h38m
nginx-service-nodeport NodePort 10.99.247.240 <none> 80:32720/TCP 2m2s
http://127.0.0.1:32720/ 을 통해 브라우저에서 접근할 수 있습니다.
127.0.0.1
은 노드의 물리적인 외부 아이피이다.
Docker Desktop 을 이용해 인스턴스를 생성했기 때문에 단일 localhost 또는 127.0.0.1 로 접속하게 됩니다.
AWS 등에서 인스턴스를 생성했다면 EC2 인스턴스에 할당된 퍼블릭 아이피를 이용해 접속하면 됩니다.
LoadBalancer 를 통해 접근
kubectl expose deployment nginx-server --type=LoadBalancer --name=nginx-service
kubectl get service
-------------------
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2m50s
nginx-service LoadBalancer 10.107.237.74 localhost 80:32229/TCP 10s
이제 브라우저에서 http://localhost/ 로 접속하면 nginx 가 실행중인것을 확인할 수 있습니다.
하지만 AWS 와 같은 클라우드 환경에서는 물리적인 로드밸런서를 사용하는 것이 되어 추가비용이 발생합니다.
Ingress 를 통해 접근
git clone https://github.com/kubernetes/ingress-nginx.git
cd ./ingress-nginx/deploy/static/provider/baremetal
kubectl apply -k ./
nginx-ingress.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: server
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: "nginx"
rules:
- host: "localhost"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nginx-service
port:
number: 80
# kubectl delete -f nginx-ingress.yaml
kubectl apply -f nginx-ingress.yaml
kubectl get svc -n ingress-nginx
-------------------
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.105.189.55 <none> 80:30452/TCP,443:32562/TCP 28m
ingress-nginx-controller-admission ClusterIP 10.99.28.188 <none> 443/TCP 28m
kubectl describe ing nginx-ingress
http://localhost:30452/ 로 접속할 수 있습니다.
https://blog.ovhcloud.com/getting-external-traffic-into-kubernetes-clusterip-nodeport-loadbalancer-and-ingress/