简介
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes中目前提供了以下几种方案:
- NodePort
- LoadBalancer
- Ingress
NodePort,简单来说,就是通过service这种资源对象,为后端pod提供一个统一的访问接口,然后将service的统一访问接口映射到群集节点上,最终实现client通过映射到群集节点上的端口访问到后端pod提供的服务。
但是,这种方式有一个弊端,就是当新生成一个pod服务就需要创建对应的service将其映射到节点端口,当运行的pod过多时,我们节点暴露给client端的端口也会随之增加,这样我们整个k8s群集的危险系数就会增加,因为我们在搭建群集时,官方明确指出,必须关闭firewalld防火墙及清空iptables规则,现在我们又暴露了那么多端口给client,安全性可想而知。
一些云供应商,提供SLB产品,省去很多配置工作,简化应用过程,本文通过自己搭建LB服务器实现Nginx ingress功能。
裸金属kubernetes集群不支持LoadBalance,裸机群集运营商留下了两个较小的工具来将用户流量带入其集群,“NodePort”和“externalIPs”服务。这两种选择都对生产使用产生了重大影响,这使得裸露的金属集群成为Kubernetes生态系统中的二等公民。
但是就是想用LoadBalancer来实现,怎么办?
使用MetalLB搭建负载均衡
- 添加chart仓库
helm repo add metallb https://metallb.github.io/metallb
helm repo update
helm pull metallb/metallb
tar -xvf metallb-0.10.2.tgz && cd metallb
- 修改values.yaml
...
configInline:
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.238.155-192.168.238.160 # 负载均衡地址池
...
还可以配置基于公网的负载均衡,大家可以自己扩展下。
- 安装
helm install metallb . -n kube-system -f ./values.yaml
- 查看pod状态
kubectl get pods -n kube-system | grep metallb
metallb-controller-589cd5bc9-c7cll 1/1 Running 0 82s
metallb-speaker-dxcqd 1/1 Running 0 82s
metallb-speaker-l5bvr 1/1 Running 0 82s
metallb-speaker-p84nf 1/1 Running 0 82s
部署ingress-nginx
- 添加chart仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm pull ingress-nginx/ingress-nginx --version 3.36.0
tar -xvf ingress-nginx-3.36.0.tgz && cd ingress-nginx
- 修改values.yaml
...
controller:
name: controller
image:
registry: willdockerhub # 修改镜像仓库
image: ingress-nginx-controller
tag: "v0.49.0"
# digest: sha256:057ae3bb99b73af87b2cd25da4a861bfb02c2193aba8bec2b0f91e58e98527c5
replicaCount: 2
service:
loadBalancerSourceRanges: ["192.168.238.0/24"]
defaultBackend:
image:
registry: mirrorgooglecontainers
image: defaultbackend-amd64
tag: "1.5"
- 安装
helm install ingress-nginx . -f ./values.yaml -n kube-system
- 查看pod状态
kubectl get pods -n kube-system | grep nginx
ingress-nginx-controller-69776d86b7-nnx2z 1/1 Running 0 3m3s
ingress-nginx-controller-69776d86b7-xqtzn 1/1 Running 0 108s
ingress-nginx-defaultbackend-7f9c5b58b5-ztz9j 1/1 Running 0 9m39s
- 查看svc
kubectl get svc -n kube-system | grep nginx
ingress-nginx-controller LoadBalancer 10.1.248.157 192.168.238.156 80:30232/TCP,443:30701/TCP 60m
ingress-nginx-controller-admission ClusterIP 10.1.187.75 <none> 443/TCP 60m
ingress-nginx-defaultbackend ClusterIP 10.1.124.153 <none> 80/TCP 60m
...
测试
- 安装tomcat测试
helm search repo tomcat
helm pull bitnami/tomcat
tar -xvf tomcat-9.2.26.tgz && cd tomcat
- 修改values.yaml
replicaCount: 2
ingress:
enabled: true
hostname: tomcat.demo.com
- 部署tomcat
helm install tomcat . -f values.yaml -n test01
- 查看pod状态
kubectl get pods -n test01
NAME READY STATUS RESTARTS AGE
tomcat-697685bcd9-kqpzz 1/1 Running 0 43m
tomcat-697685bcd9-xsts4 1/1 Running 0 43m
- 查看ingress
kubectl get ingress -n test01
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
tomcat <none> tomcat.demo.com 192.168.238.156 80 41m
- 访问测试
配置本地hosts文件, 192.168.238.156 tomcat.demo.com
如图:
参考文档:
[1]: https://github.com/kubernetes/ingress-nginx
[2]: https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx
[3]: https://metallb.universe.tf/installation/
[4]: https://metallb.universe.tf/configuration/