Installation
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 18.04 上安裝 Docker CE
安裝環境是在 Ubuntu 18.04 上。
安裝 Docker CE
docker.io 是 docker 的舊版本,如果先前有安裝要移除舊版本:
1 | sudo apt-get remove docker docker-engine docker.io containerd runc |
安裝相關套件:
1 | sudo apt-get install -y \ |
匯入 docker apt repository:
1 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
安裝 docker ce:
1 | sudo apt-get install -y docker-ce docker-ce-cli containerd.io |
建立 daemon:
1 | root |
啟用 Docker:
1 | sudo systemctl start docker.service |
加入使用者權限,加完後記得要重新開啟終端機:
1 | sudo groupadd docker |
安裝完成
1 | docker --version |
Reference
- Get Docker CE for Ubuntu
- Post-installation steps for Linux
- [Kubernetes Officall Documentation: Setup Docker](
在 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
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?