CentOS部署Kubernetes1.13叢集-1(使用kubeadm安裝K8S)
參考:https://www.kubernetes.org.cn/4956.html
1.準備
說明:準備工作需要在叢集所有的主機上執行
1.1系統配置
在安裝之前,需要先做如下準備。三臺CentOS主機如下:
cat /etc/hosts 192.168.0.19 tf-01 192.168.0.20 tf-02 192.168.0.21 tf-03
如果各個主機啟用了防火牆,需要開放Kubernetes各個元件所需要的埠,可以檢視Installing kubeadm中的”Check required ports”一節。 這裡簡單起見在各節點禁用防火牆:
systemctl stop firewalld systemctl disable firewalld
禁用SELINUX:
setenforce 0 vi /etc/selinux/config SELINUX=disabled
建立/etc/sysctl.d/k8s.conf檔案,新增如下內容:
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
執行命令使修改生效。
modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf
1.2kube-proxy開啟ipvs的前置條件
由於ipvs已經加入到了核心的主幹,所以為kube-proxy開啟ipvs的前提需要載入以下的核心模組:
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
在所有的Kubernetes節點上執行以下指令碼:
cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上面指令碼建立了的/etc/sysconfig/modules/ipvs.modules檔案,保證在節點重啟後能自動載入所需模組。
使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令檢視是否已經正確載入所需的核心模組。
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
接下來還需要確保各個節點上已經安裝了ipset軟體包yum install ipset。 為了便於檢視ipvs的代理規則,最好安裝一下管理工具ipvsadm yum install ipvsadm。
yum install ipset
ipvsadm yum install ipvsadm
如果以上前提條件如果不滿足,則即使kube-proxy的配置開啟了ipvs模式,也會退回到iptables模式
1.3安裝Docker
Kubernetes從1.6開始使用CRI(Container Runtime Interface)容器執行時介面。預設的容器執行時仍然是Docker,使用的是kubelet中內建dockershim CRI實現。
安裝docker的yum源:
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
檢視最新的Docker版本:
yum list docker-ce.x86_64 --showduplicates |sort -r docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
Kubernetes 1.12已經針對Docker的1.11.1, 1.12.1, 1.13.1, 17.03, 17.06, 17.09, 18.06等版本做了驗證,需要注意Kubernetes 1.12最低支援的Docker版本是1.11.1。Kubernetes 1.13對Docker的版本依賴方面沒有變化。 我們這裡在各節點安裝docker的18.06.1版本。
yum makecache fast yum install -y --setopt=obsoletes=0 \ docker-ce-18.06.1.ce-3.el7 systemctl start docker systemctl enable docker
確認一下iptables filter表中FOWARD鏈的預設策略(pllicy)為ACCEPT。
iptables -nvL Chain INPUT (policy ACCEPT 263 packets, 19209 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Docker從1.13版本開始調整了預設的防火牆規則,禁用了iptables filter表中FOWARD鏈,這樣會引起Kubernetes叢集中跨Node的Pod無法通訊。但這裡通過安裝docker 1806,發現預設策略又改回了ACCEPT,這個不知道是從哪個版本改回的,因為我們線上版本使用的1706還是需要手動調整這個策略的。
2.使用kubeadm部署Kubernetes
2.1 安裝kubeadm和kubelet
下面在各節點安裝kubeadm和kubelet:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
注意:此處與參考的原文不同,原文用了google的資源,因為google聯不上,此處改為aliyun,且不開啟check(check=0)
yum makecache fast yum install -y kubelet kubeadm kubectl ... Installed: kubeadm.x86_64 0:1.13.0-0 kubectl.x86_64 0:1.13.0-0 kubelet.x86_64 0:1.13.0-0 Dependency Installed: cri-tools.x86_64 0:1.12.0-0 kubernetes-cni.x86_64 0:0.6.0-0 socat.x86_64 0:1.7.3.2-2.el7
從安裝結果可以看出還安裝了cri-tools, kubernetes-cni, socat三個依賴:
- 官方從Kubernetes 1.9開始就將cni依賴升級到了0.6.0版本,在當前1.12中仍然是這個版本
- socat是kubelet的依賴
- cri-tools是CRI(Container Runtime Interface)容器執行時介面的命令列工具
執行kubelet –help可以看到原來kubelet的絕大多數命令列flag引數都被DEPRECATED了,如:
...... --address 0.0.0.0 The IP address for the Kubelet to serve on (set to 0.0.0.0 for all IPv4 interfaces and `::` for all IPv6 interfaces) (default 0.0.0.0) (DEPRECATED: This parameter should be set via the config file specified by the Kubelet's --config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information.) ......
而官方推薦我們使用–config指定配置檔案,並在配置檔案中指定原來這些flag所配置的內容。具體內容可以檢視這裡Set Kubelet parameters via a config file。這也是Kubernetes為了支援動態Kubelet配置(Dynamic Kubelet Configuration)才這麼做的,參考Reconfigure a Node’s Kubelet in a Live Cluster。
kubelet的配置檔案必須是json或yaml格式,具體可檢視這裡。
Kubernetes 1.8開始要求關閉系統的Swap,如果不關閉,預設配置下kubelet將無法啟動。(如果不能關閉Swap,則需要修改kubelet的配置,下附)
關閉系統的Swap方法如下:
swapoff -a
修改 /etc/fstab 檔案,註釋掉 SWAP 的自動掛載,使用free -m確認swap已經關閉。
vim /etc/fstab
free -m
swappiness引數調整,修改/etc/sysctl.d/k8s.conf新增下面一行:
vm.swappiness=0
執行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。
sysctl -p /etc/sysctl.d/k8s.conf
如果叢集主機上還執行其他服務,關閉swap可能會對其他服務產生影響,則可以修改kubelet的配置去掉這個限制:
使用kubelet的啟動引數–fail-swap-on=false去掉必須關閉Swap的限制。 修改/etc/sysconfig/kubelet,加入 KUBELET_EXTRA_ARGS=--fail-swap-on=false
KUBELET_EXTRA_ARGS=--fail-swap-on=false
2.2 使用kubeadm init初始化叢集
在各節點開機啟動kubelet服務: