metallb配置

如果你在自己的虚拟机部署k8s, 或是裸金属机, 那么可以使用metallb作为k8s服务类型.

目前metallb有两种模式:

  • Layer2模式(ARP)
  • BGP模式

部署组件

安装namespaces

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/namespace.yaml

安装其他组件

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/metallb.yaml

有可能被墙, 自己找办法

创建密钥

kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

第一次部署时执行, 且只执行一次

Layer2模式

如果使用这个模式, 引用官网的一句话:

If you’re using kube-proxy in IPVS mode, since Kubernetes v1.14.2 you have to enable strict ARP mode.

大概意思是, k8s版本1.14.2+, 如果kube-proxy使用的是ipvs模式, 需要指定--ipvs-strict-arp=1参数

配置

vim config-layer2.yaml
#############################################
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config-layer2
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.104.100-192.168.104.150
  • addresses: 确保和k8s主机在同一网段下(二层可通)

执行

kubectl apply -f config-layer2.yaml

BGP模式

前提是交换机支持bgp, 如果你在公有云上, 比如阿里云, 可能没办法验证这个功能

vim config-bgp.yaml
#############################################
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    peers:
    - peer-address: 192.168.104.64
      peer-asn: 64512
      my-asn: 64511
    address-pools:
    - name: default
      protocol: bgp
      addresses:
      - 172.18.192.0/19
  • peer-address: 这里指向spine router, 不能指向TOR router
  • peer-asn: 自定义的as
  • my-asn: 这个随意, 一般使用peer-asn - 1
  • addresses: 指向一个对外服务的地址池, 我这里指向的pod地址池的一部分

metallb和calico配合不是很容易, 里面有些issue需要calico去解决, 具体问题请查阅ISSUES WITH CALICO

执行

kubectl apply -f config-bgp.yaml

部署服务验证

vim my-nginx.yaml
#############################################
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: my-nginx
  type: LoadBalancer

和其他服务部署差异不大, 只是修改了type类型

直接访问, 可达

展示评论