1.简介

本章节使用kubeadm搭建一套三主三从的高可用kubernetes集群。相比单master而言,多master更加有利于我们生产环境的稳定性。就算master节点宕机一台,我们依然有其他master节点保证我们的集群环境。多master节点需要依赖于keepalive还生成一个vip,也就是虚拟ip,做过nginx+keepalive的小伙伴们都知道,还需要一个haproxy来实现负载策略。

2.整体架构信息

Linux版本CentOS7,内核版本推荐4.10+(3.10有个kmem的bug)
Kubernetes 默认安装最新
网段配置:pod网段10.244.0.0/16service网段10.96.0.0/12
 

3.环境初始化

3.1配置hosts文件

在每个主机上配置
cat >>/etc/hosts<<EOF
192.168.3.18 master1
192.168.3.19 master2
192.168.3.20 master3
192.168.3.21 node1
192.168.3.22 node2
192.168.3.23 node3
EOF

3.2关闭selinux和防火墙

sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld

3.3关闭swap

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

3.4创建秘钥

在master1节点上创建秘钥,设置免密登录其他服务器,主要是为了后面的远程拷贝证书
ssh-keygen -t rsa
一路回车即可。

 

# 将密钥拷贝到其他节点
for n in seq -w 2 3;do ssh-copy-id master$n;done

3.5配置内核转发参数

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
sysctl --system

3.6加载ipvs模块

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

4.安装keepalived

3个master节点上安装keepalived

yum install -y keepalived

修改keepalived的配置文件,保证priority不一样即可,这里我们分别采用100,90,80
配置文件路径

vim /etc/keepalived/keepalived.conf

配置文件内容:

global_defs {
    router_id lb-master-105
}

vrrp_script check-haproxy {
    script "killall -0 haproxy"
    interval 5
    weight -30
}

vrrp_instance VI-kube-master {
    state MASTER   MASTER或BACKUP
    priority 120   权限
    dont_track_primary
    interface ens33   网卡地址
    virtual_router_id 68
    advert_int 3
    track_script {
        check-haproxy
    }
    virtual_ipaddress {
        192.168.60.100
    }
}

启动keepalive并设置成开启启动

systemctl start keepalived && systemctl enable keepalived

检查虚拟vip是否正常工作
ifconfig查看vip是否绑定成功,如果能ping 192.168.3.100则说明vip绑定成功,也可以使用ip a看虚拟vip是否绑定到当前指定网卡上
 

 

5.安装haproxy

yum install -y haproxy

修改haproxy的配置文件,因为我们的haproxy安装在3个master节点上面,haproxy实现api-server的负载均衡,所有不能用api-server的端口,我们设置端口信息为8443,默认是api-server是8443
配置文件路径/etc/haproxy/haproxy.conf
配置文件内容:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    to have these messages end up in /var/log/haproxy.log you will
    need to:
   
    1) configure syslog to accept network log events.  This is done
       by adding the '-r' option to the SYSLOGD_OPTIONS in
       /etc/sysconfig/syslog
   
    2) configure local2 events to go to the /var/log/haproxy.log
      file. A line like the following can be added to
      /etc/sysconfig/syslog
   
       local2.*                       /var/log/haproxy.log
   
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
# kubernetes apiserver frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes-apiserver
    mode                 tcp
    bind                 *:16443
    option               tcplog
    default_backend      kubernetes-apiserver
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
    mode        tcp
    balance     roundrobin
    server  master-0 172.16.7.11:6443 check
    server  master-1 172.16.7.12:6443 check
    server  master-2 172.16.7.13:6443 check
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen stats
    bind                 *:1080
    stats auth           admin:awesomePassword
    stats refresh        5s
    stats realm          HAProxy\ Statistics
    stats uri            /admin?stats

启动并设置为开机启动

systemctl start haproxy && systemctl enable haproxy
ss -lnt | grep -E "16443|1080"

6.安装docker-ce

6.1安装一些必要的组件信息

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

6.2添加docker的yum源

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6.3更新缓存

sudo yum makecache fast

6.4安装

yum install -y docker-ce

6.5启动并设置成开机启动

systemctl start docker && systemctl enable docker

7.安装kubernetes组件

7.1添加kubernetes的yum源

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

7.2更新缓存

yum makecache fast

7.3安装组件

yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0

7.4设置kubelet开机自启动

systemctl enable kubelet

8.初始化集群

8.1获取默认配置文件信息

kubeadm config print init-defaults > kubeadm-init.yaml

8.2修改初始化文件

修改之后的配置文件如下,注意以下几点advertiseAddress,imageRepository,kubernetesVersion,podSubnet,controlPlaneEndpoint

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.3.18
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.3.100:16443
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.15.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}

8.3初始化集群

kubeadm init --config kubeadm-init.yaml

集群初始化完成后执行一下三步:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 
画红线部分主要是针对其他,master节点加入集群,node节点加入集群的话则不需要--experimental-control-plane。
注意这里token默认24小时过期,查看token的命令

kubeadm token list

token过期后,如果我们需要重新生成token,可以使用以下命令,生成命令默认是node节点加入的命令,如需要角色是master则需要在最后面加上--experimental-control-plane。

kubeadm token create --print-join-command

 
接着我们将证书拷贝到其他master节点

USER=root
CONTROL_PLANE_IPS="k8s.master02.com k8s.master03.com"
for host in ${CONTROL_PLANE_IPS}; do
    ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"
    scp /etc/kubernetes/pki/ca.* "${USER}"@$host:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/sa.* "${USER}"@$host:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/front-proxy-ca.* "${USER}"@$host:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/etcd/ca.* "${USER}"@$host:/etc/kubernetes/pki/etcd/
    scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/
done

8.4初始化其他master节点

使用命令

kubeadm join 192.168.3.100:8443 --token rv4daf.44jisgiwzg7wp07c  --discovery-token-ca-cert-hash sha256:c947ffc92b679603c51279d843e6a0657d48b7c60644e539dba15dc1246e6f59 --experimental-control-plane

接着等待一段时间,初始化的时候需要从网上拉取镜像,直到我们看见
This node has joined the cluster …则证明我们其他master节点成功加入到集群,加入集群后我们依然需要执行图中画红线的部分,执行后才可以使用kubectl直接和api-server交互。
 

8.5验证集群环境

我们使用kubectl get node [-o wide]查看集群状态,可以看到当前已经有3个节点了,都是master角色,但是状态都是NotReady状态,别着急,我们目前为止还没有安装网络组件。
 
安装calico网络组件,生产集群大的时候推荐calico。
官方介绍如下:
详情可以根据情况查看官网介绍,连接地址:https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/calico
 
步骤: 1、 下载yaml;

curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O

2、 修改网络地址跟pod网段保持一致;
我们的第二步骤跟官方不一样,但是是一个意思,都是修改网络地址段修改calico.yaml的192.168.0.0/24改为初始化的pod网段地址,我们之前使用的10.244.0.0/16
3、 创建calico网络pod;

kubectl apply -f calico.yaml

创建后等待段时间后,这个根据网络环境等待,下载镜像,启动pod直到我们使用kubectl get pod -n kube-system的pod全部变成n/n的时候集群就算搭建完成。
等待一段时间后,我们再次使用kubectl get node [-o wide]查看集群状态信息,可以看到所有的pod已经成功启动,3个master节点变成了Ready状态。
 

8.6加入node节点

这里我们使用直接加入到集群环境即可,注意:node节点没有后面的--experimental-control-plane参数。

kubeadm join 192.168.3.100:8443 --token rv4daf.44jisgiwzg7wp07c --discovery-token-ca-cert-hash sha256:c947ffc92b679603c51279d843e6a0657d48b7c60644e539dba15dc1246e6f59

三个节点都执行加入集群的命令后,稍等一下即可看到,此时我们的master和node都处于Ready状态。
 
并且此时我们kube-system名称空间下的所有pod都处于n/n的状态,此时我们的k8s多master高可用环境搭建完成。
 

9、注意事项

我们的高可用目前环境是三个master,因为etcd集群至少要保证2个节点,所以当我们挂了一个master节点时是对于我们高可用环境是不受影响的,生产环境至少要保证三个master节点以上即可。

10、外部如何访问

因为我们集群环境使用的keepalived生成并绑定了vip,这个vip是会飘走的。举个例子,现在vip绑定到192.168.3.18的ens32网卡上面,当我们这个服务器宕机,keepalived的高可用机制可能就把vip飘到其他keepalived上面。
所以,外部访问直接访问我们的vip即可。为了测试,我们在自己电脑上启动一个cmd,去ping我们这个vip看是否有返回结果即可。