---
# System prepended metadata

title: metallb - LoadBalancer
tags: [Kubernetes, ' metallb']

---

---
tags: Kubernetes, metallb
description: metallb - LoadBalancer安裝與web樣本.
robots: index, follow
---
<style>

html, body, .ui-content {
    background-color: #333;
    color: #ddd;
}

.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
    color: #ddd;
}

.markdown-body h1,
.markdown-body h2 {
    border-bottom-color: #ffffff69;
}

.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
    color: #fff;
}

.markdown-body img {
    background-color: transparent;
}

.ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a {
    color: white;
    border-left: 2px solid white;
}

.expand-toggle:hover, 
.expand-toggle:focus, 
.back-to-top:hover, 
.back-to-top:focus, 
.go-to-bottom:hover, 
.go-to-bottom:focus {
    color: white;
}


.ui-toc-dropdown {
    background-color: #333;
}

.ui-toc-label.btn {
    background-color: #191919;
    color: white;
}

.ui-toc-dropdown .nav>li>a:focus, 
.ui-toc-dropdown .nav>li>a:hover {
    color: white;
    border-left: 1px solid white;
}

.markdown-body blockquote {
    color: #bcbcbc;
}

.markdown-body table tr {
    background-color: #5f5f5f;
}

.markdown-body table tr:nth-child(2n) {
    background-color: #4f4f4f;
}

.markdown-body code,
.markdown-body tt {
    color: #eee;
    background-color: rgba(230, 230, 230, 0.36);
}

a,
.open-files-container li.selected a {
    color: #5EB7E0;
}

</style>
# metallb - LoadBalancer
## install
建立namespace。
```shell=
inwin@master:~/metallb$ kubectl create -f ns.yaml
namespace/metallb-system created
```
建立metallb相關policy, RBAC, pod...等。
[metallb定義檔下載](https://raw.githubusercontent.com/google/metallb/v0.9.3/manifests/metallb.yaml "metallb")
```shell=
inwin@master:~/metallb$ kubectl create -f metallb.yaml
podsecuritypolicy.policy/controller created
podsecuritypolicy.policy/speaker created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
role.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
rolebinding.rbac.authorization.k8s.io/pod-lister created
daemonset.apps/speaker created
deployment.apps/controller created

```
## Web應用
建立pool
```yaml=
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: my-ip-space
      avoid-buggy-ips: true
      protocol: layer2
      addresses:
      - 10.12.1.190/30
```

```shell=
inwin@master:~/metallb$ kubectl create -f pool.yaml
configmap/config created
```


建立web deployment，設定副本三份與service port為80，並且指定LB IP。

```yaml=
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: yansheng133/hpa-php5:0.5
        name: hpa-php5
        ports:
        - containerPort: 80
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: web
  name: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  type: LoadBalancer
  loadBalancerIP: 10.12.1.190
```

建立web相關資源。
```shell=
inwin@master:~/metallb$ kubectl create -f web.yaml
deployment.apps/web created
service/web created

inwin@master:~/metallb$ kubectl get po
NAME                   READY   STATUS    RESTARTS   AGE
web-659bcfd49c-55d4k   1/1     Running   0          2m14s
web-659bcfd49c-c885b   1/1     Running   0          2m14s
web-659bcfd49c-snb75   1/1     Running   0          2m14s

inwin@master:~/metallb$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
efkweb       NodePort       10.43.232.132   <none>        80:32100/TCP   25h
kubernetes   ClusterIP      10.43.0.1       <none>        443/TCP        7d1h
web          LoadBalancer   10.43.72.197    10.12.1.190   80:30209/TCP   94s

inwin@master:~/metallb$ curl 10.12.1.190
Source IP:10.42.77.64, Response by: web-659bcfd49c-snb75 -- 2021/08/18 17:32:06
```