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服務:
CentOS部署Kubernetes1.13集群-1(使用kubeadm安裝K8S)