Kubernetes高可用集群搭建(kubeadm)

1 Kubernetes高可用集群介绍

前面已经介绍了Kubernetes的集群部署,但是都只是介绍的单master节点的情况,由于单master节点的可靠性不高,不适合实际的生产环境,此处介绍如何实现多master节点的高可用集群的搭建。

2 安装要求

  • 一台或多台机器,操作系统CentOS7.x-x86_64
  • 硬件配置:2G或更多ARM,2个CPU或更多CPU,硬盘20G及以上
  • 集群中所有机器网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

3 环境准备

3.1 安装虚拟机

准备4台虚拟机,并给每个虚拟机安装centos7.x操作系统。如果有条件还是准备6台虚拟机最好,3台master节点,3台node节点,保证master节点数为>=3的奇数个。
CentOS-7.6.1810-x86_64下载:
https://pan.baidu.com/s/1-DgYThgkNbZ42QC5zKp84w 密码: mj9h

角色IP主机名称
master192.168.75.136k8s-master1
master192.168.75.137k8s-master2
node192.168.75.138k8s-node1
node192.168.75.139k8s-node2
VIP192.168.75.140k8s-vip

3.2 系统初始化

# 1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 2、关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
setenforce 0 #临时关闭

# 3、关闭swap
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭

# 4、根据规划设置主机名
hostnamectl set-hostname <主机名> #修改主机名
hostname #查看主机名

# 5、在master节点中添加hosts (IP后面跟的是hostname)
cat >> /etc/hosts << EOF
192.168.75.136 master1.k8s.io k8s-master1
192.168.75.137 master2.k8s.io k8s-master2
192.168.75.138 node1.k8s.io k8s-node1
192.168.75.139 node2.k8s.io k8s-node2
192.168.75.140 master.k8s.io k8s-vip
EOF

# 6、将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge‐nf‐call‐ip6tables=1
net.bridge.bridge‐nf‐call‐iptables=1
EOF
sysctl --system #生效

# 7、时间同步
yum install ntpdate -y
ntpdate time.windows.com

4 在每个master节点安装keepalived

4.1 安装相关依赖包

yum install -y conntrack-tools libseccomp libtool-ltdl
yum install -y keepalived

4.2 配置maser节点

4.2.1 k8s-master1节点配置

# 创建目录
mkdir -p /etc/keepalived
# 创建配置文件
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
  router_id k8s
}
vrrp_script check_haproxy {
  script "killall -0 haproxy"
  interval 3
  weight -2
  fall 10
  rise 2
}
vrrp_instance VI_1 {
  state MASTER
  # 网卡的名称
  interface ens33
  virtual_router_id 51
  priority 250
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass ceb1b3ec013d66163d6ab
  }
virtual_ipaddress {
  # 虚拟IP
  192.168.75.140
}
track_script {
  check_haproxy
}
}
EOF

4.2.2 k8s-master2节点配置

后续添加的其他master节点也使用此配置。

# 创建目录
mkdir -p /etc/keepalived
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
  router_id k8s
}
vrrp_script check_haproxy {
  script "killall -0 haproxy"
  interval 3
  weight -2
  fall 10
  rise 2
}
vrrp_instance VI_1 {
  state BACKUP
  interface ens33
  virtual_router_id 51
  priority 200
  adver_int 1
  authentication {
    auth_type PASS
    auth_pass ceb1b3ec013d66163d6ab
  }
virtual_ipaddress {
  # 虚拟IP
  192.168.75.140
}
track_script {
  check_haproxy
}
}
EOF

4.3 启动和检查

在每个master节点都执行

# 启动keepalived
systemctl start keepalived.service
# 设置开机启动
systemctl enable keepalived.service
# 查看启动状态
systemctl status keepalived.service
# 启动完成后在master1查看网络信息
ip a s ens33

在这里插入图片描述

5 在每个master节点安装haproxy

5.1 安装

yum install -y haproxy

5.2 配置

每台master节点中的配置均相同,配置中声明了后端代理的每个master节点服务器,指定了haproxy的端口为16443,因此16443端口为集群的入口。

# 创建目录
mkdir -p /etc/haproxy
cat > /etc/haproxy/haproxy.cfg << EOF
#-------------------------------
# Global settings
#-------------------------------
global
  log       127.0.0.1 local2
  chroot    /var/lib/haproxy
  pidfile   /var/run/haproxy.pid
  maxconn   4000
  user      haproxy
  group     haproxy
  daemon
  stats socket /var/lib/haproxy/stats
#--------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# usr 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            master1.k8s.io    192.168.75.136:6443 check
  server            master2.k8s.io    192.168.75.137: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
EOF

5.3 启动和检查

每台master都要启动

# 启动haproxy
systemctl start haproxy
# 设置开机启动
systemctl enable haproxy
# 查看启动状态
systemctl status haproxy
# 检查端口
netstat -lntup|grep haproxy

6 所有节点安装Docker/kubeadm/kubelet

6.1 安装Docker

Docker安装移步: Docker for CentOS安装

6.2 添加阿里云yum软件源

cat >/etc/yum.repos.d/kubernetes.repo << EOF
[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

6.3 安装kubeadm、kubelet、kubectl

kubeadm:部署工具
kubelet:systemd守护进程管理
kubectl:k8s命令行管理工具

# 最新版本安装
yum install -y kubelet kubeadm kubectl
# 安装指定版本 
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
#设置开机启动
systemctl enable kubelet

7 部署Kubernetes Master

7.1 创建kubeadm配置文件

在具有vip的master上操作。此处的vip节点为k8s-master1。

# 创建文件夹
mkdir -p /usr/local/kubernetes/manifests
# 进入文件夹
cd /usr/local/kubernetes/manifests
# 创建kubeadm-config.yaml文件
cat > kubeadm-config.yaml << EOF
apiServer:
  certSANs:
    - k8s-master1
    - k8s-master2
    - master.k8s.io
    - 192.168.75.136
    - 192.168.75.137
    - 192.168.75.140
    - 127.0.0.1
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "master.k8s.io:6443"
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.1.0.0/16
scheduler: {}
EOF

7.2 使用kubeadm命令初始化k8s

# 执行初始化命令
kubeadm init --config kubeadm-config.yaml
# 重置kubeadm初始化
kubeadm reset
如果在执行的过程中出现以下错误:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher

解决办法:
# 执行,然后重新执行初始化命令
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

看到以下消息则表示安装成功,执行保存成功后的命令,因为在后续的加入master和加入node会使用到。
在这里插入图片描述

7.3 根据初始化的结果操作

注意:此命令直接在安装成功后的消息中复制,此处只是提供一个案例

# 此命令直接在k8s-master1执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看集群状态

kubectl get cs
# 查看pod信息
kubectl get pods -n kube-system
# 查看节点信息
kubectl get nodes

在这里插入图片描述
在这里插入图片描述

7.4 安装集群网络

在k8s-master1节点执行:
方式一:

# 如果此地址无法访问,可以更改网络的DNS为8.8.8.8试试,如果还是不行就只能使用方式二
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

方式二:
kube-flannel.yml下载:
链接: https://pan.baidu.com/s/1ANoUdrexA6N_VVc5HOc3QA 密码: h11w

# 安装flannel
kubectl apply -f kube-flannel.yml

看到以下消息则表示安装成功:
在这里插入图片描述
再次查看节点信息:

kubectl get nodes

在这里插入图片描述

7.5 添加k8s-master2节点

1、在k8s-master2节点创建文件夹

mkdir -p /etc/kubernetes/pki/etcd

2、从k8s-master1复制秘钥和相关文件到k8s-master2

# 远程复制,在k8s-master1节点执行
scp /etc/kubernetes/admin.conf root@192.168.75.137:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.75.137:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.75.137:/etc/kubernetes/pki/etcd

3、将k8s-master2节点加入集群
注意:此命令直接在初始化结束后的消息中复制即可,此处为范例:

kubeadm join master.k8s.io:6443 --token 1q5204.4g95k2jkhulmy1pg \
    --discovery-token-ca-cert-hash sha256:3b59671996f0a5092d90bfc5626cc1decce339898d69bc9bfd64cc6a2421c2a5 \
    --control-plane 
如果在执行的过程中出现以下错误:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher

解决办法:
# 执行
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

默认token有效期为24小时,当过期之后,该token就不可用了,这时就需要重新创建token,操作如下:
该命令只能在k8s-master1节点执行!!!

kubeadm token create --print-join-command

看到以下消息,则表示安装成功:
在这里插入图片描述
4、在k8s-master1节点查看集群信息

# 节点信息
kubectl get nodes
# pod信息
kubectl get pods --all-namespaces

在这里插入图片描述
注意:需要等待一段时间,等flannel加载完成,k8s-master2的节点状态才会变成Ready。
5、根据结果消息操作
注意:此命令直接在安装成功后的消息中复制,此处只是提供一个案例

# 此命令直接在k8s-master2执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

至此,k8s-master2节点部署及加入集群完成。

8 加入Kubernetes Node

1、直接在node节点服务器上执行k8s-master1初始化成功后的消息即可:

# 此处命令为范例,请根据实际消息的返回命令执行
kubeadm join master.k8s.io:6443 --token 1q5204.4g95k2jkhulmy1pg \
    --discovery-token-ca-cert-hash sha256:3b59671996f0a5092d90bfc5626cc1decce339898d69bc9bfd64cc6a2421c2a5

看到以下消息则表示安装成功!
在这里插入图片描述
2、由于添加了新的node节点,所以需要重新安装CNI网络
k8s-master1节点执行,由于之前安装了网络,需要需要先删除再安装。
方式一:

# 删除网络
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 如果此地址无法访问,可以更改网络的DNS为8.8.8.8试试,如果还是不行就只能使用方式二
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

方式二:
kube-flannel.yml下载:
链接: https://pan.baidu.com/s/1ANoUdrexA6N_VVc5HOc3QA 密码: h11w

# 删除网络
kubectl delete -f kube-flannel.yml
# 安装flannel
kubectl apply -f kube-flannel.yml

9 测试Kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行。

# 创建镜像容器
kubectl create deployment nginx --image=nginx
# 对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看当前对外的端口
kubectl get pod,svc

在这里插入图片描述
通过浏览器访问nginx:http://k8s-vip:32375
顺便关闭一个master节点,刷新页面,发现还是能访问nginx,说明高可用集群部署成功。

10 注意事项

1、只要有一个master节点正常运行就可以正常对外提供服务。
2、如果需要在master节点使用kubectl相关的命令,必须保证至少有2个master节点正常运行才可以使用,不然会有 Unable to connect to the server: net/http: TLS handshake timeout 这样的错误。
3、节点故障,pod自动转移:当pod所在的节点宕机后,根据 controller-manager的–pod-eviction-timeout 配置,默认是5分钟,5分钟后k8s会把pod状态设置为unkown, 然后在其它节点启动pod。当故障节点恢复后,k8s会删除故障节点上面的unkonw pod。如果你想立即强制迁移,可以用 kubectl drain nodename
4、为了保证集群的高可用性,建议master节点和node节点至少分别部署3台及以上,且master节点应该部署基数个实例(3、5、7、9)。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值