環境:
3塊樹莓派4B 4G內存版
三張16G內存卡
網絡交換方式:
wifi
啓用角色:root
系統:
樹莓派官方最小系統
基於Debian 10
內核:
64位 4.19版本
最終效果:
root@k8smaster:/home/pi# kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-5644d7b6d9-8kml9 1/1 Running 7 23h 10.244.0.5 k8smaster <none> <none>
kube-system coredns-5644d7b6d9-w72lj 1/1 Running 8 23h 10.244.0.4 k8smaster <none> <none>
kube-system etcd-k8smaster 1/1 Running 2 23h 192.168.1.2 k8smaster <none> <none>
kube-system kube-apiserver-k8smaster 1/1 Running 2 23h 192.168.1.2 k8smaster <none> <none>
kube-system kube-controller-manager-k8smaster 1/1 Running 3 23h 192.168.1.2 k8smaster <none> <none>
kube-system kube-flannel-ds-arm-67tll 1/1 Running 0 99m 192.168.1.4 k8snode2 <none> <none>
kube-system kube-flannel-ds-arm-c74z4 1/1 Running 39 23h 192.168.1.2 k8smaster <none> <none>
kube-system kube-flannel-ds-arm-prjdj 1/1 Running 0 95m 192.168.1.3 k8snode1 <none> <none>
kube-system kube-proxy-n6njb 1/1 Running 0 99m 192.168.1.4 k8snode2 <none> <none>
kube-system kube-proxy-zd7tl 1/1 Running 0 95m 192.168.1.3 k8snode1 <none> <none>
kube-system kube-proxy-zt9gv 1/1 Running 2 23h 192.168.1.2 k8smaster <none> <none>
kube-system kube-scheduler-k8smaster 1/1 Running 3 23h 192.168.1.2 k8smaster <none> <none>
本次涉及使用軟件:
- balenaEtcher系統燒錄工具,來源於樹莓派官方網站
- 樹莓派4官方系統最小版,來源於樹莓派官方網站
- Ansible,開源自動化運維工具,來源於apt安裝
- Docker相關三個組件,來源於docker官方開源下載地址,原生樹莓派版本
- Kubernetes arm版本組件
開始:
- 向內存卡刷入系統
- 刷完後在boot啓動盤的根目錄新建ssh空文件,注意沒有任何後綴名,該文件意味着開啓遠程ssh
- 在根目錄新建wifi連接配置文件,文件名:wpa_supplicant.conf,內容如下:
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="wifi名稱"
psk="WiFi密碼"
key_mgmt=WPA-PSK
priority=1
}
注意加密方式key_mgmt需要和路由器WiFi的加密方式一致,可以添加多個network表示多個wifi,priority權重越高優先級越高,連接影藏的wifi時在network中還需添加參數scan_ssid=1
- 通過路由器管理頁面得到連接的樹莓派ip地址,遠程ssh登錄該派,初始只能以默認賬戶pi登錄,密碼位raspberry,
- 設置root密碼啓用root遠程ssh:
sudo passwd root
設置密碼
修改:/etc/ssh/sshd_config文件,修改使得已下兩個參數值並生效,該參數開啓root用戶ssh權限
PermitRootLogin yes
PubkeyAuthentication yes
--ansible部分--
- 設置免登錄互通,爲ansible控制做好準備
在各個主機生成ssh免密登錄密鑰
生成密鑰,
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ''
cd /root/.ssh
ls
id_rsa id_rsa.pub
定義一臺主機爲ansible主機並獲取其他被控主機的密鑰使其能免密登錄控制主機
修改被控主機配置文件權限
ssh-copy-id 192.168.1.3
ssh-copy-id 192.168.1.4
- 選定ansible的主機安裝ansible <非必須,ansible只是批量運維工具,不會的可以一臺一臺手動安裝>
echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu bionic main" | sudo tee -a /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
apt update
apt install ansible -y
ansible –version
- 編輯/etc/ansible/hosts文件,把三臺機器ip添加爲一個組:pi組
- 由於已經開通了ssh免密登錄,ansible到這裏已是默認爲可用狀態,若是ansible不可用需要解決或者每臺機器手動重複操作纔可進行已下步驟
注:ansible命令中 -a 後面接的命令可以直接拿出來執行,沒有安裝ansible的執行該命令效果一樣
--升級內核部分,建議上64位內核--
10、升級樹莓派內核爲64位
Ansible主機命令:
ansible pi -m command -a ‘rpi-update -y’
在/boot目錄下會下載kernel8.img 內核文件,查看是否存在
ansible pi -m command -a ‘ls /boot’
編輯各主機Nano /boot/config.txt文件,在最後一行添加:arm_64bit=1
這一步我是各主機手動編輯
重啓各主機:
ansible pi -m command -a ‘reboot now’
重啓後各主機uname -a查看內核版本是否爲64位
- 默認已升級到64位內核,截至到文檔編輯時間,版本爲4.19
root@k8snode2:/home/pi# uname -a
Linux k8snode2 4.19.97-v8+ #1294 SMP PREEMPT Thu Jan 30 13:27:08 GMT 2020 aarch64 GNU/Linux
修改三主機的hostname 和 hosts,文件都在/etc/目錄下,我的node節點如下:
root@k8smaster:/home/pi# ansible pi -m command -a 'cat /etc/hostname'
[WARNING]: Platform linux on host 192.168.1.3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.3 | CHANGED | rc=0 >>
k8snode1
[WARNING]: Platform linux on host 192.168.1.4 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.4 | CHANGED | rc=0 >>
k8snode2
hosts:
root@k8smaster:/home/pi# ansible pi -m command -a 'cat /etc/hosts'
[WARNING]: Platform linux on host 192.168.1.3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.3 | CHANGED | rc=0 >>
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 raspberrypi_01
192.168.1.2 k8smaster
192.168.1.3 k8snode1
192.168.1.4 k8snode2
[WARNING]: Platform linux on host 192.168.1.4 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.4 | CHANGED | rc=0 >>
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 raspberrypi_02
192.168.1.2 k8smaster
192.168.1.3 k8snode1
192.168.1.4 k8snode2
--爲k8s 準備,內核參數調整--
- 禁用swap
編輯
/etc/dphys-swapfile
修改
CONF_SWAPSIZE=0
注意註釋掉
CONF_SWAPSIZE會讓系統自動分配swap大小,所以禁用是讓
CONF_SWAPSIZE=0
12、重啓各系統確保swap設定沒問題,free -m查看swap設定,swap各項爲0則正常
root@k8snode2:/home/pi# free -m
total used free shared buff/cache available
Mem: 3807 156 3301 8 349 3573
Swap: 0 0 0
--離線安裝 arm版本docker,本次使用方法2—
13、安裝docker,本次採用下載包方式:
更新系統
apt-get update
更新軟件包傳輸方式
apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
lsb-release \
software-properties-common
方法一:
添加docker GPG 密鑰源,有網絡的情況下可以apt,無網絡忽略
國內:
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian/gpg | sudo apt-key add -
官方:
curl -fsSL https://download.docker.com/linux/raspbian/gpg | sudo apt-key add -
添加dockers源
nano /etc/apt/sources.list
deb https://apt.dockerproject.org/repo/ raspbian-RELEASE main
安裝docker
apt-get update
apt-get install docker
方法二:
如果方法一不能直接apt install,那麼就需要做源碼安裝準備
下載arm docker-ce docker-cli containerd.io三個源碼包
https://download.docker.com/linux/raspbian/dists/buster/pool/stable/armhf/
此鏈接爲樹莓盤官方鏈接
https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/
磁鏈接爲Debian arm設備連接,本次在第一個鏈接下載三個包,本次三個包爲:
containerd.io_1.2.10-3_armhf.deb docker-ce_19.03.6_3-0_raspbian-buster_armhf.deb docker-ce-cli_19.03.6_3-0_raspbian-buster_armhf.deb
注意:如果要做docker集羣,請選擇下載和已存在的docker相同版本源碼包
安裝源碼包,順序:docker-ce-cli containerd.io docker-ce
例:dpkg -i containerd.io_1.2.10-3_armhf.deb
本次安裝命令:
上傳文件到ansible主機後複製到其他主機:
ansible pi -m copy -a ‘src=/app/docker/ dest=/app/’
安裝:
Ansible pi -m command -a ‘dpkg -i /app/docker/ docker-ce-cli_19.03.6_3-0_raspbian-buster_armhf.deb’
Ansible pi -m command -a ‘dpkg -i /app/docker/ containerd.io_1.2.10-3_armhf.deb’
Ansible pi -m command -a ‘dpkg -i /app/docker/ docker-ce_19.03.6_3-0_raspbian-buster_armhf.deb’
啓動docker:
Ansible pi -m command -a ‘systemctl start docker’
Ansible pi -m command -a ‘systemctl status docker’
直接啓動可能會啓動失敗,journalctl -xe日誌報錯:
docker.socket: Failed with result 'service-start-limit-hit'
解決:刪除/etc/docker目錄下的json文件,重啓服務器
rm -f /etc/docker/key.json
Reboot
啓動docker和加入開機自啓
Ansible pi -m command -a ‘systemctl enable docker’
注意:當前docker的cgroup還不是system,我們之後再同一調整配置文件
--安裝K8S—
14、k8s安裝
需要準備工作:
- docker啓動的cgroup和k8s的cgroup需要調整爲一致的
docker默認cgroup driver是cgroupfs,所以需要把docker的和k8s的cgroup driver同一調整爲system,使其保障一致
在docker的配置文件目錄下新建system的cgroup配置文件,並重啓進程和docker:
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl restart docker
修改各主機hosts文件,添加主機名
內容如下:
192.168.1.2 k8smaster
192.168.1.3 k8snode1
192.168.1.4 k8snode2
Master機器爲ansible安裝主機,同時也用作k8s管理節點主機
各主機開啓ipv4轉發,由於liunx系統默認是關閉ipv4轉發的,如果k8s用到ipvs網絡模式,或calico網絡模式,需要ipv4轉發支持,爲了後面網絡模式選擇的擴展性,在這裏先打開各主機的ipv4轉發功能,操作:
Nano /etc/sysctl.conf
取消net.ipv4.ip_forward = 1
ipv4轉發功能的註釋,開打轉發功能
保存後執行使得修改生效:
Sysctl -p
備註:
什麼是ipv4轉發:出於安全考慮,Linux系統默認是禁止數據包轉發的。轉發即當主機擁有多於一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將數據包發往本機另一塊網卡,該網卡根據路由表繼續發送數據包。這通常是路由器所要實現的功能。
kube-proxy的ipvs模式和calico(都涉及路由轉發)都需要主機開啓ipv4轉發。
另外,不使用k8s,即使只使用docker的時候,以下兩種情況也依賴ipv4轉發:
<1>當同一主機上的兩個跨bridge(跨bridge相當於跨網段,跨網絡需要路由)的容器互訪
<2>從容器內訪問外部
由於樹莓派默認沒有開啓防護強,省略防火牆關閉步驟
由於是wifi模式而沒有使用交換機,所以需要固定局域網ip,方法:
nano /etc/dhcpcd.conf
添加網卡靜態ip:
# 可以通過 $ ifconfig 進行查看wifi網卡名
interface wlan0
# 靜態IP地址:192.168.1.2/24表示子網掩碼爲 255.255.255.0
static ip_address=192.168.1.2/24
# 路由器/網關IP地址
# static routers=192.168.1.1DNS服務器
static domain_name_servers=192.168.1.1
接着重啓設備,IP即更換爲靜態IP了。
Reboot now
注意:三臺機器都需要設定爲靜態ip,我把:
Master設定爲:192.168.1.2
兩個node設定爲:192.168.1.3 192.168.1.4
注意配置靜態IP後同時要設定網關和dns,因爲設定靜態ip後主機不會自動去獲取網關,所以不設定網關無法連接網絡,網關一般是路由器的192網段的起始位,有的路由器是192.168.1.1 有的路由器是192.168.0.1,根據自己路由器網段設定網關;
在此,以確定固定ip並確保網絡能夠訪問
之前的docker配置文件中我們讓cgroup改爲systemctl,繼續調整docker配置文件,這裏禁用docker操作iptable,注意由於docker新版本改用json格式的配置文件策略,在以往以命令加參數調整docker的形式現在都可以在配置文件中直接添加或修改參數使其永久生效,由於格式是json形式,這裏直接在/etc/docker/daemon.json這個配置文件中添加參數:
Nano /etc/docker/daemon.json
內容如下:
root@raspberrypi03:/etc/docker# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"iptables": false
}
該修改各個主機的docker配置文件都要修改
注:docker配置文件,默認沒有的參數可以添加上去,按照json格式即可,第一次調整的時候沒有限制iptable,由於採用k8s,所有iptable由K8S控制,不讓docker控制,所以這次調整禁用掉docker的iptable
檢查swap是否已被禁用
Free -m
--amd架構的安裝可以配置以下docker的源,可實現docker pull直接拉取到amd架構的K8S核心組件鏡像,該鏡像國內幾大docker鏡像源都已同步,由於本次是arm64架構,截止到本文安裝爲止國內源還沒有同步arm64架構的k8s核心鏡像,所以需要離線的方式,離線安裝的方式可以不修改docker鏡像源—
繼續修改docker配置文件,這次添加的參數是修改docker默認鏡像源爲國內源使得amd架構可以簡單快捷安裝,參數是:
registry-mirrors:默認鏡像源
ip-masq:讓docker不再操作k8s的podip,參數值改爲false
graph:docker容器存儲位置,可自定義位置而不是使用默認的/var/lib/docker
這次使用的是中科大源,docker配置文件更新爲:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"iptables": false,
"ip-masq": false,
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"graph": "/app/docker/run"
}
注:離線安裝方式可以忽略添加源這個參數
關於docker的基本配置到這裏就已經可以告一段落,如果docker狀態時running時,需要重啓服務,刷新docker daemon的配置文件,方法:
刷新配置文件
systemctl daemon-reload
關閉docker服務待配置完k8s後再啓動docker
Systemctl stop docker
K8S安裝方式除開第三方腳本自動化,K8S運行需要以下核心組件:
proxy 網絡守護進程,負責隨時與pod和apiserver通信,確保pod網絡能訪問,https協議
apiserver apiserver 服務,統一接口服務,接受並處理請求,https協議
controller-manager 監控控制器管理器,確保控制器管理器健康
scheduler 調度器,負責調度,調度node容器本生
etcd 存儲模塊,共享存儲,KV形式,master主機的存儲放在etcd中以共享存儲方式存在,內部也是集羣形式,集羣通信方式https
coredns 第三版dns插件,第一版和第二版與此不一樣,1.11開始第三版,
pause 基礎鏡像
以上軟件安裝方式有兩種:
1:
Git下載k8s源碼+docker
2:
Git下載kubelet和kubeadm+docker+核心組件的容器鏡像啓動方式
而絕大多數K8S安裝,都選擇用kubeadm方式,最大的原因就是源碼安裝的複雜度,比如K8S核心組件通信走HTTPS協議,那麼每個組件之間的安全認證證書的配置就能耗時很多時間,而kubeadm是官方推出的快捷安裝工具,他把所需的認證證書等很多一些列步驟都自動話完成,並且把核心組件功能也變成容器運行的形式,減少了很多配置的修改和調試。
本次安裝也是通過kubeadm形式安裝,所有的核心組件都已容器運行。
所以第一步要安裝kubeadm kubelet工具,
Kubeadm是一個安裝工具
Kubelet是K8S運行組件
Kubectl是交互的客戶端,所以再node節點上可以不安裝kubectl,因爲大多數情況下我們一般都是對master進行交互控制
在主機能連上外部網絡的前提下,添加k8s源,如果不添加源,apt的時候會報錯找不到kubeadm包
由於國外源被牆,添加阿里雲源,好在阿里雲源現在已經有arm版本的kubeadm了,否則還得去下載安裝包安裝。
系統apt源路徑是掃描/etc/apt/sources.list.d/該路徑下的文件,所以在這裏新建一個kubernetes.list的文件,並向裏面添加阿里雲源地址
tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
添加了apt源,但是不能直接更新,因爲任何一個源都會有密匙驗證才讓連接,所以還需要添加阿里雲源的密匙
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
更新:
Apt update
到此就可以安裝kubeadm了
查看可用的kubeadm版本:
root@raspberrypi03:/home/pi# apt-cache madison kubeadm
kubeadm | 1.17.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.17.2-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.17.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.17.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.16.7-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.16.6-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.16.5-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.16.4-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
kubeadm | 1.16.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main armhf Packages
發現從1.5到1.17.3版本都有,注意不要安裝最新版本,具體原因我最後總結會有說明,模擬實驗的同學可以調整到最後看下總結原因在選擇版本
本次安裝版本爲1.16.2
注意:千萬不要隨便安裝最新版,因爲官方支持的k8s容器功能組件不一定能和最新的k8s要求版本達到一致,最好先去官方看看arm64支持的最新組件版本,地址:
https://hub.docker.com/u/mirrorgooglecontainers/
選擇版本安裝:
apt install -y kubeadm=1.16.2-00 kubectl=1.16.2-00 kubelet=1.16.2-00
使用ansible三臺機器統一安裝命令:
ansible pi -m command -a 'apt install -y kubeadm=1.16.2-00 kubectl=1.16.2-00 kubelet=1.16.2-00'
三臺機器驗證:
root@k8smaster:/etc/default# ansible pi -m command -a 'kubelet --version'
[WARNING]: Platform linux on host 192.168.1.4 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.4 | CHANGED | rc=0 >>
Kubernetes v1.16.2
[WARNING]: Platform linux on host 192.168.1.3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.3 | CHANGED | rc=0 >>
Kubernetes v1.16.2
沒有ansible的按照命令三臺機器都安裝一次即可
Kubernetes安裝工具已安裝完畢,接下來我們要安裝K8S的核心組件,之前已經說過,核心組件本次是以容器的形式運行,所以需要獲取到核心組件的鏡像,致命的是國內還沒有arm鏡像包,由於不可描述的原因,需要下載好鏡像拉取到本地鏡像本地啓動。
查看本版本的k8s所需要的dockesr鏡像有哪些:
root@raspberrypi03:/home/pi# kubeadm config images list
I0303 18:20:14.437356 14048 version.go:251] remote version is much newer: v1.17.3; falling back to: stable-1.16
W0303 18:20:24.438184 14048 version.go:101] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.16.txt": Get https://storage.googleapis.com/kubernetes-release/release/stable-1.16.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
W0303 18:20:24.438253 14048 version.go:102] falling back to the local client version: v1.16.2
k8s.gcr.io/kube-apiserver:v1.16.2
k8s.gcr.io/kube-controller-manager:v1.16.2
k8s.gcr.io/kube-scheduler:v1.16.2
k8s.gcr.io/kube-proxy:v1.16.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/coredns:1.6.2
需要這7個docker鏡像,由於阿里雲在記錄此時沒有提供arm版本的鏡像,所以需要科學上網去官方下載:
https://hub.docker.com/u/mirrorgooglecontainers/
這裏需要找到arm64版本,再找到對應版本鏡像下載
Coredns 沒在mirrorgooglecontainers下,而是在docker官方中直接搜索,地址是:
https://hub.docker.com/r/coredns/coredns/tags/
找到對應的版本,然後通過能夠科學上網的方式下載,本次使用的是洛杉磯服務器,直接在服務器上下載後構建成本地包再ftp拉取回國
下載方式:前提已保障了國外服務器上安裝了docker
docker pull mirrorgooglecontainers/kube-apiserver-arm64:v1.16.2
docker pull mirrorgooglecontainers/kube-controller-manager-arm64:v1.16.2
docker pull mirrorgooglecontainers/kube-scheduler-arm64:v1.16.2
docker pull mirrorgooglecontainers/kube-proxy-arm64:v1.16.2
docker pull mirrorgooglecontainers/pause-arm64:3.1
docker pull mirrorgooglecontainers/etcd-arm64:3.15-0
docker pull coredns/coredns:1.6.2
查看拉取得鏡像:
[root@lovecat v2ray]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mirrorgooglecontainers/kube-apiserver-arm64 v1.16.2 38a5795ebd7e 4 months ago 214MB
mirrorgooglecontainers/kube-controller-manager-arm64 v1.16.2 7995778415ae 4 months ago 160MB
mirrorgooglecontainers/kube-proxy-arm64 v1.16.2 93b1f2ca706e 4 months ago 86.5MB
mirrorgooglecontainers/kube-scheduler-arm64 v1.16.2 439fc795d14c 4 months ago 87.6MB
mirrorgooglecontainers/etcd-arm64 3.3.15-0 a43ab3b259cc 6 months ago 307MB
coredns/coredns 1.6.2 bf261d157914 6 months ago 44.1MB
mirrorgooglecontainers/pause-arm64 3.1 6cf7c80fe444 2 years ago 525kB
把鏡像導入成爲本地文件,便於ftp下載:
# docker save 38a5795ebd7e >/app/dockerimg/apiserver.tar
# docker save 7995778415ae >/app/dockerimg/manager.tar
# docker save 93b1f2ca706e >/app/dockerimg/proxy.tar
# docker save 439fc795d14c >/app/dockerimg/scheduler.tar
# docker save a43ab3b259cc >/app/dockerimg/etcd.tar
# docker save bf261d157914 >/app/dockerimg/coredns.tar
# docker save 6cf7c80fe444 >/app/dockerimg/pause.tar
查看本地的鏡像文件:
ls /app/dockerimg/
apiserver.tar coredns.tar etcd.tar manager.tar pause.tar proxy.tar scheduler.tar
ftp下載所有鏡像
注意:docker save是本地化鏡像,docker export是本地化容器
root@raspberrypi03:/home/pi# docker load < /home/pi/apiserver.tar
186143d216c2: Loading layer [==================================================>] 46.24MB/46.24MB
f838578a7baf: Loading layer [==================================================>] 169.3MB/169.3MB
Loaded image ID: sha256:38a5795ebd7ed854eae85f6053bd1a257cb1d89d28c0a3e152cf8cf25d661d35
root@raspberrypi03:/home/pi# docker load < /home/pi/coredns.tar
225df95e717c: Loading layer [==================================================>] 336.4kB/336.4kB
169c87e3a0eb: Loading layer [==================================================>] 43.89MB/43.89MB
Loaded image ID: sha256:bf261d157914477ee1a5969d28ec687f3fbfc9fb5a664b22df78e57023b0e03b
root@raspberrypi03:/home/pi# docker load < /home/pi/etcd.tar
2b0c00cc40d6: Loading layer [==================================================>] 242.4MB/242.4MB
6bcce10dc7b8: Loading layer [==================================================>] 20.43MB/20.43MB
Loaded image ID: sha256:a43ab3b259cc4fac8f06f7c85e75996cc99f6145448db08267da28c339d5b790
root@raspberrypi03:/home/pi# docker load < /home/pi/manager.tar
6216dc0474b9: Loading layer [==================================================>] 115.2MB/115.2MB
Loaded image ID: sha256:7995778415ae106fc707ddf3adc9b19fe88b9d070e0fa22c47465fbbbab78798
root@raspberrypi03:/home/pi# docker load < /home/pi/pause.tar
32626eb1fe89: Loading layer [==================================================>] 526.8kB/526.8kB
Loaded image ID: sha256:6cf7c80fe4444767f63116e6855bf8c90bddde8ef63d3a2dc9b86c74989a4eb5
root@raspberrypi03:/home/pi# docker load < /home/pi/proxy.tar
5443b3d4b49a: Loading layer [==================================================>] 3.314MB/3.314MB
63f439c4459c: Loading layer [==================================================>] 38.93MB/38.93MB
Loaded image ID: sha256:93b1f2ca706e2effc3d13bfe85a3d0c5ef4336bb47475dcc31471472c27b387b
root@raspberrypi03:/home/pi# docker load < /home/pi/scheduler.tar
a0fb30d3d04d: Loading layer [==================================================>] 43.09MB/43.09MB
Loaded image ID: sha256:439fc795d14c562803c6d58bb00a9ce20113ff22421fceb0db7d61347274c061
注意鏡像導入操作各個主機都需要操作一次
把鏡像tag改爲k8s.gcr.io 的tag,讓kubeadm再啓動的時候在本地就能找到所需鏡像包直接啓動而不需要再去從網絡上pull
root@raspberrypi03:/home/pi# docker tag 38a5795ebd7e k8s.gcr.io/kube-apiserver:v1.16.2
root@raspberrypi03:/home/pi# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7995778415ae 4 months ago 160MB
<none> <none> 93b1f2ca706e 4 months ago 86.5MB
k8s.gcr.io/kube-apiserver v1.16.2 38a5795ebd7e 4 months ago 214MB
<none> <none> 439fc795d14c 4 months ago 87.6MB
<none> <none> a43ab3b259cc 6 months ago 307MB
<none> <none> bf261d157914 6 months ago 44.1MB
<none> <none> 6cf7c80fe444 2 years ago 525kB
root@raspberrypi03:/home/pi# docker tag 7995778415ae k8s.gcr.io/kube-controller-manager:v1.16.2
root@raspberrypi03:/home/pi# docker tag 93b1f2ca706e k8s.gcr.io/kube-proxy:v1.16.2
root@raspberrypi03:/home/pi# docker tag 439fc795d14c k8s.gcr.io/kube-scheduler:v1.16.2
root@raspberrypi03:/home/pi# docker tag a43ab3b259cc k8s.gcr.io/etcd:3.3.15-0
root@raspberrypi03:/home/pi# docker tag bf261d157914 k8s.gcr.io/coredns:1.6.2
root@raspberrypi03:/home/pi# docker tag 6cf7c80fe444 k8s.gcr.io/pause:3.1
root@raspberrypi03:/home/pi# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-controller-manager v1.16.2 7995778415ae 4 months ago 160MB
k8s.gcr.io/kube-proxy v1.16.2 93b1f2ca706e 4 months ago 86.5MB
k8s.gcr.io/kube-apiserver v1.16.2 38a5795ebd7e 4 months ago 214MB
k8s.gcr.io/kube-scheduler v1.16.2 439fc795d14c 4 months ago 87.6MB
k8s.gcr.io/etcd 3.3.15-0 a43ab3b259cc 6 months ago 307MB
k8s.gcr.io/coredns 1.6.2 bf261d157914 6 months ago 44.1MB
k8s.gcr.io/pause 3.1 6cf7c80fe444 2 years ago 525kB、
注意以上修改tag在修改flannel插件的時候arm不要帶64,我帶上64會報錯找不到鏡像,flannel的yml配置文件中讀取到本機的信息好像不是arm64,而是arm,鏡像名去掉64則能直接啓動。
這裏就獲得了離線的k8s容器鏡像組件,接下來就可以啓用k8s組建pod容器了,注意所有的機器都需要這些組件
我是在master機器上安裝好了之後直接scp把所有的包發送到了node上
root@k8smaster:/app/k8s/images# ls
apiserver controller coredns etcd flannel pause proxy scheduler
scp發送到各節點主機:
root@k8smaster:/app/k8s# ansible pi -m copy -a 'src=/app/k8s/images dest=/app/k8s'
192.168.1.3 | CHANGED => {
"changed": true,
"dest": "/app/k8s/",
"src": "/app/k8s/images"
}
192.168.1.4 | CHANGED => {
"changed": true,
"dest": "/app/k8s/",
"src": "/app/k8s/images"
}
Wifi發送的包,可能傳送需要點時間,可以喝杯茶先,注意命令中我有很多自定義的文件夾路徑,可能沒有記錄這些文件夾創建,同樣的node節點中導入docker鏡像也需要改tag;
準備初始化K8S master節點,
首先準備kubeadm的配置文件,配置文件中填寫相關自定義網段,存儲,網絡方式等等,該配置文件爲yaml或json文件,可以通過命令獲取配置文件模板,當然也可以不通過配置文件,直接用參數初始化,參數初始話會自動創建配置文件,本次用的是參數初始化,然後再修改配置文件內容,當然可以直接獲取配置文件模板後直接通過配置文件啓動
獲取模板命令:
kubeadm config print init-defaults ClusterConfiguration >/app/k8s/config/kubeadm.conf
文件路徑可以自定義,配置文件內容
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.2
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: raspberrypi03
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-beijing-aliyuncs.com/imcto
kind: ClusterConfiguration
kubernetesVersion: v1.16.2
networking:
dnsDomain: cluster.local
podSubnet: 192.168.1.3
podSubnet: 192.168.1.4
serviceSubnet: 10.96.0.0/12
scheduler: {}
需要求改的地方已標黃:
imageRepository 鏡像地址改爲國內
kubernetesVersion 版本改爲當前版本
advertiseAddress 主機ip地址
構建集羣需要添加node節點網絡,在networking裏添加
如果不通過改配置文件啓動,那麼就要向我接下來記錄的一樣,通過初始化參數啓動:
創建kubelet的配置文件,該文件爲必須要提前創建的,主要是添加swap禁用參數,cgroup爲system等
新建kubelet配置文件並添加內容:
cat > /etc/default/kubelet <<EOF
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --fail-swap-on=false
EOF
實際上之前我們已經調整了樹莓派上的swap,但是建議這裏還是帶上swap參數
注意kubelet配置文件可以直接複製給node節點使用
初始化K8S
命令1:
kubeadm init --kubernetes-version=1.16.2
命令2:
kubeadm init --kubernetes-version=1.16.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
這兩個命令有何差異?
主要是指定pod網段,你可以不指定service-cidr,它默認就是10.96.0.0,所以帶不帶無所謂,帶上service-cidr可以修改默認參數,而pod network,則是會影響到第三方網絡插件的使用,比如之後安裝的flannel cni接口文件。
當然,第一個直接運行初始化生成的配置文件中不會有:
- --allocate-node-cidrs=true
- --cluster-cidr=10.244.0.0/16
這兩個參數,再之後需要掛載flannel的時候,把參數添加進去刷新配置文件重啓k8s和docker一樣都能實現,由於我兩個都使用過,建議用第二個吧,會讓後面掛載flannel的時候不需要修改配置文件
以上初始化命令只需要再master節點上執行,當出現一下內容時,即代表成功:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
一定要記錄下來加入的key,否則node加不進來:
kubeadm join 192.168.1.2:6443 --token wf3k2x.ptk0004v47p27pzu \
--discovery-token-ca-cert-hash sha256:62d016e62d705445bf4a5bba116045d980c612bb34ab02701e81a6424b84ddba
根據提時,你還需要執行以上的三個命令,最後一個時授權命令,root就可以不用執行了
這時候查看狀態:
Kubectl get nodes
顯示masster noready
原因時沒有網絡插件可用
查看pod狀態
kubectl get pods --all-namespaces -o wide
顯示除了dns pod處於pending狀態以外其他的都running,這時候代表k8smaster已經安裝成功了,接下來需要安裝網絡插件flannel;
--flannel安裝--
由於k8s不提供簡化https通信中認證簡化解決方案,所有由第三方插件解決,通過CNI接口方式,常用:
1、flannel:實現網絡配置,不支持網絡策略,配置簡單
2、calico:支持網絡配置和網絡策略,但學習成本比較高
3、canel:用第一種方式提供網絡配置,第二種方式實現網絡策略,學習成本相對低
本次使用flannel實現:
之前已經說過k8s插件需要通過cni接口實現,那麼實際上安裝flannel需要配置兩個東西,
- flannel的 cni接口文件
- flannel docker鏡像
同樣的鏡像一定要下載arm版本,之前 我已經下載好了flannel鏡像
Git上官方下載地址:
https://github.com/coreos/flannel/
下載最新版本的cni文件:
https://github.com/containernetworking/plugins/releases
之前我用0.8.1對樹莓派好像有點bug,後來升級到0.8.5就正常啓用了,建議下載最新版。
創建cni文件夾路徑:
root@k8smaster:/app/k8s/images# ansible pi -m command -a 'mkdir -p /opt/cni/bin'
[WARNING]: Consider using the file module with state=directory rather than running 'mkdir'. If you need to use command because file is insufficient you can add
'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
[WARNING]: Platform linux on host 192.168.1.3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.3 | CHANGED | rc=0 >>
[WARNING]: Platform linux on host 192.168.1.4 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.4 | CHANGED | rc=0 >>
解壓到指定路徑:
root@k8smaster:/app/k8s/images# ansible pi -m command -a 'tar -xvf /app/k8s/images/cni-plugins-linux-arm64-v0.8.5.tgz -C /opt/cni/bin'
[WARNING]: Consider using the unarchive module rather than running 'tar'. If you need to use command because unarchive is insufficient you can add 'warn: false'
to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
[WARNING]: Platform linux on host 192.168.1.4 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.4 | CHANGED | rc=0 >>
./
./ptp
./macvlan
./flannel
./sbr
./host-local
./dhcp
./vlan
./bridge
./tuning
./firewall
./bandwidth
./static
./host-device
./loopback
./ipvlan
./portmap
[WARNING]: Platform linux on host 192.168.1.3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.1.3 | CHANGED | rc=0 >>
./
./ptp
./macvlan
./flannel
./sbr
./host-local
./dhcp
./vlan
./bridge
./tuning
./firewall
./bandwidth
./static
./host-device
./loopback
./ipvlan
./portmap
創建node節點kubelet配置文件:
root@k8smaster:/app/k8s/images# ansible pi -m command -a 'touch /etc/default/kubelet'
cat > /etc/default/kubelet <<EOF
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --fail-swap-on=false
EOF
這個kubelet的配置文件可以直接把master機器上的複製過來
接下來刷一波iptable
modprobe br_netfilter
就可以加入master節點了,node上執行:
kubeadm join 192.168.1.2:6443 --token wf3k2x.ptk0004v47p27pzu --discovery-token-ca-cert-hash sha256:62d016e62d705445bf4a5bba116045d980c612bb34ab02701e81a6424b84ddba
接下來就等待node加入到master
日誌:
root@k8snode1:/home/pi# kubeadm join 192.168.1.2:6443 --token wf3k2x.ptk0004v47p27pzu --discovery-token-ca-cert-hash sha256:62d016e62d705445bf4a5bba116045d980c612bb34ab02701e81a6424b84ddba
[preflight] Running pre-flight checks
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.6. Latest validated version: 18.09
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.16" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Master節點上查看:
root@k8smaster:/etc/sysctl.d# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 21h v1.16.2
k8snode1 NotReady <none> 32s v1.16.2
k8snode2 NotReady <none> 4m31s v1.16.2
由於node上還沒有啓用flannel,所以處於notready狀態,稍等片刻等待flannel自動起來後就會變成:
root@k8smaster:/etc/sysctl.d# kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-5644d7b6d9-8kml9 1/1 Running 6 21h 10.244.0.2 k8smaster <none> <none>
kube-system coredns-5644d7b6d9-w72lj 1/1 Running 7 21h 10.244.0.3 k8smaster <none> <none>
kube-system etcd-k8smaster 1/1 Running 1 21h 192.168.1.2 k8smaster <none> <none>
kube-system kube-apiserver-k8smaster 1/1 Running 1 21h 192.168.1.2 k8smaster <none> <none>
kube-system kube-controller-manager-k8smaster 1/1 Running 2 21h 192.168.1.2 k8smaster <none> <none>
kube-system kube-flannel-ds-arm-67tll 1/1 Running 0 7m35s 192.168.1.4 k8snode2 <none> <none>
kube-system kube-flannel-ds-arm-c74z4 1/1 Running 38 21h 192.168.1.2 k8smaster <none> <none>
kube-system kube-flannel-ds-arm-prjdj 1/1 Running 0 3m36s 192.168.1.3 k8snode1 <none> <none>
kube-system kube-proxy-n6njb 1/1 Running 0 7m35s 192.168.1.4 k8snode2 <none> <none>
kube-system kube-proxy-zd7tl 1/1 Running 0 3m36s 192.168.1.3 k8snode1 <none> <none>
kube-system kube-proxy-zt9gv 1/1 Running 1 21h 192.168.1.2 k8smaster <none> <none>
kube-system kube-scheduler-k8smaster 1/1 Running 2 21h 192.168.1.2 k8smaster <none> <none>
查看狀態:
root@k8smaster:/etc/sysctl.d# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 21h v1.16.2
k8snode1 Ready <none> 4m27s v1.16.2
k8snode2 Ready <none> 8m26s v1.16.2
三節點樹莓派arm版本的K8S搭建成功
錯誤和總結:
/proc/sys/net/bridge/bridge-nf-call-iptables does not exist 報錯,無法訪問內核iptables,需要重新加載一次:
解決:
重新加載內核文件:
modprobe br_netfilter
flannel啓動,從git加載啓動的配置文件,一般可能無法下載,可以先下載到本地在執行
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看pod狀態,可能會遇到各種錯誤,需要調用日誌查看
pod狀態
kubectl get pods --all-namespaces -o wide
查看pod日誌:
kubectl describe pod coredns-78fcdf6894-kgg8d -n kube-system
或
kubectl logs -f coredns-5644d7b6d9-h5k5d -n kube-system
查看kubelet日誌:
systemctl status kubelet
查看更多詳細的kubelet日誌:
journalctl -xeu kubelet
一旦修改系統級yaml配置文件,需要刷新配置文件並重啓更新實列
刷新配置文件:
systemctl daemon-reload
重啓實列:
systemctl restart docker kubelet
coredns standard_init_linux.go:211: exec user process caused "exec format error 錯誤
關於exec format錯誤幾乎都是鏡像有問題,要麼是鏡像裏面的程序有問題,要麼就是鏡像版本不對,有時候鏡像程序沒問題就不能認爲鏡像沒問題
coredns CrashLoopBackOff 報錯
coredns沒起來,問題可能大多數出現在coredns鏡像上,安裝版本與鏡像適合的系統都檢查下,如果鏡像沒問題,初始化後會是pending狀態。鏡像正常那麼需要檢查初始化網段,或本身nameserver的ip,是否合法等。
root@k8smaster:/app/k8s/conf# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5644d7b6d9-8kml9 1/1 Running 0 14m
kube-system coredns-5644d7b6d9-w72lj 1/1 Running 0 14m
kube-system etcd-k8smaster 1/1 Running 0 13m
kube-system kube-apiserver-k8smaster 1/1 Running 0 13m
kube-system kube-controller-manager-k8smaster 1/1 Running 0 13m
kube-system kube-flannel-ds-arm-c74z4 0/1 CrashLoopBackOff 6 6m47s
kube-system kube-proxy-zt9gv 1/1 Running 0 14m
kube-system kube-scheduler-k8smaster 1/1 Running 0 13m
日誌報錯:
VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false
E0306 11:53:20.044525 1 main.go:289] Error registering network: failed to configure interface flannel.1: failed to ensure address of interface flannel.1: link has incompatible addresses. Remove additional addresses and try again. &netlink.Vxlan{LinkAttrs:netlink.LinkAttrs{Index:5, MTU:1450, TxQLen:0, Name:"flannel.1", HardwareAddr:net.HardwareAddr{0x52, 0xff, 0xbf, 0x2c, 0x93, 0x50}, Flags:0x13, RawFlags:0x11043, ParentIndex:0, MasterIndex:0, Namespace:interface {}(nil), Alias:"", Statistics:(*netlink.LinkStatistics)(0x4420652104), Promisc:0, Xdp:(*netlink.LinkXdp)(0x442041b570), EncapType:"ether", Protinfo:(*netlink.Protinfo)(nil), OperState:0x0}, VxlanId:1, VtepDevIndex:3, SrcAddr:net.IP{0xc0, 0xa8, 0x1, 0x2}, Group:net.IP(nil), TTL:0, TOS:0, Learning:false, Proxy:false, RSC:false, L2miss:false, L3miss:false, UDPCSum:true, NoAge:false, GBP:false, Age:300, Limit:0, Port:8472, PortLow:0, PortHigh:0}
如果安裝flannel一直處於以上狀態,且ifconfig網卡齊全,那麼可能是因爲之前安裝失敗時緩存原因,需要清除網卡信息讓他自動重新生成即可:
sudo ifconfig cni0 down
sudo ip link delete cni0
sudo ifconfig flannel.1 down
sudo ip link delete flannel.1
sudo rm -rf /var/lib/cni/
如果一直處於一下狀態:
root@k8smaster:/home/pi# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5644d7b6d9-h5k5d 0/1 CrashLoopBackOff 39 176m
kube-system coredns-5644d7b6d9-vzdms 0/1 CrashLoopBackOff 39 176m
kube-system etcd-k8smaster 1/1 Running 3 175m
kube-system kube-apiserver-k8smaster 1/1 Running 3 175m
kube-system kube-controller-manager-k8smaster 1/1 Running 3 174m
kube-system kube-flannel-ds-arm-n8nq9 0/1 CrashLoopBackOff 22 172m
kube-system kube-proxy-58tc8 1/1 Running 3 176m
kube-system kube-scheduler-k8smaster 1/1 Running 3 175m
且報錯:
standard_init_linux.go:211: exec user process caused "exec format error"
root@k8smaster:/home/pi# kucectl describe pod coredns-5644d7b6d9-h5k5d
coredns鏡像有問題,需要檢查鏡像版本號和支持系統硬件
最終狀態:
root@k8smaster:/home/pi# kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-5644d7b6d9-8kml9 1/1 Running 6 3h3m 10.244.0.2 k8smaster <none> <none>
kube-system coredns-5644d7b6d9-w72lj 1/1 Running 7 3h3m 10.244.0.3 k8smaster <none> <none>
kube-system etcd-k8smaster 1/1 Running 1 3h2m 192.168.1.2 k8smaster <none> <none>
kube-system kube-apiserver-k8smaster 1/1 Running 1 3h2m 192.168.1.2 k8smaster <none> <none>
kube-system kube-controller-manager-k8smaster 1/1 Running 1 3h2m 192.168.1.2 k8smaster <none> <none>
kube-system kube-flannel-ds-arm-c74z4 1/1 Running 38 176m 192.168.1.2 k8smaster <none> <none>
kube-system kube-proxy-zt9gv 1/1 Running 1 3h3m 192.168.1.2 k8smaster <none> <none>
kube-system kube-scheduler-k8smaster 1/1 Running 1 3h2m 192.168.1.2 k8smaster <none> <none>
各個pod正常運行
安裝中我遇到的問題:
1、鏡像錯誤:
出現過kube proxy起不來,沒有任何異常日誌,報錯找不到容器,最後重新拉去了一次鏡像解決
coredns起不來,原因是下載1.6.2版本的時候不是下載的arm版本,arm版本沒有版本號,只有arm標籤,當時下載時只看了版本號a沒有找到對應的系統,導致coredns啓動的時候一直報錯操作系統不支持
同樣的,flannel下載了arm版本,但是版本號是下載的0.8.1的,網絡上有很多教程都是老版本,0.8.1的arm版本對樹莓派64位有一些bug,由於k8s不需要對第三方插件進行版本驗證,所以flannel我使用了當前最新版本0.8.5,該問題因此解決
2、網絡接口錯誤:
沒有搞清楚k8s第三方插件使用方法前可能會混淆,K8S第三方插件通過cni接口接入,任何第三方插件都需要對cni接口進行對接,安裝flannel插件的時候需要下載cni接口對接文件,放在/opt/cni/bin目錄下
最直觀的現象反應是:
如果沒有cni接口文件,那麼ifconfig的時候,找不到cni0和flannel.1網卡,直接啓動flannel 就可能會報錯找不到網卡
3、緩存沒有處理:
kubeadm reset重置k8s的時候,會卸載掉iptable文件,需要重新掛載一次才能初始化
同樣的flannel重複安裝的時候,也需要清理掉接口緩存,否則也會起不來報錯
4、啓動參數:
主要是K8S初始化的時候,可以不加子網網段等信息,這些信息都可以在之後的配置文件中添加上再刷新配置文件重啓kubelet和docker解決,主要的一點是初始化的時候一定要指定K8S版本,因爲kubeadm默認會去拉去@1版本的最新K8S,一般和我們下載的靜態文件版本不同
安裝中我沒遇到的問題及注意事項:
1、swap,我提前關掉了swap,所以可以忽略
2、用戶組從cgroup改爲system,所以沒有遇到用戶組報錯
3、修改yaml配置文件後一定要刷新後重啓docker和kubelet
注意事項:
1、arm設備支持版本沒有amd高,當在選擇arm版本K8S的使用版本時,需要先看api等三大鏡像支持的版本,然後再指定安裝kubeadm和kubectl和kubelet的時候,根據三大鏡像版本來選擇apt install kubelet kubeadm kubectl的版本;
我最初直接apt了最新的kubeadm,拉去到了1.17.3,然而當我去找kube-apiserver kube-controller-manager kube-scheduler 三大docker鏡像的時候,發現arm版本的最新穩定版纔到1.16.2,所以建議先看docker鏡像版本再指定拉去kubeadm版本
2、拉取到的容器鏡像tag和kubeadm config所展示的鏡像名不一致,最明顯的就是拉取的鏡像帶了arm等標誌,而kubeadm 展示所需的鏡像可能沒有這些標誌,這時候需要把這些鏡像全部改名成爲kubeadm所需的鏡像名稱
總結:
安裝K8S集羣,只有master機器需要安裝的東西比較多,kubectl只需要放在master上即可,注意arm和amd之間的鏡像不同,完善掉swap cgroup cni接口文件等注意事項,還是比較容易安裝,一定要多運行日誌命令查看安裝報錯原因,在安裝的過程中有可能出現許多未知的錯誤,google不一定有一模一樣的報錯和解決方案,通過讀錯誤描述一步步排除和修正。
最後,如果覺得對您有幫助,您的打賞是對我最大的創造鼓勵