k8s学习: 使用 MetalLB 给测试环境配置LoadBalancer 服务
k8s普通学习环境是不支持 LoadBalancer 的 !幸好有个开源的 MetalLB 可以提供裸机测试环境下 LoadBalancer 支持
学习 Ingress ,推荐使用 LoadBalancer 方式
虽然 NodePort 方式是可以的,但是,理解起来费劲,何况 NodePort 并不适合用于生产环境!
但是,普通学习环境是不支持 LoadBalancer 的 !
幸好有个开源的 MetalLB 可以提供裸机测试环境下 LoadBalancer 支持
重点是为了下一步学习 Ingress ,所以,简单学会 Layer 2 方式, BGP 方式以后再说
安装
官方文档安装方式很完整!
Helm 方式安装
我先使用 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"
只好改用 Manifest 文件方式
-
先下载他的 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>
-
更多推荐
所有评论(0)