1. 구성환경

  • GCP VM에 minikube로 kubernetes 실행환경 구성
  • Pod에 활용할 이미지에서 연동하는 Redis는 AWS에 구성

2. Redis 구동

cd /engn001/redis #경로 이동
nohup ./src/redis-server ./redis.conf & #background 실행
ps aux | grep redis #기동 확인

3. minikube 구동

minikube start
kubectl get nodes

4. Deployment 생성

  • kubectl run 명령어가 아닌 yaml 파일에 설정 정보를 명시하여 생성

  • 파일명: my-deploy.yaml


apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deploy-name #디플로이먼트 이름
  labels:
    app: my-deploy
spec:
  replicas: 3 #3개의 레플리카 파드 생성
  selector: #디플로이먼트가 관리할 파드를 찾는 방법 
    matchLabels:
      app: my-deploy
  template:
    metadata:
      labels:
        app: my-deploy
    spec:
      containers:
        - name: mycontainer
          image: sftth/whms:1.1
          ports:
          - containerPort: 8080

설정참고

kubectl create -f my-deploy.yaml
(생성되어 있으면 kubectl delete deployment my-deploy-name)

5. 서비스 생성

  • 디플로이먼트를 통해 생성된 포드의 외부 노출을 위해 서비스 생성이 필요
  • 생성 파일: my-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service-name #서비스 이름 지정
spec:
  ports:
    - name: my-deploy-svc
      port: 8080 #외부 노출 포트
      targetPort: 8080 #컨테이너 내부 포트
  type: LoadBalancer #Externel IP 활용 유형
  selector:
    app: my-deploy #외부 노출 pods의 label 선택
kubectl create -f my-service.yaml
(생성되어 있으면 kubectl delete svc my-service-name)

6. 확인

  • 노드 확인
[***@gcp-minikube-vm minikube]$ kubectl get nodes
NAME       STATUS   ROLES    AGE     VERSION
minikube   Ready    master   6d14h   v1.17.3
  • 디플로이 확인
[***@gcp-minikube-vm minikube]$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
my-deploy-name   3/3     3            3           14h
  • Pods 확인
[***@gcp-minikube-vm minikube]$ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
my-deploy-name-75876fb9db-pfpz5   1/1     Running   0          14h
my-deploy-name-75876fb9db-sm2pd   1/1     Running   0          14h
my-deploy-name-75876fb9db-vxxdt   1/1     Running   0          14h
  • 서비스 확인
[Summit@gcp-minikube-vm minikube]$ kubectl get service
NAME              TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP      10.96.0.1        <none>        443/TCP          6d14h
my-service-name   LoadBalancer   10.106.205.160   <pending>     8080:32025/TCP   3h36m

7. 외부 접속

  • minikube의 경우 service 타입을 LoadBalancer 설정을 해도 External-IP가 pending으로 생성되지 않음
[***@gcp-minikube-vm minikube]$ kubectl get svc
NAME              TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP      10.96.0.1        <none>        443/TCP          6d10h
my-service-name   LoadBalancer   10.106.205.160   <pending>     8080:32025/TCP   51s
  • minikube는 LoadBalancer 타입을 지원하지 않고 NodePort만 지원이 되므로 이 경우는 아래와 같이 로컬 내부에서 접속 테스트하는 것으로 검증 가능
[***@gcp-minikube-vm minikube]$ minikube service my-service-name
|-----------|-----------------|---------------|-----------------------------|
| NAMESPACE |      NAME       |  TARGET PORT  |             URL             |
|-----------|-----------------|---------------|-----------------------------|
| default   | my-service-name | my-deploy-svc | http://192.168.99.100:32025 |
|-----------|-----------------|---------------|-----------------------------|
🎉  Opening service default/my-service-name in default browser...
xdg-open: no method available for opening 'http://192.168.99.100:32025'

💣  open url failed: http://192.168.99.100:32025: exit status 3

😿  minikube is exiting due to an error. If the above message is not useful, open an issue:
👉  https://github.com/kubernetes/minikube/issues/new/choose

[***@gcp-minikube-vm minikube]$ curl http://192.168.99.100:32025/signIn

8. 로그확인

kubectl describe pods #pod 정보 확인
kubectl logs podName #pod 로그 확인

9. 참고 사이트

Hello Minikube 외부 IP 주소를 노출 디플로이먼트 서비스

댓글남기기