一、架构信息
系统版本:CentOS 7.6
内核:3.10.0‐1062.4.1.el7.x86_64
Kubernetes: v1.16.2
Docker­ce: 19.03
推荐硬件配置:2核4G
Keepalived保证apiserever服务器的IP高可用
Haproxy实现apiserver的负载均衡

二、部署前准备(初始化系统)
1) 关闭selinux和防火墙
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce
systemctl disable firewalld
systemctl stop firewalld
2) 关闭swap
swapoff ­-a ##临时关闭,重启失效
sed ­ri 's/.*swap.*/#&/' /etc/fstab ##永久关闭,需重启
3) 为每台服务器添加host解析记录
cat >>/etc/hosts<<EOF
192.16.0.110 k8s-­
192.16.0.111 k8s­-
192.16.0.112 k8s­-
192.16.0.113 k8s­-
192.16.0.114 k8s­-
EOF
4) 创建并分发密钥
#在 k8s­ 创建ssh密钥。
[root@k8s­ ~]# ssh-­keygen ­-t rsa
#分发 k8s­ 的公钥,用于免密登录其他服务器
for n in `seq -w `;do ssh-copy-id k8s-$n;done
5) 配置内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables =
net.bridge.bridge-nf-call-iptables =
net.ipv4.ip_forward =
vm.swappiness=
EOF
sysctl --system
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 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ­-e ip_vs ­-e nf_conntrack_ipv4
7) 添加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=
gpgcheck=
repo_gpgcheck=
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
三、部署keepalived和haproxy
1) 安装keepalived和haproxy
在k8s-­110和k8s­-111安装keepalived和haproxy
yum install -y keepalived haproxy
2) 修改配置
keepalived配置
k8s­-110的priority为100,k8s-­111的priority为90,其他配置一样。
[root@node‐ ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
290070744@qq.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout
router_id LVS_1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_inteface ens160
virtual_router_id
advert_int
priority
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.16../
}
}
haproxy配置
k8s­-110和k8s­-111的haproxy配置是一样的。此处我们监听的是192.16.0.200的8443端口,因为haproxy是和k8s apiserver是部署在同一台服务器上,
都用6443会冲突。
global
chroot /var/lib/haproxy
daemon
group haproxy
user haproxy
log 127.0.0.1: local0 warning
pidfile /var/lib/haproxy.pid
maxconn
spread-checks
nbproc
defaults
log global
mode tcp
retries
option redispatch
listen https-apiserver
bind 192.16..:
mode tcp
balance roundrobin
timeout server 900s
timeout connect 15s
server apiserver01 192.16.0.110: check port inter fall
server apiserver02 192.16.0.111: check port inter fall
server apiserver03 192.16.0.112: check port inter fall
3) 启动服务
systemctl enable keepalived && systemctl start keepalived
systemctl enable haproxy && systemctl start haproxy

四、部署kubernetes

1) 安装软件
由于kubeadm对Docker的版本是有要求的,需要安装与kubeadm匹配的版本。
由于版本更新频繁,请指定对应的版本号,本文采用1.16.2版本
yum install -­y kubelet­-1.16. kubeadm­-1.16. kubectl­-1.16. ipvsadm ipset docker-­ce
##启动docker
systemctl enable docker && systemctl start docker
##设置kubelet开机启动
systemctl enable kubelet
2) 修改初始化配置
使用kubeadm config print init­-defaults > kubeadm-­init.yaml 打印出默认配置,然后在根据自己的环境修改配置.标注地方需要修改或增加
[root@k8s­ ~]# cat kubeadm-­init.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
-groups:
- system:bootstrappers:kubeadm:default­node­token
token: abcdef.0123456789abcdef
ttl: 24h0m0s ##token有效期,添加节点如果token过期需要重新生成
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.16.0.110 ###本机真实IP
bindPort:
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-­
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.16.0.200:8443" ###单节点这里写真实IP+,多master需要写VIP地址:端口
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-­hangzhou.aliyuncs.com/google_containers ##镜像仓库地址修改为国内阿里云
kind: ClusterConfiguration
kubernetesVersion: v1.16.2 ##版本信息
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16" ##增加此行,为pod网段配置,若没有则flannel网络启动失败
serviceSubnet: 10.96.0.0/
scheduler: {}
3) 预下载镜像
[root@k8s­ ~]# kubeadm config images pull --­­config kubeadm­-init.yaml
[config/images] Pulled registry.cn­hangzhou.aliyuncs.com/google_containers/kube­apiserver:v1.16.2
[config/images] Pulled registry.cn­hangzhou.aliyuncs.com/google_containers/kube­controller­manager:v1.16.2
[config/images] Pulled registry.cn­hangzhou.aliyuncs.com/google_containers/kube­scheduler:v1.16.2
[config/images] Pulled registry.cn­hangzhou.aliyuncs.com/google_containers/kube­proxy:v1.16.2
[config/images] Pulled registry.cn­hangzhou.aliyuncs.com/google_containers/pause:3.1
[config/images] Pulled registry.cn­hangzhou.aliyuncs.com/google_containers/etcd:3.3.­
[config/images] Pulled registry.cn­hangzhou.aliyuncs.com/google_containers/coredns:1.6.
4) 初始化
[root@k8s­110 ~]# kubeadm init --­­config kubeadm-­init.yaml
kubeadm init主要执行了以下操作:
[init]:指定版本进行初始化操作
[preflight] :初始化前的检查和下载所需要的Docker镜像文件
[kubelet­start] :生成kubelet的配置文件”/var/lib/kubelet/config.yaml”,没有这个文件kubelet无法启动,所以初始化之前的kubelet实际上启动失
败。
[certificates]:生成Kubernetes使用的证书,存放在/etc/kubernetes/pki目录中。
[kubeconfig] :生成 KubeConfig 文件,存放在/etc/kubernetes目录中,组件之间通信需要使用对应文件。
[control­plane]:使用/etc/kubernetes/manifest目录下的YAML文件,安装 Master 组件。
[etcd]:使用/etc/kubernetes/manifest/etcd.yaml安装Etcd服务。
[wait­control­plane]:等待control­plan部署的Master组件启动。
[apiclient]:检查Master组件服务状态。
[uploadconfig]:更新配置
[kubelet]:使用configMap配置kubelet。
[patchnode]:更新CNI信息到Node上,通过注释的方式记录。
[mark­control­plane]:为当前节点打标签,打了角色Master,和不可调度标签,这样默认就不会使用Master节点来运行Pod。
[bootstrap­token]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
[addons]:安装附加组件CoreDNS和kube­proxy
5) 为kubectl准备Kubeconfig文件
kubectl默认会在执行的用户家目录下面的.kube目录下寻找config文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf拷贝到.kube/config。
[root@k8s­ ~]# mkdir -­p $HOME/.kube
[root@k8s­ ~]# cp -­i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s­ ~]# chown $(id -­u):$(id -­g) $HOME/.kube/config
在该配置文件中,记录了API Server的访问地址,所以后面直接执行kubectl命令就可以正常连接到API Server中。
 
6) 其他master部署
USER=root
CONTROL_PLANE_IPS="k8s-­111 k8s­-112"
for host in ${CONTROL_PLANE_IPS}; do
ssh "${USER}"@$host "mkdir -­p /etc/kubernetes/pki/etcd"
scp ­-r /etc/kubernetes/pki/ca.* "${USER}"@$host:/etc/kubernetes/pki/
scp -­r /etc/kubernetes/pki/sa.* "${USER}"@$host:/etc/kubernetes/pki/
scp -­r /etc/kubernetes/pki/front­proxy­ca.* "${USER}"@$host:/etc/kubernetes/pki/
scp -­r /etc/kubernetes/pki/etcd/ca.* "${USER}"@$host:/etc/kubernetes/pki/etcd/
scp ­-r /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/
done
在其他master执行,注意­­--control­-plane参数
kubeadm join 192.16.0.200: ­­--token abcdef.0123456789abcdef \
­­discovery­-token-­ca­-cert-­hash sha256:07eabe96310a5a83f8d3447a98cc713ce707466d6fbe721f15dea1b743dd79fb \ ­­
--control-­plane
注意:token有效期是有限的,如果旧的token过期,可以使用kubeadm token create --print-join-command重新创建一条token。
 
7) node部署
在k8s­-113、 k8s-114执行,注意没有--control-plane参数
kubeadm join 192.16.0.200: --­­token abcdef.0123456789abcdef \
--discovery­-token-­ca-­cert-­hash sha256:07eabe96310a5a83f8d3447a98cc713ce707466d6fbe721f15dea1b743dd79fb
8) 部署网络插件flannel
Master节点NotReady的原因就是因为没有使用任何的网络插件,此时Node和Master的连接还不正常。目前最流行的Kubernetes网络插件有
Flannel、Calico、Canal、Weave这里选择使用flannel。
[root@k8s­ ~]# kubectl apply ­-f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-­flannel.yml
9) 查看节点状态

查看pod状态K8S部署完成!!!

kubeadm部署多master节点高可用k8s1.16.2的更多相关文章

  1. kolla部署openstack多节点高可用并对接ceph后端存储(17)

    部署节点执行: 安装基础包和docker yum install python-devel libffi-devel gcc openssl-devel git python-pip -y 升级一下 ...

  2. 用Kolla在阿里云部署10节点高可用OpenStack

    为展现 Kolla 的真正实力,我在阿里云使用 Ansible 自动创建 10 台虚机,部署一套多节点高可用 OpenStack 集群! 前言 上次 Kolla 已经表示了要打 10 个的愿望,这次我 ...

  3. 部署kubernetes1.8.3高可用集群

    Kubernetes作为容器应用的管理平台,通过对pod的运行状态进行监控,并且根据主机或容器失效的状态将新的pod调度到其他node上,实现了应用层的高可用. 针对kubernetes集群,高可用性 ...

  4. [转帖]Breeze部署kubernetes1.13.2高可用集群

    Breeze部署kubernetes1.13.2高可用集群 2019年07月23日 10:51:41 willblog 阅读数 673 标签: kubernetes 更多 个人分类: kubernet ...

  5. mysql-master-ha 实现mysql master的高可用。

    常用的mysql 高可用有下面几种方案: 名称 原理 特点 mysqlmha Perl脚本对mysql master做心跳,master down了以后,选举new master   ,是要改代理层的 ...

  6. 使用Ansible部署etcd 3.2高可用集群

    之前写过一篇手动搭建etcd 3.1集群的文章<etcd 3.1 高可用集群搭建>,最近要初始化一套新的环境,考虑用ansible自动化部署整套环境, 先从部署etcd 3.2集群开始. ...

  7. centos实现三个节点高可用

    centos实现三个节点高可用 使用的资源为keepalived和nginx 高可用主机IP地址 192.168.136.131 192.168.136.133 192.168.136.134 ngi ...

  8. Rancher安装多节点高可用(HA)

    Rancher版本:Rancher v1.0.1 基本配置需求 多节点的HA配置请参照单节点需求 节点需要开放的端口 全局访问:TCP 端口22,80,443,18080(可选:用于在集群启动前 查看 ...

  9. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...

随机推荐

  1. sql对表的操作

    --insert into pppcopy select * from ppp //从表ppp中获取数据,并将其插入到pppcopy中,只拷贝表的数据,不拷贝表的结构(前提:表pppcopy1存在) ...

  2. php-fpm.conf详细解析篇

    一:php-fpm.conf详细解析篇: pm = static (静态模式)时只需修改 max_children数值 pm = dynamic (动态模式)时只需修改其它三个数值 pm.max_ch ...

  3. React的contextType的使用方法简介

    上一篇介绍了Context的使用方法.但是Context会让组件变得不纯粹,因为依赖了全局变量.所以这决定了Context一般不会大规模的使用.所以一般在一个组件中使用一个Context就好. 由于C ...

  4. Tomcat集群搭建超详细(apache+mod_jk+tomcat)

    TOMCAT集群 目录 TOMCAT集群 1 1 集群 1 1.1 什么是集群 1 1.2 集群的特性 1 1.3 集群的分类 1 1.4 TOMCAT集群配置的优缺点 2 1.5 APACHE+TO ...

  5. python正常时间和unix时间戳相互转换的方法

    python正常时间和unix时间戳相互转换的方法 本文实例讲述了python正常时间和unix时间戳相互转换的方法.分享给大家供大家参考.具体分析如下: 这段代码可以用来转换常规时间格式为unix时 ...

  6. Mosaic

    Mosaic 是最古老的WEB浏览器,这是个套件FOR WINDOWS(包括TCP/IP,拨号,EMAIL等).

  7. ajax 通过回调函数获取异步数据

    这里不再解释什么是 ajax,以及什么是异步的问题. 我们直接来问题,这里采用 jQuery 的 ajax 方法来获取数据. 先来看代码: $(function () { let db = ''; $ ...

  8. java多线程学习笔记(五)

    补充一个synchronized关键字的结论: 线程A先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法 A线程现持有object对 ...

  9. Linux NIO 系列(02) 阻塞式 IO

    目录 一.环境准备 1.1 代码演示 二.Socket 是什么 2.1 socket 套接字 2.2 套接字描述符 2.3 文件描述符和文件指针的区别 三.基本的 SOCKET 接口函数 3.1 so ...

  10. jsp 内置对象HTTP协议

    有些对象不用声明就能够在JSP页面的脚本部分使用,这就是JSP的内置对象. JSP的内置对象有:request .response.session.application.out. 下面我们将一一介绍 ...