일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Arch
- ubuntu
- cloud-init
- OpenStack
- terraform
- ceph-ansible
- i3
- nfs-provisioner
- kolla
- HTML
- Kubeflow
- port open
- awx
- Linux
- Kubernetes
- libvirt
- repository
- kolla-ansible
- grafana-loki
- Docker
- yum
- Octavia
- KVM
- ceph
- Ansible
- pacman
- cephadm
- k8s
- archlinux
- golang
- Today
- Total
YJWANG
kubernetes ingress 구축 (bare-metal / metallb_layer2) 본문
ingress 구축이 처음이라면 아래 글 부터 따라하시고 오시는 것을 추천드립니다. 제 글입니다..ㅎ
https://yjwang.tistory.com/37
위 페이지의 구성이 돼있다는 전제 하에 진행할 예정입니다. 이번에는 ingress 자체를 분기하기 위해 nodeport가 아닌 Direct로 80 /443에 접근하기 위해 metallb
를 사용해볼 예정입니다.
기존 구성대로 할 시 nodeport를 통하지 않고서는 통신되지 않습니다. 이는 controller 서비스가 독립된 network 내에 있어 접근이 불가능 하기 때문입니다. 자세한 설명은 위 링크 포스팅을 참고하시기 바랍니다.
NodePort로 접속
[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
80 Port로 접속
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20/test1 #test1
curl: (7) Failed to connect to 10.95.90.20 port 80: Connection refused
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20/test2 #test2
curl: (7) Failed to connect to 10.95.90.20 port 80: Connection refused
따라서 metallb
를 사용할 예정이며, metallb로 구성 시 복제된 (replicas) 여러 ingress controller들이 external ip를 갖고 하나의 controller가 요청을 전담하여 수신한 수 분기하게됩니다. (이 구성의 한계점은 병목이 있다는 것이지만.. 논외로 하겠습니다)
MetalLB 설치
- refer to :
사전 설정
kube-proxy를 IPVS mode로 실행하는 경우 strict ARP mode를 enable 해주어야 합니다. (kubernetes v1.14.2 부터 ipvs 사용)
단, cni를 kube-router를 사용하는 경우 default로 strict ARP가 enable이기에 설정하실 필요 없습니다.
전 calico
를 사용 중이므로 설정하겠습니다.
[root@wyj05_deploy_0 ~]# kubectl edit configmap -n kube-system kube-proxy
...
ipvs:
excludeCIDRs: []
minSyncPeriod: 0s
scheduler: rr
strictARP: true
...
metalLB 설치
namespace와 metalLB controller , speaker 및 secret을 manifest를 통해 설정합니다.
[root@wyj05_deploy_0 ~]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
namespace/metallb-system created
[root@wyj05_deploy_0 ~]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml
podsecuritypolicy.policy/controller created
podsecuritypolicy.policy/speaker created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
role.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
rolebinding.rbac.authorization.k8s.io/pod-lister created
daemonset.apps/speaker created
deployment.apps/controller created
[root@wyj05_deploy_0 ~]# kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
secret/memberlist created
이후 External IP Pool을 담을 configmap을 생성합니다. IP범위는 환경에 맞게 바꿔줍니다.
[root@wyj05_deploy_0 ~]# head -v -z metallb_config.yaml
==> metallb_config.yaml <==
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 10.95.90.50-10.95.90.70
[root@wyj05_deploy_0 ~]# kubectl apply -f metallb_config.yaml
configmap/config created
배포 확인
[root@wyj05_deploy_0 ~]# kubectl get all -n metallb-system
NAME READY STATUS RESTARTS AGE
pod/controller-65db86ddc6-ltnpk 1/1 Running 0 9m43s
pod/speaker-9xknk 1/1 Running 0 9m43s
pod/speaker-h4b9m 1/1 Running 0 9m43s
pod/speaker-kj5kl 1/1 Running 0 9m43s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/speaker 3 3 3 3 3 kubernetes.io/os=linux 9m43s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/controller 1/1 1 1 9m42s
NAME DESIRED CURRENT READY AGE
replicaset.apps/controller-65db86ddc6 1 1 1 9m43s
[root@wyj05_deploy_0 ~]# kubectl get configmaps -n metallb-system
NAME DATA AGE
config 1 55s
이제 metalLB 설정은 끝났습니다.
nginx-ingress에서 External IP 할당 받기
아래 처럼 ingress-nginx-controller가 NodePort type으로 돼있습니다. 이를 LoadBalancer로 변경해줍니다.
[root@wyj05_deploy_0 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.233.26.164 <none> 80:30080/TCP,443:30443/TCP 23h
ingress-nginx-controller-admission ClusterIP 10.233.45.96 <none> 443/TCP 23h
[root@wyj05_deploy_0 ~]# kubectl edit svc -n ingress-nginx ingress-nginx-controller
...
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
sessionAffinity: None
type: LoadBalancer
...
이후 확인해보면 ingress-controller에 External IP가 할당됐고 이 Ip도 물론 edit해서 지정할 수 있습니다.
[root@wyj05_deploy_0 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.233.26.164 10.95.90.50 80:30080/TCP,443:30443/TCP 23h
ingress-nginx-controller-admission ClusterIP 10.233.45.96 <none> 443/TCP 23h
Test
정상적으로 동작함을 확인합니다. 작업 완료
[root@wyj05_deploy_0 ~]# curl 10.95.90.50
<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 ~]# curl 10.95.90.50/test1
test1
[root@wyj05_deploy_0 ~]# curl 10.95.90.50/test2
test2