学习 Ingress ,推荐使用 LoadBalancer 方式
虽然 NodePort 方式是可以的,但是,理解起来费劲,何况 NodePort 并不适合用于生产环境!
但是,普通学习环境是不支持 LoadBalancer 的 !
幸好有个开源的 MetalLB 可以提供裸机测试环境下 LoadBalancer 支持
重点是为了下一步学习 Ingress ,所以,简单学会 Layer 2 方式, BGP 方式以后再说
官方文档安装方式很完整!
我先使用 Helm 安装上了(确实简单),但是,他那个 value.yaml 配置的 192.168.1.0/24 ,第一个测试例子直接分配到 192.168.1.1 ,这个和我的网关地址一样!
Helm uninstall ,修改了 value.yaml 之后,再安装却死活找不到了
# helm install metallb metallb/metallb -f values.yaml
Error: INSTALLATION FAILED: failed to download "metallb/metallb"
先下载他的 2 个文件,检查一下里面有没有被墙的 image
wget https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml --no-check-certificate
wget https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml --no-check-certificate
里面的 image: quay.io/metallb/controller:v0.11.0
这个 quay.io 好像没有被墙,无需替换镜像源了,可以直接 pull!
拿不准的话,可以试试 https://quay.io/ 能不能访问
文档比较害人
The installation manifest does not include a configuration file. MetalLB’s components will still start, but will remain idle until you define and deploy a configmap.
意思是前面 2 个 apply 之后,还需要配置之后才能 running!
初学时,一旦看到 Pending 或者 err ,就茫然了,踩过一次坑之后才能学会!
准备好config 文件
config 文件样本在这里 MetalLB Config配置 文档
所以,最好准备好这 3 个文件之后,再继续
[root@centos7-188 metaLB]# ls
config.yaml metallb.yaml namespace.yaml value.yaml
依次 apply
kubectl apply -f namespace.yaml
kubectl apply -f config.yaml
kubectl apply -f metallb.yaml
检查所有 metallb-system 的 pod 和 svc 都 running
kubectl get pods -A
…
kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-7dcc8764f4-4dv8d 1/1 Running 0 82m
speaker-glv2l 1/1 Running 0 82m
speaker-kcnp4 1/1 Running 0 82m
speaker-vr5mm 1/1 Running 0 82m
找个简单的 nginx 试试,Service 方式改成 LoadBalancer
[root@centos7-188 nginx]# cat demo1.yaml
apiVersion: v1
kind: Service
metadata:
name: demo1
namespace: default
labels:
app: demo1
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: demo1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo1-deployment
namespace: default
labels:
app: demo1
spec:
replicas: 2
selector:
matchLabels:
app: demo1
template:
metadata:
labels:
app: demo1
spec:
containers:
- name: demo1
image: nginx
ports:
- name: http
containerPort: 80
protocol: TCP
kubectl apply -f demo1.yaml
检查 pod 和 svc
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default demo-654c477f6d-m2m8r 1/1 Running 0 68m
default demo1-deployment-796f585477-bzltz 1/1 Running 0 85m
default demo1-deployment-796f585477-w5qgz 1/1 Running 0 85m
...
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo ClusterIP 10.109.183.133 <none> 80/TCP 68m
demo1 LoadBalancer 10.103.89.77 192.168.1.240 80:31590/TCP 86m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 125m
测试一下
cluster 内访问,curl 10.103.89.77
cluster 外访问,curl 192.168.1.240
效果是一样的!不再需要 暴露 nodePort ,也不再需要 proxy !
metalLB 对外提供了一个统一的地址:192.168.1.240
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>