쿠버네티스 ingress (2)

greenTea·2023년 8월 29일
0

실습

🤗먼저 쿠버네티스 ingress controller중에서 nginx-controller를 설치하겠습니다.

https://kubernetes.github.io/ingress-nginx/deploy/로 가셔서 자신에게 맞는 것으로 명령어를 이용하시면 됩니다.
저의 경우에는 gke를 사용하고 있기에 GCE-GKE를 이용하였습니다.(aws,azure등이 아니라면 Bare metal clusters를 사용하시면 됩니다.😑)


GCE-GKE 명령어

kubectl create clusterrolebinding cluster-admin-binding \
  --clusterrole cluster-admin \
  --user $(gcloud config get-value account)

권한 설정 명령어입니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

🤔ingress-nginx를 설치하는 명령어입니다.

설치하고 나서 kubectl get svc -n ingress-nginx 를 하시면 아래와 같은 서비스가 보이실겁니다.

NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                    AGE
service/ingress-nginx-controller             LoadBalancer   [클러스터 ip]     [외부 ip]   80:31014/TCP,443:32464/TCP  88m
service/ingress-nginx-controller-admission   ClusterIP      [클러스터 ip]   <none>         443/TCP                    88m

🧐gke의 경우 자동으로 로드밸런서를 만들어줍니다. (기본은 clusterIp로 만들어지는데 필요하신 경우 위 설치 명령어를 wget으로 가져와서 고쳐서 사용하시면 됩니다. NodePort로 변경 추천)

ingress를 이용하기 위해 이제 servicedeploy,pod를 생성하겠습니다.


service,deploy,pod 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            scheme: HTTP
            path: /index.html
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 5
        volumeMounts:
            - name: nginx-public
              mountPath: /usr/share/nginx/html/
      volumes:
      - name: nginx-public
        configMap:
          name: nginx-index-html-configmap
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-index-html-configmap
data:
  index.html: |
    <html>
    <h1>hello kubernetes</h1>
    </br>
    <h1>hello ingress</h1>
    </html
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - port: 80
      targetPort: 80

🤓위 내용으로 이루어진 파일을 생성하신 후 kubectl apply -f [파일이름]을 통해 servicedeployment, pod를 한번에 생성하였습니다.

이제 ingress를 생성하겠습니다.



ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: "/"
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

🥳ingress를 만드는 yaml파일입니다.

rules를 통해 path로 오게 되면 어느 서비스로 보내는 것인지를 정의 할 수 있습니다.

주의

😓ingressClassName: nginx를 넣어주셔야 합니다.
위에서 만든 ingress를 저희가 설치한 nginx-ingress가 인식할 수 있게 할려면 nginx-ingressingressClass를 입력해줘야 하는데 kubectl get ingressclass를 통해 이를 확인 할 수 있습니다.

NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       104m

🧐ingresskubectl apply -f [ingress 파일 이름]을 통해 실행해주고 나서 kubectl get ingress를 통해 확인하시면 됩니다.(gke의 경우 처음에는 external ip가 없는 상태인데 조금 기다리시면 나옵니다.)

NAME            CLASS   HOSTS   ADDRESS        PORTS   AGE
nginx-ingress   nginx   *       [로드 밸런서 ip]   80      26m

ingress 확인

😑kubectl describe ingress nginx-ingress를 실행해보면 아래와 같은 결과가 나옵니다.

Name:             nginx-ingress
Labels:           <none>
Namespace:        ingress-nginx
Address:          [ip(저의 경우 로드밸런서)]
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           
              /   nginx-service:80 ([pod1의 ip]:80,[pod2의 ip]:80)
Annotations:  <none>
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  Sync    28m (x2 over 28m)  nginx-ingress-controller  Scheduled for sync

😓Ruels를 보시면 path:/ , Backends: nginx-service:80으로 되어 있는데 말 그대로 /로 접속하면 nginx-service라는 이름을 가진 서비스의 80포트로 연결 해주겠다는 의미입니다.(yaml에서 저희는 서비스의 80포트를 열어놓은 상태입니다.)


결과

🥳gke로드밸런서를 자동으로 생성해주기에 해당 ip로 접속을 하면 됩니다.
(vm으로 하신 경우에는 포트포워딩을 통해 해주시면 됩니다. 예: nodePort로 30001을 열어놓은 경우 접속포트:30001로 연결해주시면 됩니다.)

요청을 할 경우 아래와 같은 화면이 나오면 성공입니다.

profile
greenTea입니다.

0개의 댓글