일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- golang
- kolla
- yum
- k8s
- terraform
- i3
- KVM
- Docker
- Ansible
- Kubernetes
- nfs-provisioner
- Linux
- cloud-init
- archlinux
- awx
- grafana-loki
- Arch
- ceph-ansible
- Octavia
- ubuntu
- kolla-ansible
- cephadm
- pacman
- Kubeflow
- ceph
- port open
- libvirt
- HTML
- OpenStack
- repository
- Today
- Total
YJWANG
kubernetes ingress 구축 (bare-metal / nodeport) 본문
test1
test1
htttpd 리소스들을 ingress로 묶을 예정이다.
계획은 <IP or Domain>:port/test1
로 접속하면 test1
로 분기 <IP or Domain>:port/test2
로 접속하면 test2
로 분기이다.
bare-metal 환경이기에 ingress controller 서비스로 80 direct 접근은 불가능 하여 nodeport를 사용해야한다.
아래 내용을 참고하면 잘 이해할 수 있다.
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/
구성하려는 구성도는 kubernetes 홈페이지에 너무 잘 나와있다.
refer to : https://kubernetes.io/docs/concepts/services-networking/ingress/
(rewrite 참고) : https://kubernetes.github.io/ingress-nginx/examples/rewrite/
direct로 80으로 분기하기 위해 external IP를 붙이는 법과 metallb를 이용하는 법이 있는데 이는 다른 포스팅에서 다룰 예정이다.
분기될 서비스들
cluster ip 로 http 접속 시 아래와 같이 나타난다.
[root@master1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 24h
test1 ClusterIP 10.233.43.104 <none> 8080/TCP 6m30s
test2 ClusterIP 10.233.6.184 <none> 8080/TCP 6m16s
[root@master1 ~]# curl 10.233.43.104:8080 #test1
test1
[root@master1 ~]# curl 10.233.6.184:8080 #test2
test2
자세히 들여다보면 아래와 같이 8080을 타고 pod들의 80으로 분기된다.
[root@master1 ~]# kubectl describe svc test1
Name: test1
Namespace: default
Labels: app=test1-dep
Annotations: <none>
Selector: app=test1-dep
Type: ClusterIP
IP: 10.233.43.104
Port: <unset> 8080/TCP
TargetPort: 80/TCP
Endpoints: 10.233.103.18:80,10.233.110.6:80
Session Affinity: None
Events: <none>
Ingress controller 설치
Ingress controller를 설치해야 한다. 정확히 말하면 Ingress를 구현할 controller 서비스를 실행시켜야 한다.
여기서는 nginx ingress를 사용할 예정이다.
refer to : https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal
아래와 같이 controller pod가 실행되면 설치는 끝이다.
[root@wyj05_deploy_0 ingress]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml
[root@wyj05_deploy_0 ingress]# kubectl get pods -n ingress-nginx \
-l app.kubernetes.io/name=ingress-nginx --watch
...
ingress-nginx-controller-5dbd9649d4-w8npw 1/1 Running 0 22s
Ingress 설정
이제 Ingress를 설정해보자
refer to : https://kubernetes.io/docs/concepts/services-networking/ingress/
[root@wyj05_deploy_0 ingress]# cat test_ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /test1
pathType: Prefix
backend:
service:
name: test1
port:
number: 8080
- path: /test2
pathType: Prefix
backend:
service:
name: test2
port:
number: 8080
위 manifest yaml 파일을 통해 apply 한다
[root@wyj05_deploy_0 ingress]# kubectl apply -f test_ingress.yaml
ingress.networking.k8s.io/test-ingress created
Ingress 학인
아래와 같이 ADDRESS가 지정되면 구축은 끝이다. 이후 deployment를 수정하여 replicas를 수정하는 것도 가능하다.
[root@wyj05_deploy_0 ingress]# kubectl get ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
test-ingress <none> * 10.95.90.20 80 72s
위에서 말했다시피 bare-metal Ingress는 기본적으로 nodeport를 통해 접근해야 하기에 nodeport를 확인해준다.
[root@wyj05_deploy_0 ingress]# kubectl get service -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.233.46.81 <none> 80:31904/TCP,443:32128/TCP 5m37s
...
31904
임을 확인했으니 접속 테스트를 진행한다. 물론 이 포트도 당연히 수정 가능하다.
예) 이런식으로 수정 가능
[root@wyj05_deploy_0 ingress]# kubectl edit svc ingress-nginx-controller -n ingress-nginx
테스트 진행
위에서 계획한 대로 test1 시 test1로 잘 분기가 됨을 알 수 있다.
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904 #default
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904/test1 #test1
test1
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904/test2 #test2
test2