Docker
在 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](
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?
在 Ubuntu 上架設 NFS server
思路
NFS (Network File System) 可以透過網路,讓不同的作業系統,分享個別的檔案。
而我想要在 Ubuntu 上建立 NFS Server,透過 Mac 上的 NFS Client 連上。目前的環境:
- Ubuntu 18.04: 192.168.0.10
- Mac OS X Mojave: 192.168.0.20
NFS Server
安裝
1 | ubuntu bare metal |
安裝好之後,會在 /etc
底下會多一個 exports
的檔案,待會我們可以修改這個檔案,來調整想要分享的檔案。
至於 docker 的部分是來自於這個 repo
建立資料夾
我想要把 /tmp/nfs
這個資料夾分享出去,所以先建立這個資料夾:
1 | mkdir -p /tmp/nfs |
資料夾權限
目前 /tmp/nfs
的權限是 root:root
,第一個 root 是 owner 的權限,第二個 root 是 group 的權限:
1 | ls -la /tmp/nfs |
要把檔案分享出去的話,需要修改資料夾的權限為 nobody:nogroup
,且加上 -R
的參數把資料夾底下的所有子資料夾都設為 nobody:nogroup
:
1 | sudo chown -R nobody:nogroup /tmp/nfs |
如果後來又新增檔案的話,必須再重新執行一次這一行指令。
否則在之後 mount 的時後會出現 Operation not permitted
的錯誤:
1 | mount_nfs: can't mount /tmp/nfs from 192.168.0.10 onto ...: Operation not permitted |
設定
修改 /etc/exports
:
1 | sudo vim /etc/exports |
然後把想要分享的檔案加入:
1 | /etc/exports |
至於選項是選擇性填寫的,有很多參數可以選:
ro
:read onlyrw
:read and writeasync
:此選項允許 NFS Server 違反 NFS protocol,允許檔案尚未存回磁碟之前回覆請求。這個選項可以提高性能,但是有可能會讓 server 崩潰,可能會需要重新啟動 server. 或檔案遺失。sync
:只會儲存檔案會磁碟之後才會回覆請求。no_subtree_check
:禁用子樹檢查,會有些微的不安全,但在某些情況下可以提高可靠性。secure
:請求的 port 必須小於 1024,這個選項是預設的。insecure
:請求的 port 不一定要小於 1024。
User ID Mapping 參數:
root_squash
:將 uid 0 的使用者映射到 nobody 匿名使用者,這個選項是預設的。no_root_squash
:關掉 root squash 的選項,這個選項可以使用 root 身份來控制 NFS Server 的檔案。all_squash
:所有登入 NFS 的使用者身份都會被壓縮成為 nobody。anonuid and anongid
:調整匿名使用者的權限,可以讓所有透過 NFS 修改文件,都看起來是同一個使用者。
更多參數的選項可以參考 LInux exports
重新啟動 Server
1 | sudo systemctl restart nfs-kernel-server |
檢查
輸入以下的指令,確認使否把檔案加入 NFS Server:
1 | sudo exportfs |
目前 showmount 的指令會是空的,因為還沒有 NFS Client 連上,如果連上的話,NFS Server 這邊可以使用 showmount 指令查看哪個 Client IP 連過來的:
1 | showmount |
NFS Client
安裝
這台 Ubuntu 的 IP 是 192.168.0.30
1 | ubuntu |
Mount
我想要跟 share 資料夾做分享,使用 mount 指令將遠端的資料夾 /tmp/nfs
掛載到本地端的資料夾 share
:
1 | mac |
注意在 mac 上必須加上 -o resvport
的參數,否則會出現 Operation not permitted
的錯誤。
檢查
輸入以下指令檢查是否掛載成功:
1 | mac, ubuntu |
測試
在 /tmp/nfs
資料夾內建立 test
檔案:
1 | mac, ubuntu |
是否能成功建立
Unmount
1 | mac, ubuntu |