1. 程式人生 > 實用技巧 >使用kubeadm部署k8s多master叢集

使用kubeadm部署k8s多master叢集

目錄

一、部署方案選擇

使用kubeadm安裝多master叢集有兩種部署方案:
第一種使用kubeadm中的預設拓撲。使用kubeadm join --experimental-control-plane命令在master節點上自動建立本地etcd成員,加入到master叢集。這種部署方式最為簡單,缺點是有一定的耦合失敗的風險。每個master節點執行kube-apiserver,kube-scheduler和kube-controller-manager的一個例項,每個master節點建立一個本地etcd成員,該etcd成員僅與本節點kube-apiserver通訊,kube-controller-manager和kube-scheduler也一樣。所以每掉一臺伺服器就會使etcd和apiserver的例項減少一臺,必要時候需要按照叢集的規模,擴大master例項的數量,減少風險。
第二種是使用外部etcd叢集拓撲,etcd節點與master在不同節點上執行。需要額外為每個master建立獨立的init配置檔案,並在配置檔案中指定外部的etcd叢集。每個master節點執行一個kube-apiserver,kube-scheduler和kube-controller-manager例項,每個master都可以和etcd叢集通訊。好處自然是低耦合,大大的降低了風險。但配置上稍有一些麻煩,並且需要的伺服器要多一些。

二、預設拓撲部署

1、使用ansiable分發配置,如:設定主機名、/etc/hosts解析、repo檔案、dockerhub證書、伺服器配置、安裝docker等,不詳述了就。(每臺伺服器)

設定主機名
分發配置主機檔案/etc/hosts
分發repo檔案
kube.repo

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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

docker.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum clean
yum makecatch

安裝依賴
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
關閉防火牆、swap,重置iptables
關閉防火牆
$ systemctl stop firewalld && systemctl disable firewalld
重置iptables

iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 關閉swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# 關閉selinux
setenforce 0
# 關閉dnsmasq(否則可能導致docker容器無法解析域名)
service dnsmasq stop && systemctl disable dnsmasq

設定系統引數

cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF

sysctl -p /etc/sysctl.d/kubernetes.conf

#!/bin/bash
# 開啟forward
# Docker從1.13版本開始調整了預設的防火牆規則
# 禁用了iptables filter表中FOWARD鏈
# 這樣會引起Kubernetes叢集中跨Node的Pod無法通訊
 
iptables -P FORWARD ACCEPT
 
# 載入ipvs相關核心模組
# 如果重新開機,需要重新載入
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
lsmod | grep ip_vs

2、安裝docker(每臺伺服器)

# 安裝docker
檢視可以安裝的版本
yum list docker-ce --showduplicates|sort -r
yum install -y docker-ce-18.06.1.ce-3

cat > /etc/docker/daemon.json <<EOF
{
    "graph": "/docker/data/path",
    "exec-opts": ["native.cgroupdriver=cgroupfs"],
    "registry-mirrors":["https://k9e55i4n.mirror.aliyuncs.com"]
}
EOF

systemctl start docker && systemctl enable docker

3、安裝 kubeadm, kubelet 和 kubectl(每臺伺服器)

# 找到安裝的版本號
yum list kubeadm --showduplicates | sort -r

#安裝指定版本
yum install -y kubelet-1.14.5 kubeadm-1.14.5 kubectl-1.14.5

#檢視安裝情況
systemctl cat kubelet

4、配置高可用

參照LVS+keepalived部署高可用叢集

5、初始化第一個master0

systemctl daemon-reload
systemctl enable kubelet

# 使用kubeadm-config.yaml配置k8s1.14.5叢集

# cat init.sh
LOAD_BALANCER_DNS="192.168.2.22"     **\\這個是上一步配置的VIP地址**
LOAD_BALANCER_PORT="6443"
# 生成kubeadm配置檔案
cat > kubeadm-master.config <<EOF
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
# kubernetes版本
kubernetesVersion: v1.14.5
# 使用國內阿里映象
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

apiServer:
  certSANs:
  - "$LOAD_BALANCER_DNS"
controlPlaneEndpoint: "$LOAD_BALANCER_DNS:$LOAD_BALANCER_PORT"

networking:
  podSubnet: 10.244.0.0/16
EOF

#初始化k8s叢集
kubeadm init --config=kubeadm-master.config

6、驗證證書有效時間

cd /etc/kubernetes/pki
for crt in $(find /etc/kubernetes/pki/ -name "*.crt"); do openssl x509 -in $crt -noout -dates; done 

7、安裝網路外掛

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

8、拷貝master證書到其他master節點

# cat scp.sh
USER=root
CONTROL_PLANE_IPS="192.168.3.43 192.168.3.44"
for host in ${CONTROL_PLANE_IPS}; do
    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
    scp /etc/kubernetes/admin.conf "${USER}"@$host:
    ssh ${USER}@${host} 'mkdir -p /etc/kubernetes/pki/etcd'
    ssh ${USER}@${host} 'mv /${USER}/ca.crt /etc/kubernetes/pki/'
    ssh ${USER}@${host} 'mv /${USER}/ca.key /etc/kubernetes/pki/'
    ssh ${USER}@${host} 'mv /${USER}/sa.pub /etc/kubernetes/pki/'
    ssh ${USER}@${host} 'mv /${USER}/sa.key /etc/kubernetes/pki/'
    ssh ${USER}@${host} 'mv /${USER}/front-proxy-ca.crt /etc/kubernetes/pki/'
    ssh ${USER}@${host} 'mv /${USER}/front-proxy-ca.key /etc/kubernetes/pki/'
    ssh ${USER}@${host} 'mv /${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt'
    ssh ${USER}@${host} 'mv /${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key'
    ssh ${USER}@${host} 'mv /${USER}/admin.conf /etc/kubernetes/admin.conf'
done

9、加入叢集

#master
kubeadm join 192.168.2.22:6443 --token qlrq5y.1yhm3rz9r7ynfqf1 --discovery-token-ca-cert-hash sha256:62579157003c3537deb44b30f652c500e7fa6505b5ef6826d796ba1245283899 --experimental-control-plane
#node
kubeadm join 192.168.2.22:6443 --token qlrq5y.1yhm3rz9r7ynfqf1 --discovery-token-ca-cert-hash sha256:62579157003c3537deb44b30f652c500e7fa6505b5ef6826d796ba1245283899

參考文件:
外部etcd叢集拓撲部署
預設拓撲部署