Kubernetes
修改 Kubernetes Kube Proxy IPVS scheduler mode
由於 kube-proxy 在 ipvs scheduler 的模式是 rr,這篇會教學如何在 kubernetes cluster 裡面改變 ipvs scheduler 的模式。
環境
目前有三台 node 所組成的 kubernetes cluster
1 | kubectl get nodes -o wide |
Kubernetes 裡面有一個 hello world deployment,並使用 NodePort 暴露 8080 port 的位置。
1 | kubectl get all |
使用 ipvsadm 查看 ipvs 的 scheduler 模式,目前的模式是 rr。
1 | ipvsadm -ln |
下一節將說明如何修改 ipvs scheduler 的方法。
方法
首先,IPVS scheduler 的設定是在 kube-proxy 的 ConfigMap 裡面。
1 | kubectl edit cm kube-proxy -n kube-system |
將 data.config.conf.ipvs.scheduler 裡的參數修改成其他的 scheduler 模式:
1 | data: |
在 Service: IPVS proxy mode 裡面有提供以下的 scheduler 的模式:
- rr: round-robin
- lc: least connection (smallest number of open connections)
- dh: destination hashing
- sh: source hashing
- sed: shortest expected delay
- nq: never queue
或參考 IPVS wiki
刪除原有的 kube-proxy 的 pod,daemonset.apps/kube-proxy 會自動重新建立新的 kube-proxy Pod。
1 | kubectl delete -n kube-system $(kubectl get all -n kube-system | grep pod/kube-proxy | cut -d ' ' -f 1) |
再次使用 ipvsadm 查看 ipvs 的 scheduler 就會是修改後的狀態。
1 | ipvsadm -ln |
Reference
RBAC Kubernetes 安裝 helm
環境
- Google Kubernetes Engine
- Kubernetes version 1.12.8
- Helm version 2.14.1
安裝 Helm without RBAC
Helm 是 Kubernetes 的管理工具,Tiller 則是 API server,至於之間的差別,Helm 是 Client 端,Tiller 是 Server 端。輸入以下指令會安裝 Helm 和 Tiller:
1 | helm init |
官方文件建議加上 –history-max 參數,限制最大歷史指令的數量,如果沒有設定最大歷史記錄,則永遠保留歷史記錄。
1 | helm init --history-max 200 |
##設定 RBAC
在雲端平台上,由於有安全性的問題,如果不設定 RBAC,之後可能會無法正常使用,所以需要提供足夠的權限給 tiller,輸入以下指令建立權限,ServiceAccount 的名稱為 tiller:
1 | kubectl create serviceaccount --namespace kube-system tiller |
套用 tiller 的 ServiceAccount 到已經現有的上
1 | kubectl patch deployment --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}' |
安裝 Helm with RBAC
所有設定一次到位,在 helm init 的時候,加了 –service-account 參數,直接套用 ServiceAccount:
1 | kubectl create serviceaccount --namespace kube-system tiller |
測試
1 | helm install --name my-db stable/influxdb |
查看套件清單
1 | helm ls |
刪除測試檔案,–purge 參數可以徹底刪除,不留下任何記錄,名稱可以透過上面的指令查詢:
1 | helm delete --purge my-db |
解除安裝 Helm
1 | kubectl -n kube-system delete deployment tiller-deploy |
Reference
在 kubernetes 上建立 influxdb 1.7.7
環境
- Google Kubernetes Engine
- Kubernetes 版本為 1.12.8
建立 Secret
Kubernetes secret 可以存放重要訊息,像是使用者密碼之類,不適合暴露在外。
設定以下參數,稍後提供給 influxdb 使用:
- INFLUXDB_DATABASE:資料庫名稱
- INFLUXDB_HOST:主機名稱
- INFLUXDB_USERNAME:使用者名稱
- INFLUXDB_PASSWORD:使用者密碼
1 | kubectl create secret generic influxdb-creds \ |
輸入以下指令檢查參數是否設定完成:
1 | kubectl get secrets |
密文型態為 Opaque,裡面有四筆資料
建立儲存空間 Persistent Volume Claim (PVC)
使用 Kubernetes PVC 宣告儲存空間,將儲存空間命名為 influxdb,容量大小 2GB:
1 | # pvc.yaml |
套用設定:
1 | kubectl apply -f pvc.yaml |
建立 Deployment
直接使用 Docker Hub 上的 influxdb,版本為 1.7.7
1 | kubectl run influx-deployment --image=influxdb:1.7.7 |
套用 Secret
套用先前設定的 influxdb-creds Secret,輸入以下指令進入修改模式:
1 | kubectl edit deployment influxdb |
在 spec.template.spec.containers 位置加入 kubernetes secret:
1 | spec: |
套用 Persistent Volume Claim (PVC)
套用先前設定的 influxdb PVC,輸入以下指令進入修改模式:
1 | kubectl edit deployment influxdb |
在 spec.template.spec.volumes 位置加入 Persistent Volume Claim (PVC):
1 | spec: |
並且在 spec.template.spec.containers.volumeMounts 位置加入 Persistent Volume (PV):
1 | spec: |
最後整份文件的結果會長得如下:
1 | apiVersion: apps/v1 |
Expose Service
這裡使用 LoadBalancer 來 expose 我們的服務,需要有雲端平台的支援:
1 | kubectl expose deployment influx-deployment --name=influx-service --type=LoadBalancer --port=8086 --target-port=8086 |
若 EXTERNAL-IP 顯示為 pending,則再過一陣再重輸入一次。
1 | kubectl get service |
看到 IP address 就代表完成了,接下來就測試看看是否能連進 server。
測試
從是否能從外部連進來:
1 | influx --version |
Reference
在 Ubuntu 上重新安裝 Kubernetes
介紹
Kubeadm 有提供一個指令 reset,不過他只會將有關 Kubernetes 的東西刪除,像是 flannel、cni 的網路設定,則必須要手動刪除。
這裡使用的環境是:
- Ubuntu 18.04
- Kubernetes 1.14.1
- Flannel 0.10.0
Problem
要讓問題重現,只需要在你安裝好 Kubernetes Cluster 之後,重設 Kubernetes 就會發生:
1 | kubeadm reset -f |
這個時候你的 coredns 會一直在 pending 的狀態,而且 nodes 會一直是 NodReady:
1 | kubectl get nodes |
看一下 kubelet 是什麼問題,猜測是之前的 CNI 沒有清除乾淨,而套用到舊的資料
1 | systemctl status kubelet |
Step by Step
接下來就一步一步的解決這個問題,首先切換成 root 權限:
1 | sudo su - |
先把 Kubernetes 重設,-f 參數代表強制執行 reset,不會跳出提示訊息的確認:
1 | kubeadm reset -f |
停止 kubelet、docker:
1 | systemctl stop kubelet |
完全刪除 cni、flannel 的資料:
1 | rm -rf /var/lib/cni/ |
移除 cni、flannel 的網路介面卡:
1 | ifconfig cni0 down |
重新啟動 docker:
1 | systemctl start docker |
這樣就完成了,最後檢查一下網路介面卡與 IP table 有沒有 flannel、cni:
1 | ifconfig |
沒有在這上面就成功了。
後續安裝可以參考我寫的這篇文章:Bare Metal 在 Ubuntu 上安裝 Kubernetes
Summary
最後要輸入指令的時候,需要對 Master 跟 Worker 執行不同的指令,以及在不同的權限下執行:
- Master:代表主結點。
- Node:代表 Worker 節點或子結點。
[Master, Node] 不管事 master 跟 worker 都要執行 Kubernetes Reset,在執行時要注意權限是否正確:
1 | root |
[Master] 安裝 Kubernetes:
1 | root |
注意要切換使用者:
1 | user |
[Node] 加入 worker 節點:
1 | root |
Reference
管理多個 Kubernetes Cluster:建立、切換、合併 context
用途
要存取某個 Kubernetes 的 cluster,必須先設定好 Kubernetes 的 context,context 裡面會描述要如何存取到你的 Kubernetes 的 cluster。
當你今天有兩個 Kubernetes 的 cluster 的時候,分別是正式版的 cluster 跟測試用的 cluster,很頻繁在這兩個 cluster 作切換,這時候只需要分別對兩個不同的 context 就可以了,然後利用 kubectl 提供的指令,就能在不同的 cluster 作切換。
雖然目前還用不到兩個 cluster,但我還是建議先設定這個檔案,因為在還沒有設定這個檔案前,你可能會需要 ssh 遠端回你的主機才能使用 kubectl 指令,不過你可以在本地端設定這份檔案,就不需要遠端回你的主機了。
能夠有這些方便的功能,都是建立在你已經在本地端建立好你的設定檔。
Context
在 Kubernetes 裡面,切換不同的 cluster 是以 context 為單位,一個 context 裡面必需要三個元件,分別是 User、Server、Certification。這三個東西說起來也很直觀,有個使用者 (User) 必須要有憑證 (Certification) 才能連到某個 Cluster (Server)。
底下是一個 Context 所包含的內容:
1 | +---------------+ |
Server 跟 Certification 會一起放在 Cluster 底下,這麼做的好處是,如果今天有兩個不同的使用者,想要連到同一個 Cluster,則不需要重新輸入一次 Certification 跟 Server。
通常設定檔會放在 $HOME/.kube/
底下,然後檔名命名為 config
,不需要副檔名,當你使用 kubectl 指令的時候,預設就會使用這個設定檔。
這裡提供一個設定檔的範例,裡面的架構就如同上面的圖,可以對照著看,我也加了些註解:
1 | # $HOME/.kube/config |
如果路徑正確,檔名正確,設定內容正確,就能看一下我們目前狀態:
1 | kubectl config get-contexts |
第二欄 NAME 就是 context 的名稱,透過 use-context 指令就能夠在不同的設定檔作切換:
1 | kubectl config use-context <context-name> |
像是這樣:
1 | kubectl config use-context minikube |
路徑
尋找設定檔的優先順序:
- 優先使用環境變數
$KUBECONFIG
所設定的路徑 - 如果沒有設定
$KUBECONFIG
環境變數,則使用${HOME}/.kube/config
假設想要使用其他的設定檔 /tmp/admin.conf
,那可以這樣輸入:
1 | export KUBECONFIG=/tmp/admin.conf |
這看起來並不是非常好用,如果你要切換某個 context 的時候,還需要設定 KUBECONFIG
的路徑,如果能把所有 context 整合在一起就會好用多了。
Merge
Kubernetes 目前並沒有 kubectl config merge
的指令,不過在未來可能會有,有興趣的話可以參考這篇 Github 上的討論。
暫時性
目前解決方法是用冒號 : 將不同的檔案串在一起,放在越前面的檔案,順位越高:
1 | export KUBECONFIG=${HOME}/.kube/config:/tmp/admin.conf |
或是在每次輸入指令前都加上 KUBECONFIG
的設定:
1 | KUBECONFIG=${HOME}/.kube/config:/tmp/admin.conf kubectl config get-contexts |
永久性
直接寫進 bashrc,每當開啟終端機的時候都會套用環境變數:
1 | ~/.bashrc |
一勞永逸地做法,把新的檔案跟 ${HOME}/.kube/config
合併:
1 | KUBECONFIG=${HOME}/.kube/config:/tmp/admin.conf kubectl config view --flatten > mergedkub && mv mergedkub ${HOME}/.kube/config |
另外還有腳本:
1 | ~/.bashrc |
使用方法:
1 | kmerge /tmp/admin.conf |
Reference
在本地端上建立 Kubernetes Dashboard
Installation
在安裝 Dashboard 之前,請先確認你的 Kubernetes 已經裝好了,至於怎麼安裝 Kubernetes 就自行 Google 拉。
接下來我們要開始安裝 Github Kubernetes Dashboard,官網上其實已經說明的很清楚,不過這裡在記錄一下安裝的過程:
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml |
沒有錯,這樣就安裝好了,然後看一下正在運行的容器:
1 | kubectl get all -n kube-system -l k8s-app=kubernetes-dashboard |
Access
接下來我們要連到 Dashboard,先把 kubectl proxy 打開:
1 | kubectl proxy |
然後連到下面的網址,就能夠看到 Kubernetes Dashboard:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
到這裡就已經可以看到登入畫面了,不過這裡要注意的是,如果你是使用 ssh 連到你的主機的話,要先在本地端設定好 kubectl,在本地端輸入 kubectl proxy
建立 RBAC
Service Account
建立一個 service 的帳戶
1 | apiVersion: v1 |
ClusterRoleBinding
將剛剛建立的 Service Account admin-user 與 ClusterRole 做綁定
1 | apiVersion: rbac.authorization.k8s.io/v1 |
這樣就這定好了
Login with Token
生成 admin-user 的 token:
1 | kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') |
最後登入的時,使用 Token 登入,將 Token 複製貼上就能夠登入了。
Trouble Shooting
Address already in use
如果你是背景執行 proxy 指令的話:
1 | kubectl proxy & |
在這個時候,沒有關掉這個程式,直接關掉終端機,再次執行則會發現 port 已經被佔用了,顯示的錯誤如下:
1 | F0422 16:14:59.688258 15922 proxy.go:158] listen tcp 127.0.0.1:8001: bind: address already in use |
方法一
如果你執行 proxy 的終端機還開著,可以使用 fg 指令把程式叫回,在按 Ctrl-C 即可:
方法二
萬一你把執行 proxy 的終端機關閉了,則必須先找到執行 proxy 的執行緒 pid:
1 | netstat -tulp | grep kubectl |
找到 pid,上面的例子的 pid 是 15908,然後程式強制刪除:
1 | kill -9 <pid> |
Reference
Kubernetes MetalLB Load Balancer 設定多個 address pool
Before Start
首先你先要安裝好:
- Kubernetes 1.9 版以上,以及可以使用 kubeadm、kubectl 、kubelet 指令
- MetalLB Layer2 Load Balancer
由於我們會使用 bgp 的 protocol,可以直接在 minikube 上使用,如果你是在 bare metal 上操作的話,必須做額外的設定,可以參考官方文件。
Configure Load Balancer
MetalLB 設定 Load Balancer 需要提供 ConfigMap 裡面包涵我們給定的網段範圍
會需要分別使用不同的 address pool 是有原因的,有申請過網路的都知道,固定 IP 是很貴的,而且數量有限,只會在有需要的時候才會使用公開固定 IP 網域池,像是產品 production 的網頁。
至於其他還在測試 staging 的網頁,使用私人網域池即可,最後在設定個 VPN 連線進來看,就能夠減少申請固定 IP 的費用。
這裡我們建立了兩個網域池,相關的設定如下:
1 | # configmap.yaml |
address pool 1 | address pool 2 | |
---|---|---|
名稱 | production | staging |
協定 | bgp | bgp |
網段 | 17.95.16.28-17.95.16.32 | 192.168.144.0/20 |
這裡假設我們申請到這個範圍的固定 IP 17.95.16.28-17.95.16.32,可以供 Load Balancer 來分配。
至於設定 avoid-buggy-ips: true
參數的話, MetalLB 避免 .0 跟 .255 的 IP。
如果想要手動指派 IP 的話,可以設定成 auto-assign: false
,不設定的話預設是 true
。
寫好設定檔,我們就立即套用它:
1 | kubectl apply -f configmap.yaml |
測試
現在我們來測試剛剛設定的 Load Balancer 有沒有成功。
我會執行兩份 deployment,一個會使用 production 的網域池,另一個會使用 staging 的網域池,兩個設定檔分別是:
1 | # hello-production.yaml |
1 | # hello-staging.yaml |
這裡需要在 metadata.annotations 裡面設定 metallb.universe.tf/address-pool: staging 參數,後面接值必須跟前面 ConfigMap 裡 address pool 的名稱一樣。
1 | metadata: |
然後套用設定:
1 | kubectl apply -f hello-production.yaml,hello-staging.yaml |
查看我們現在正在運行的容器與網路設定:
1 | kubectl get pods |
有被分配到外部固定 IP 的 service,就能夠使用透過外面的網路連進來,可以馬上找其他電腦來試試。
Reference
MetalLB 在 Kubernetes Bare Metal 上安裝 Layer 2 Load Balancer
準備
假設你已經先裝好 Kubernetes cluster 了,由於是 bare metal,你必須把 Kubernetes 裝載三台不同電腦上,或是使用三個 Raspberry Pi,然後使用 kubeadm
指令串起來。
Cluster Addresses
我們現在有三台電腦,它的名稱與 IP 分別是:
Master:192.168.1.100
Node1:192.168.1.101
Node2:192.168.1.102
當你在安裝電腦時,名稱與 IP 必須是唯一的,否則在 join 的時候會出現錯誤。
這裡使用的 IP 是 DHCP 所分配的 IP,IP 的範圍是 192.168.1.100—192.168.1.150
,如果你有足夠的 public IP address,可以分別對每台電腦做設定。
假設我申請了
17.95.16.0-17.95.16.32
,就可以把 IP 設定成這樣:
- Master:17.95.16.1
- Node1:17.95.16.2
- Node2:17.95.16.3
雖然只用了三個,但我們保留剩下的
17.95.16.10-17.95.16.32
讓 Load Balancer 來分配這些網址
Metallb
安裝 metallb 的步驟非常的簡單:
1 | kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml |
然後查看目前的狀態,是否有一個 controller 跟多個 speaker:
1 | kubectl get pods -n metallb-system |
因為我們還沒有提供 load balance 的網址給他,所以接下來要設定 ConfigMap
Configure
架設我們想提供 load balance 的網址是 192.168.1.240-192.168.1.250
,看一下我們的設定檔:
1 | apiVersion: v1 |
我們把 protocol: layer2
套用在 192.168.1.240-192.168.1.250
這個網段上
如果想要使用外網的話,直接把網段的範圍改成外網即可
MetalLB 提供了 layer2 跟 bgp 兩種 protocol,這裡使用 layer2,如果使用 bgp 的話還需要另外做設定,可以參考官方文件。
套用上面的 ConfigMap:
1 | kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/example-layer2-config.yaml |
查看 Log:
1 | kubectl logs -l component=speaker -n metallb-system |
測試
執行一些簡單的容器,然後使用 LoadBalancer 暴露它:
1 | kubectl run hello-world --image=k8s.gcr.io/echoserver:1.10 --port=8080 --replicas=3 |
查看 pods 是否有在運行
1 | kubectl get pods |
我們現在有外部 IP 了!馬上測試看看能不能連得到:
1 | curl 192.168.1.240:8080 |
如果有看到跟請求 http 有關的資訊的話,就代表你成功了。
Reference
Bare Metal 在 Ubuntu 上安裝 Kubernetes
Docker
在安裝 Kubernetes 前要先安裝好 Docker,可以參考這篇:
在 Ubuntu 18.04 上安裝 Docker CEKubeadm
kubeadm 負責管理節點,可以透過方便的指令將電腦加入 cluster,在這裡我們先定義:
- Master:代表主結點,負責控制與分發任務
- Node:代表子結點,負責執行 Master 所分發的任務
[Master, Node] 安裝 Kubeadm 需要 root 權限:
1 | sudo su - |
[Master, Node] 安裝 kubeadm:
1 | curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - |
apt 安裝 kubeadm 完後會連同 kubelet 跟 kubectl 一起安裝。
[Master] 在 Master 節點上初始化 Kubernetes:
1 | kubeadm init --pod-network-cidr 10.244.0.0/16 |
因為我們是使用 flannel,所以必須加上 --pod-network-cidr
。
我們這邊選擇 flannel 的是因為 flannel 支援 arm。
如果要透過 WIFI 連接網路的話,需要加上 --apiserver-advertise-address=<wifi-ip-address>
參數到 kubeadm init
指令上。
執行 kubeadm init
之後會有一行 kubeadm join
,如果弄丟的話,可以執行下面指令獲得:
1 | kubeadm token create --print-join-command |
[Node] 然後把其他的 node 加進來:
1 | kubeadm join 192.168.0.11:6443 --token 3c564d.6q2we53btzqmf1ew \ |
[Master, Node] 離開 root:
1 | exit |
Kubectl
[Master] 回到使用者模式後執行:
1 | mkdir -p $HOME/.kube |
將 admin.conf
放置到 ~/.kube/config
就會自動抓取設定檔。
[Master] 安裝 flannel,相關文件在 CoreOS 上:
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml |
[Master] 查看目前節點:
1 | kubectl get nodes |
測試
執行一些簡單的容器:
1 | kubectl run kuard --image=gcr.io/kuar-demo/kuard-amd64:blue --replicas=3 |
查看 pods 是否有在運行
1 | kubectl get pods |
使用 LoadBalancer 暴露它:
1 | kubectl expose deployment kuard --type=LoadBalancer --port=80 --target-port=8080 |
查看 Service
1 | kubectl describe service/kuard |
使用 curl 連到 pod 的 endpoint:
1 | curl 10.244.1.5:8080 |
Trouble Shooting
Swap Error
當你用 root 權限執行 kubeadm init
時,會出現 ERROR Swap 的錯誤:
1 | kubeadm init --pod-network-cidr 10.244.0.0/16 |
如果啟用 swap 的話,當你記憶體不夠用的時候,OS 會先把暫時沒有用的資料存到硬碟裡,又稱作為 swap out。相反,OS 需要用到剛剛存在硬碟裡的資料,則會把資料再載入回記憶體裡面,又稱作為 swap in。
使用 Kubenetes 的時候需要停用 swap 這個功能:
1 | swapoff -a |
相關討論在 Github 的 issue 上。
上面的設定在重新開機之後就會失效 swap,要將 swap 完全關掉的話,需編輯 /etc/fstab 這個檔案,將 mount point 在 / 的項目註解掉:
1 | /etc/fstab |
exec format error
由於 CPU 有分 Intel 跟 Arm 的架構,這個問題會發生是因為 Docker image files 是基於某個特定的架構。也就是說,在 Intel 上建立的 Docker file 只能在 Intel 上執行;在 Arm32 上建立的 Docker file 只能在 Arm32 上執行。
所以當你使用 kubectl logs
查看某個 pod 出現如下的錯誤時:
1 | kubectl logs pod/kuard-777c5775cd-lg7kc |
確認你的 Docker image 有支援你 CPU 的架構
Stackoverflow 上的討論
Reference
- Kubernetes Officall Documentation: Setup Docker
- Kubernetes Officall Documentation: Installing kubeadm kubelet kubectl
- CoreOS Flannel
- Error Swap: running with swap on is not supported. Please disable swap
- Error exec user process caused exec format error
- How to safely turn off swap permanently and reclaim the space?
在 Kubernetes Minikube 上安裝 Load Balancer MetalLB
MetalLB
MetalLB 是 Bare metal Kubernetes 的 load balancer,如果原先你使用 --type=LoadBalancer
來暴露你的 port 的話,service 裡的 EXTERNAL-IP
會一直是 pending 的狀態:
1 | kubectl expose deployment hello-world --type=LoadBalancer |
要解決這個方法其實有很多種,你可以使用現有的雲端平台,像是 GCP、AWS 等等,這些雲端平台上都有提供 Load Balancer 的服務,當然你需要付些費用,如果要免費的話,可以自己安裝 OpenStack。
但是我們只需要 Kubernetes 的功能,卻要把整個 OpenStack 安裝好,然後只用其中的 Load Balancer 的話,這個作法實在有點殺雞焉用牛刀。
如同 GitHub 上這篇 issue 所說的,為何不單把 Load Balancer 的服務抽出來安裝就好呢,於是 MetalLB 就這樣誕生了
Installation
首先你必須先安裝好 minikube,minikube 的安裝就自行 google 了,而且還需要對 Kubernetes 的指令有一些基礎。
BGP Router UI
查看 BGP router 狀態,你可以使用網頁查看 BGP router 目前的狀態
1 | kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/test-bgp-router.yaml |
使用 minikube 開啟網頁:
1 | minikube service -n metallb-system test-bgp-router-ui |
MetalLB
安裝最重要的 Metallb,他會在 metallb-system
namespace 底下產生 daemonset speaker
跟 deployment controller
。
1 | kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml |
這時候重新刷新 BGP Router UI 的話,裡面的內容會跟安裝前的不一樣。
ConfigMap
MetalLB 的設定檔是透過 Kubernetes 裡面的 config map 下去做設定的,你必須跟他講他能夠分配的 IP 池,跟一些相關設定。
1 | apiVersion: v1 |
看到後面倒數幾行
- avoid-buggy-ips: true:代表 Load Balancer 在分配 IP 的時候,會從
.1
開始分配,而不會從.0
開始 - 198.51.100.0/24:Load Balancer 能分配的 IP 池
然後我們就套用這些設定吧:
1 | kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/tutorial-3.yaml |
檢查
來跑一些簡單的容器,然後使用 LoadBalancer 暴露它:
1 | kubectl run hello-world --image=k8s.gcr.io/echoserver:1.10 --port=8080 |
使用 kubectl get service
指令查看現在 service 的狀態,可能需要等個幾秒鐘,EXTERNAL-IP
這個欄位就會是 MetalLB 從 IP 池分配給我們的 IP:
1 | kubectl get service |
沒有看到 pending 的話,就代表你成功了。