使用kubeadm進行k8s的部署主要分爲如下幾個步驟:node
在全部節點上都先要作好環境的準備,這裏以debian爲例,整理了安裝docker和kubeadm的相關命令。這個裏面主要須要解決的是國內源的問題。linux
## 準備環境 swapoff -a systemctl stop firewalld systemctl disable firewalld echo "net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1" > /etc/sysctl.d/k8s.conf sysctl -p /etc/sysctl.d/k8s.conf modprobe br_netfilter ## 更換apt源 mv /etc/apt/sources.list /etc/apt/sources.list.bak echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib deb-src http://mirrors.163.com/debian/ stretch main non-free contrib deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" > /etc/apt/sources.list ## 安裝docker apt-get update apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common -y --force-yes curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - apt-key fingerprint 0EBFCD88 add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" apt-get update apt-get install docker-ce containerd.io -y ## 使用阿里雲安裝kubeadm curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl ## 關閉swap echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf sysctl -p /etc/sysctl.d/k8s.conf
以上命令在全部節點上都須要執行下。git
單master集羣部署是以一個節點做爲master節點,其餘的節點做爲node角色加入到集羣中。github
首先在master節點上,經過kubeadm進行集羣的初始化。docker
nodename默認會使用hostname,這裏使用ip做爲nodename,在查看node節點時會更加直觀一些。
這裏面基本都使用的是國內的azure提供的鏡像源,鏡像下載速度比較快一些api
cat << EOF > /root/kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta1 kind: InitConfiguration nodeRegistration: kubeletExtraArgs: pod-infra-container-image: gcr.azk8s.cn/google_containers/pause-amd64:3.1 --- apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration imageRepository: gcr.azk8s.cn/google_containers kubernetesVersion: v1.14.2 networking: podSubnet: 10.244.0.0/16 EOF nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'` echo $nodename kubeadm init --config=kubeadm-config.yaml --apiserver-advertise-address=kubemaster.cluster.local --node-name $nodename > kubeadm.log
在master中查看kubeadm.log中的最後幾行,能夠看到其餘節點加入集羣的命令。網絡
root@i-5i2nhchleypb9h6oofb9h5suy:~# tail -n 5 kubeadm.log Then you can join any number of worker nodes by running the following on each as root: kubeadm join kubemaster.cluster.local:6443 --token br1lyz.kgnz5d6apvtcvdlg \ --discovery-token-ca-cert-hash sha256:a8a80875b68ddd8d8e0cd794daa1b81a7893eebceca77c3d5f9074b2dc7e109b
這時切換到其餘的node節點,能夠直接使用如下命令,加入集羣。app
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'` echo $nodename kubeadm join kubemaster.cluster.local:6443 --token bbnth6.tyxpf0ec27r5y5b8 \ --discovery-token-ca-cert-hash sha256:5a9d6d25558c0e5031d4d6a69b555f0db8dd0ac7e798b9f823f7f33352748ae6 --node-name $nodename
node節點所有加入後,即完成節點的部署。負載均衡
高可用集羣目前支持兩種拓撲結構,一種是etcd在master節點中部署,一種是etcd在另外的節點中進行部署。在小規模集羣中,其實採用前者就能夠了。本文也是採用這種方式。curl
高可用集羣通常須要三個以上的master節點組成,以及若干個node節點組成。其中master節點須要一個負載均衡器進行流量的分發。可是在小規模集羣中,額外再部署一個負載均衡器無疑會增長部署的複雜度。這裏我使用了一個偷懶的方式,就是不使用真實的負載均衡器,而是使用域名。這裏我有三個節點,我在每一個節點的/etc/hosts中作了以下配置。這樣kubemaster.cluster.local
就能夠解析到三個節點上。
11.62.68.3 kubemaster.cluster.local 11.62.68.4 kubemaster.cluster.local 11.62.68.5 kubemaster.cluster.local
這裏爲了防止鏈接都壓到同一臺上,能夠在不一樣的節點上調整hosts中的配置順序。
這裏同前面類似,用如下命令進行集羣的初始化。這裏特別注意下在配置中同上面最大的區別在於加入了controlPlaneEndpoint: "kubemaster.cluster.local:6443"
配置。實現對於集羣控制面的負載均衡器的配置。
cat << EOF > /root/kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta1 kind: InitConfiguration nodeRegistration: kubeletExtraArgs: pod-infra-container-image: gcr.azk8s.cn/google_containers/pause-amd64:3.1 --- apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration imageRepository: gcr.azk8s.cn/google_containers kubernetesVersion: v1.14.2 controlPlaneEndpoint: "kubemaster.cluster.local:6443" networking: podSubnet: 10.244.0.0/16 EOF nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'` echo $nodename kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs --node-name $nodename > kubeadm.log
在完成初始化後,能夠查看相關日誌。能夠看到同單master部署模式的狀況不一樣,高可用集羣中有兩個命令。
root@i-5i2nhchleypb9h6oofb9h5suy:~# tail -n 15 kubeadm.log You can now join any number of the control-plane node running the following command on each as root: kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \ --discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb \ --experimental-control-plane --certificate-key b73eba61d73c35ca4de43b9dd10a7db88023cbd767c98cc1d19489829ea0fc03 Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use "kubeadm init phase upload-certs --experimental-upload-certs" to reload certs afterward. Then you can join any number of worker nodes by running the following on each as root: kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \ --discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb
第一個是加入master的方式。也就是說,經過第一個命令加入後,該節點將會做爲master加入到集羣中。這裏咱們使用該命令便可將節點加入到master中,做爲master的節點之一。
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'` echo $nodename kubeadm join kubemaster.cluster.local:6443 --token pcumbv.qwa7uwzr7m7cijxy \ --discovery-token-ca-cert-hash sha256:bae4c6e70cc92cc6cba66bc96d48bf0c5a45fddf83e90b89eea519fc4bad16ac \ --experimental-control-plane --certificate-key 33f387801d51c0a743353357b138cf4ad70fd3acaa7a6ccec9835627773f1cb7 --node-name $nodename
固然,第二個同單master模式就類似了。
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'` echo $nodename kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \ --discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb --node-name $nodename
在master節點上能夠作一些相關的準備,方便後面使用kubectl等命令。
systemctl enable kubelet.service ## 爲kubectl準備config mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ## 去掉master的污點,使得master節點也能夠建立容器 ## 該命令可選。若是不想讓master執行node的角色,也能夠不執行 kubectl taint nodes --all node-role.kubernetes.io/master-
這裏使用flannel網絡。
mkdir -p ~/k8s/ cd ~/k8s wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ## 這裏使用quay.azk8s.cn進行進行加速。該命令可選。 sed -i "s/quay.io/quay.azk8s.cn/g" kube-flannel.yml kubectl apply -f kube-flannel.yml
這裏咱們嘗試在每一個節點建立一個容器,而後進行集羣部署驗證。這裏給了一個樣例。
cat << EOF > /root/daemonset.yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: debian spec: template: metadata: labels: debian: debian spec: containers: - name: debian image: dockerhub.azk8s.cn/library/debian command: ["sleep", "999999d"] resources: requests: cpu: 100m memory: 100Mi EOF kubectl create -f /root/daemonset.yaml
這裏我寫了一個小工具能夠自動進行各個節點的容器之間的網絡驗證,自動統計哪些節點尚未正常運行。後面我會再開源出來放到博客裏。
有時候安裝失敗或者清理環境時一些經常使用的命令,也整理在了下面。
該命令主要用於將kubeadm安裝的本節點恢復到安裝前。須要輸入yes確認。該命令適用於master和node節點。
kubeadm reset
重複安裝有時候會致使cni0的配置錯誤,能夠經過刪除cni0網橋,而後從新建立實現故障恢復。
apt-get install bridge-utils -y ifconfig cni0 down brctl delbr cni0 systemctl restart kubelet
kubeadm清理時不會清理iptables,裏面會有不少冗餘的規則,可使用該命令清理。該命令慎用。
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
在使用flannel時,有時mac信息過期沒能更新,致使沒法將消息轉發到目標機器的flannel.1。能夠在檢查後,經過bridge命令清理過時的mac信息。
flannel的具體原理和排障能夠參考我以前的博客,《flannel vxlan工做基本原理及常見排障思路》。其中介紹更爲詳細。
route -n arp -e bridge fdb show bridge fdb del 76:21:60:e5:ea:0b dev flannel.1