K8s------Metallb实现Load Balancer服务

1 Metallb 的介绍

k8s的LoadBalancer类型的Service依赖于外部的云提供的Load Balancer
Metallb的作用就是通过k8s原生的方式提供LB类型的Service支持,开箱即用。

Metallb 会在 Kubernetes 内运行,监控服务对象的变化,一旦察觉有新的 LoadBalancer 服务运行,并且没有可申请的负载均衡器之后,就会完成两部分的工作:

  • 地址分配:用户需要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务
  • 地址广播:根据不同配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播

官网:https://metallb.universe.tf/installation/

2 Metallb工作模式

Metallb支持两种工作模式:Layer2模式和BGP模式

(1)Layer2模式

K8s------Metallb实现Load Balancer服务_第1张图片

Metallb在这种模式下,会从k8s节点中选一个Leader节点,在这个节点上面响应LB地址段的ARP请求,从而使上层路由把发往LB的流量都发到Leader节点。

缺点也很明显,所有对LB的请求都会发往Leader节点。如果当前Service下面的Pod分布在不同节点,那么这个流量还会从Leader发往相应的节点。

BGP模式

K8s------Metallb实现Load Balancer服务_第2张图片这种模式需要路由器支持接收Metallb的BGP广播,从而把请求分布到正确的节点上。跟L2模式的区别就是能够通过BGP协议正确分布流量了,不再需要一个Leader节点。

缺点就是需要上层路由器支持BGP。而且因为BGP单session的限制,如果Calico也是使用的BGP模式,就会有冲突从而导致metallb无法正常工作。

3 Metallb 的部署

(1)编辑kube-proxy:

kubectl edit configmap -n kube-system kube-proxy

K8s------Metallb实现Load Balancer服务_第3张图片

  • 重载使配置生效:
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

在这里插入图片描述

  • 创建命名空间:kubectl apply -f namespace.yaml
  • 创建secret:
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

(2)下载metallb的应用文件:

wget https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
  • 将安装metallb所需的镜像上传至私有仓库

K8s------Metallb实现Load Balancer服务_第4张图片
K8s------Metallb实现Load Balancer服务_第5张图片

  • 修改metallb的应用文件

K8s------Metallb实现Load Balancer服务_第6张图片
K8s------Metallb实现Load Balancer服务_第7张图片

(3)应用文件: kubectl apply -f metallb.yaml

  • 查看命名空间: kubectl get ns

在这里插入图片描述

K8s------Metallb实现Load Balancer服务_第8张图片

(4)编辑ConfigMap文件:vim config.yml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.25.12.100-172.25.12.200
  • 应用文件:kubectl apply -f config.yml

(5)测试:

[root@server2 ~]# kubectl get svc # 查看服务
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>          443/TCP        2d12h
myservice    ClusterIP      10.102.183.155   <none>          80/TCP         12h
nginx-svc    LoadBalancer   10.106.176.102   172.25.12.100   80:32311/TCP   12h
curl 10.106.176.102/hostname.html

在这里插入图片描述

curl 172.25.12.100/hostname.html

在这里插入图片描述

  • 应用文件:kubectl apply -f demo-svc.yml,创建服务和pod
---
apiVersion: v1
kind: Service
metadata:
  name: demo-svc
spec:
  selector:
    app: demo
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: myapp:v1

测试:

[root@server2 ~]# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
demo-svc     LoadBalancer   10.110.166.42    172.25.12.101   80:32456/TCP   28s
kubernetes   ClusterIP      10.96.0.1        <none>          443/TCP        2d12h
myservice    ClusterIP      10.102.183.155   <none>          80/TCP         13h
nginx-svc    LoadBalancer   10.106.176.102   172.25.12.100   80:32311/TCP   12h
[root@server2 ~]# curl 10.110.166.42
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# curl 10.106.176.102
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# kubectl get pod -L app
NAME                          READY   STATUS    RESTARTS   AGE   APP
demo-6d4f5bf58f-djlnv         1/1     Running   0          12h   nginx
demo-6d4f5bf58f-r49bq         1/1     Running   0          12h   nginx
demo-6d4f5bf58f-ztt7j         1/1     Running   0          12h   nginx
demo-dep-6b46986cc6-2hw9d     1/1     Running   0          51s   demo
demo-dep-6b46986cc6-nxtbp     1/1     Running   0          51s   demo
demo-dep-6b46986cc6-z4klp     1/1     Running   0          51s   demo
deployment-59dff4cf5d-fnhhb   1/1     Running   0          13h   myapp
deployment-59dff4cf5d-h56kz   1/1     Running   0          13h   myapp
deployment-59dff4cf5d-j7b7h   1/1     Running   0          13h   myapp

K8s------Metallb实现Load Balancer服务_第9张图片

  • 应用文件:kubectl apply -f deploy.yaml

K8s------Metallb实现Load Balancer服务_第10张图片
K8s------Metallb实现Load Balancer服务_第11张图片
应用文件:kubectl apply -f nginx-svc.yml

---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

查看服务的信息:kubectl get svc
在这里插入图片描述

K8s------Metallb实现Load Balancer服务_第12张图片
查看指定命名空间的服务信息:kubectl -n ingress-nginx get svc

在这里插入图片描述
应用文件:kubectl apply -f ingress.yaml

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
spec:
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80

在这里插入图片描述
查看ingress的信息:kubectl get ingress

在这里插入图片描述

过滤端口:netstat -antl|grep :80,外部访问服务不是通过暴露端口实现
在这里插入图片描述

查看ingress-demo 的详细信息:kubectl describe ingress ingress-demo

K8s------Metallb实现Load Balancer服务_第13张图片

测试:

  • 编辑测试主机的dns解析文件

K8s------Metallb实现Load Balancer服务_第14张图片

  • 查看pod的信息

在这里插入图片描述

  • 可以通过域名访问服务

在这里插入图片描述
(2)加密

原理:client——>vip(metallb)——>ingress-nginx——>nginx-svc——>pod

(1)生成加密文件:

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=www1.westos.org/O=www1.westos.org" kubectl create secret tls tls-secret --key tls.key --cert tls.crt

(2)应用文件:kubectl apply -f ingress.yaml

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
spec:
  tls:
    - hosts:
      - www1.westos.org
      secretName: tls-secret
  rules:
 - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80
  • 查看ingress-demo的详细信息:kubectl describe ingress ingress-demo

K8s------Metallb实现Load Balancer服务_第15张图片
测试

  • 加密后不能通过域名访问服务

K8s------Metallb实现Load Balancer服务_第16张图片

在浏览器端访问:忽略警告后可以在浏览器页面访问
K8s------Metallb实现Load Balancer服务_第17张图片
K8s------Metallb实现Load Balancer服务_第18张图片
K8s------Metallb实现Load Balancer服务_第19张图片
K8s------Metallb实现Load Balancer服务_第20张图片

你可能感兴趣的:(企业部分,K8s)