第一步:樹莓派kubernetes安裝準備工作

版權聲明:本文爲CSDN博主「liukuan73」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/liukuan73/article/details/83150473

1. 準備工作


1.1 環境信息


操作系統:Raspbian GNU/Linux 9(Stretch Desktop)
內核:4.14.50-v7+

1.2 關閉防火牆


關閉ufw防火牆,樹莓派系統沒有ufw模塊,無需設置。

$ sudo ufw disable


備註:

ufw的底層是使用iptables進行數據過濾,建立在iptables之上,這可能會與 Docker 產生衝突。
爲避免不必要的麻煩,這裏把firewalld關掉。


1.3 禁用SELINUX


樹莓派系統默認不安裝selinux,無需設置。假如安裝了的話,按如下步驟禁用selinux

臨時禁用(重啓後失效)

$ sudo setenforce 0                 #0代表permissive 1代表enforcing



永久禁用

$ sudo vi /etc/selinux/config
SELINUX=permissive        


備註:

kubelet目前對selinux的支持還不好,需要禁用掉。
不禁用selinux的話有時還會出現明明容器裏是root身份運行,操作掛載進來的主機文件夾時沒有權限的情況,這時候要麼配置selinux的權限,要麼就禁掉selinux
另外,當docker的storage-driver使用overlay2的時候,低版本內核的selinux不支持overlay2文件驅動,docker啓動時設置爲--selinux-enabled會失敗報錯:“Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel”,需設置--selinux-enabled=false


1.4 開啓數據包轉發


1.4.1 內核開啓ipv4轉發
1.修改/etc/sysctl.conf,開啓ipv4轉發:

$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1             #開啓ipv4轉發,允許內置路由


2.寫入後執行如下命令生效:

$ sudo sysctl -p


備註:

什麼是ipv4轉發:出於安全考慮,Linux系統默認是禁止數據包轉發的。轉發即當主機擁有多於一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將數據包發往本機另一塊網卡,該網卡根據路由表繼續發送數據包。這通常是路由器所要實現的功能。
kube-proxy的ipvs模式和calico(都涉及路由轉發)都需要主機開啓ipv4轉發。
另外,不使用k8s,即使只使用docker的時候,以下兩種情況也依賴ipv4轉發:
<1>當同一主機上的兩個跨bridge(跨bridge相當於跨網段,跨網絡需要路由)的容器互訪
<2>從容器內訪問外部
參考: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/container-communication/#communicating-to-the-outside-world

1.4.2 防火牆修改FORWARD鏈默認策略
數據包經過路由後,假如不是發往本機的流量,下一步會走iptables的FORWARD鏈,而docker從1.13版本開始,將FORWARD鏈的默認策略設置爲DROP,會導致出現一些例如跨主機的兩個pod使用podIP互訪失敗等問題。解決方案有2個:

在所有節點上開機啓動時執行iptables -P FORWARD ACCEPT
讓docker不操作iptables
方案一

臨時生效:

$ sudo iptables -P FORWARD ACCEPT



iptables的配置重啓後會丟失,可以將配置寫進/etc/rc.local中,重啓後自動執行:

/usr/sbin/iptables -P FORWARD ACCEPT



方案二

設置docker啓動參數添加--iptables=false選項,使docker不再操作iptables,比如1.10版以上可編輯docker daemon默認配置文件/etc/docker/daemon.json:

{
    "iptables": false
}


備註:

建議方案二
kubernetes官網建議和k8s結合的時候docker的啓動參數設置--iptables=false使得docker不再操作iptables,完全由kube-proxy來操作iptables。
參考:
<1>https://docs.docker.com/v17.09/engine/userguide/networking/default_network/container-communication/#container-communication-between-hosts
<2>https://github.com/kubernetes/kubernetes/issues/40182
<3>https://kubernetes.io/docs/setup/scratch/#docker
<4>https://github.com/moby/moby/pull/28257


1.5 禁用swap


1.禁掉所有的swap分區

$ sudo swapoff -a


2.同時還需要修改/etc/fstab文件,註釋掉 SWAP 的自動掛載,防止機子重啓後swap啓用。

備註:

Kubernetes 1.8開始要求關閉系統的Swap,如果不關閉,默認配置下kubelet將無法啓動,雖然可以通過kubelet的啓動參數--fail-swap-on=false更改這個限制,但不建議,最好還是不要開啓swap。
一些爲什麼要關閉swap的討論:
<1>https://github.com/kubernetes/kubernetes/issues/7294
<2>https://github.com/kubernetes/kubernetes/issues/53533


1.6 配置iptables參數,使得流經網橋的流量也經過iptables/netfilter防火牆

 

$ sudo tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

$ sudo sysctl --system


備註:

網絡插件需要爲kube-proxy提供一些特定的支持,比如kube-proxy的iptables模式基於iptables,網絡插件就需要確保容器的流量可以流過iptables。比如一些網絡插件會用到網橋,而網橋工作在數據鏈路層,iptables/netfilter防火牆工作在網絡層,以上配置則可以使得通過網橋的流量也進入iptables/netfilter防火牆中,確保iptables模式的kube-proxy可以正常工作。
默認沒有指定kubelet網絡插件的情況下,會使用noop插件,它也會設置net/bridge/bridge-nf-call-iptables=1來確保iptables模式的kube-proxy可以正常工作。
參考:
<1>https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements
<2>https://kubernetes.io/docs/setup/independent/install-kubeadm/


1.7 開啓memory的cgroup功能


樹莓派是基於debian的系統,而debian默認沒有mount memory的cgroup,這裏需要手動開啓

編輯/boot/cmdline.txt,在該行的末尾添加此文本,但不要創建任何新行:

cgroup_enable=memory


重啓:

sudo reboot



1.8 修改系統源


修改樹莓派的源,換成中科大的源(http://mirrors.ustc.edu.cn/help/raspbian.html)

$ sudo sed -i 's|raspbian.raspberrypi.org|mirrors.ustc.edu.cn/raspbian|g' /etc/apt/sources.list
$ sudo apt-get update

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章