🤗먼저
쿠버네티스
ingress controller
중에서nginx-controller
를 설치하겠습니다.https://kubernetes.github.io/ingress-nginx/deploy/로 가셔서 자신에게 맞는 것으로 명령어를 이용하시면 됩니다.
저의 경우에는 gke를 사용하고 있기에 GCE-GKE를 이용하였습니다.(aws,azure등이 아니라면 Bare metal clusters를 사용하시면 됩니다.😑)
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
를 이용하기 위해 이제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 [파일이름]
을 통해service
와deployment
,pod
를 한번에 생성하였습니다.이제
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-ingress
의 ingressClass를 입력해줘야 하는데kubectl get ingressclass
를 통해 이를 확인 할 수 있습니다.
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 104m
🧐
ingress
도kubectl apply -f [ingress 파일 이름]
을 통해 실행해주고 나서kubectl get ingress
를 통해 확인하시면 됩니다.(gke의 경우 처음에는 external ip가 없는 상태인데 조금 기다리시면 나옵니다.)
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress nginx * [로드 밸런서 ip] 80 26m
😑
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로 연결해주시면 됩니다.)요청을 할 경우 아래와 같은 화면이 나오면 성공입니다.