视频和代码仓库
视频教程地址:https://www.bilibili.com/video/BV1QV4rebEb8
代码仓库地址:https://github.com/xiaohh-me/kubernetes-yaml
网络规划
之前已经写了几篇安装Kubernetes文章,这次来讲讲在Kubernetes上安装Ingress,并用MetalLB部署LoadBalancer应用程序。
此次我使用的网段为 172.18.0.0/16
,同时为LoadBalancer,需要为MetalLb分配一些虚拟IP地址。此次分配的IP地址为:172.18.8.83-172.18.8.89
安装步骤
此次安装是在 v1.30.4
版本的Kubernetes上安装MetalLB和Ingress,如图:
安装MetalLB
为什么需要MetalLB
Kubernetes没有为裸机集群提供网络负载均衡器(LoadBalancer类型的服务)的实现。Kubernetes所提供的网络负载平衡器的实现都是调用各种IaaS平台(GCP、AWS、Azure…)的粘合代码。如果你不是运行在一个受支持的IaaS平台上(GCP, AWS, Azure…),loadbalancer在创建时将无限期地保持在“pending”状态。
裸机集群运营商只剩下两个较小的工具来将用户流量引入他们的集群,“NodePort”和“externip”服务。对于生产使用,这两种选择都有明显的缺点,这使得裸机集群成为Kubernetes生态系统中的二等公民。
MetalLB旨在通过提供与标准网络设备集成的网络负载平衡器实现来纠正这种不平衡,以便裸机集群上的外部服务也尽可能地“正常工作”。
MetalLB的官方文档地址为 https://metallb.universe.tf
修改kube-proxy配置
你需要执行下面这行命令进行修改:
kubectl edit configmap -n kube-system kube-proxy
需要修改的第一个地方为 config.conf
下面 mode
配置项,大概在59行的位置:
需要改为 ipvs
,如图:
需要修改的第二个地方为 config.conf
下面 ipvs.strictARP
配置项,大概在44行位置:
需要将false改为true,修改后的内容:
执行yaml对象文件
给予官方给出yaml文件,镜像是在国外拉取的,所以速度比较慢。我事先将国外的镜像拉取下来并上传到国内的阿里云上,这里提供两种执行方案:
- 官方镜像:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
- 国内镜像:
kubectl apply -f https://raw.githubusercontent.com/xiaohh-me/kubernetes-yaml/main/network/metallb/metallb-native-v0.14.8.yaml
为了方便我执行的国内镜像,执行结果如图:
可执行这行命令查看是否安装完成:
kubectl get all -o wide -n metallb-system
当READY数量对的上和STATUS状态都为Running的时候代表安装完成:
定义地址池和操作模式
操作模式有两种:
- BGP operating mode
- 这种模式需要你的路由器支持BGP协议,因为我的路由器不支持,所以这篇文章就不创建了。如有需要,可参考MetalLB关于BGP的官方文档:https://metallb.universe.tf/configuration/_advanced_bgp_configuration
- L2 operating mode
- 这种模式需要确定你的7946端口未被占用并且已被开放访问
在文章的开头,已经规划了 172.18.8.83-172.18.8.89
为IP地址池(需要保证这些IP地址没有且以后也不会被占用),所以我的地址池的yaml文件为(注意修改你自己的IP地址池):
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default-ip-pool
namespace: metallb-system
spec:
addresses:
- 172.18.8.83-172.18.8.89
然后就是创建L2操作模式了,yaml文件内容为(注意spec.ipAddressPools
需要对应你上面这个IP地址池的名字):
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default-l2
namespace: metallb-system
spec:
ipAddressPools:
- default-ip-pool
所以我的文件内容为:
直接执行这个文件可以看到结果:
可执行这行命令查看是否创建完成:
kubectl get ipaddresspools.metallb.io,l2advertisements.metallb.io -o wide -n metallb-system
创建结果:
安装Ingress
本次安装的ingress控制器是 Ingress-Nginx Controller
,官方文档地址:https://kubernetes.github.io/ingress-nginx/deploy
安装的yaml文件地址为:https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml,可执行这行命令来下载这个yaml文件:
curl -LO https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml
因为镜像是在谷歌上拉取,所以需要使用国内镜像,修改的镜像的镜像:
registry.k8s.io/ingress-nginx/controller:v1.11.2
改为registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/ingress-nginx-controller:v1.11.2
registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3
改为registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/ingress-nginx-kube-webhook-certgen:v1.4.3
地方一:
地方二:
地方三:
我已经改好了,你可以不用官方的yaml,直接使用我提供的yaml进行安装即可。执行这行命令:
kubectl apply -f https://raw.githubusercontent.com/xiaohh-me/kubernetes-yaml/main/network/ingress/deploy-v1.11.2.yaml
执行结果:
可执行这行命令检查是否安装成功:
kubectl get all -o wide -n ingress-nginx
执行结果和我的一样就代表安装成功了:
部署一个应用
接下来需要部署一个应用程序测试一下ingress是否安装成功,执行下面这行命令部署三个副本的nginx:
kubectl create deployment nginx --image=registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/nginx:1.25.5 --port=80 --replicas=3
然后创建一个service来暴露应用,注意创建类型为 ClusterIP
的服务即可,执行这行命令:
kubectl expose deployment nginx --name=nginx --port=80 --target-port=80 --protocol=TCP --type=ClusterIP
可以看到部署成功:
然后需要创建一个ingress来暴露应用程序:
kubectl create ingress nginx --class=nginx --rule="nginx.greateme.com/*=nginx:80"
注意里面的参数:
- --class: 使用哪个类型的ingress,可通过这行命令获取已存在的ingressclass:
kubectl get ingressclass
执行完成后可以看到只有一个刚刚安装类型为nginx的ingress:
- --rule: 路由规则,格式:
域名/*=服务名:端口[,tls=https的secret名字]
,上面格式代表我的域名为nginx.greateme.com
我的服务名字为nginx
我的端口为80
,且不使用https
执行结果:
执行这行命令查看更详细信息:
kubectl get ingress
执行结果:
其中 HOSTS
属性是域名,ADDRESS
是IP地址,需要将你的域名解析到该IP地址上(修改hosts文件也行)。执行这行命令查看解析结果:
nslookup 你的域名
执行之后可以发现域名已解析到IP地址:
然后可以直接访问你的域名,可以看到nginx访问成功:
好了ingress安装成功,下课!