[TOC]
| 资源 | 数量 | 规格 | 
|---|---|---|
| EIP | 1 | 5M带宽 | 
| ECS | 3 | 2 vCPU 16 GB内存 100G硬盘 | 
| ECS | 3 | 2 vCPU 16 GB内存 150G硬盘 | 
| SLB | 2 | 私网slb.s1.small | 
坑:
为了避免上面的坑,作以下规划:
/data下,/data/etcd作软链接到/var/lib/etcd。节点不作调度分配一般POD;SLB设置kubeadm init这台master1作为后端,方式为TCP,且在master1上docker中安装haproxy和keepalived解决自己不能连接VIP问题;     CentOS7v1.12.3docker-ce-18.06.1.ce10.244.0.0/16canal先解决上网问题:
~/.bashrc后面添加以下内容:    
export http_proxy=http://squid_slb_ip:3128
export https_proxy=http://squild_slb_ip:3128
export no_proxy=‘‘mkdir -p /etc/systemd/system/docker.service.d
cat >/etc/systemd/system/docker.service.d/http-proxy.conf<<EOF
[Service]
Environment="HTTP_PROXY=http://squid_slb_ip:3128" "HTTPS_PROXY=http://squid_slb_ip:3128" "NO_PROXY="
EOF
systemctl daemon-reload 
systemctl restart docker先在阿里负载均衡申请内网免费SLB,设置master1的6443为后端端口,8443为监听端口。    
因Kubernetes apiserver为https协议,阿里SLB中能负载均衡HTTPS的只有TCP方式,而TCP方式限制是负载均衡后端不能此负载均衡,所以为了master1能访问这个VIP,手动添加keepalived+haproxy:
先使用脚本初始化环境(需要能上网),脚本内变量INSTALL_CLUSTER="false",执行时询问是否添加节点选否。
https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh
mkdir /etc/haproxy
cat >/etc/haproxy/haproxy.cfg<<EOF
global
  log 127.0.0.1 local0 err
  maxconn 50000
  uid 99
  gid 99
  #daemon
  nbproc 1
  pidfile haproxy.pid
defaults
  mode http
  log 127.0.0.1 local0 err
  maxconn 50000
  retries 3
  timeout connect 5s
  timeout client 30s
  timeout server 30s
  timeout check 2s
listen admin_stats
  mode http
  bind 0.0.0.0:1080
  log 127.0.0.1 local0 err
  stats refresh 30s
  stats uri     /haproxy-status
  stats realm   Haproxy\ Statistics
  stats auth    admin:k8s
  stats hide-version
  stats admin if TRUE
frontend k8s-https
  bind 0.0.0.0:8443
  mode tcp
  #maxconn 50000
  default_backend k8s-https
backend k8s-https
  mode tcp
  balance roundrobin
  server lab1 master1_ip:6443 weight 1 maxconn 1000 check inter 2000 rise 2 fall 3  # 注意更换IP
EOF
docker run -d --name k8s-haproxy -v /etc/haproxy:/usr/local/etc/haproxy:ro -p 8443:8443 -p 1080:1080 --restart always haproxy:1.7.8-alpine
docker run --net=host --cap-add=NET_ADMIN -e KEEPALIVED_INTERFACE=eth0 -e KEEPALIVED_VIRTUAL_IPS="#PYTHON2BASH:[‘master_slb_ip‘]" -e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:[‘maser1_ip‘" -e KEEPALIVED_PASSWORD=k8s --name k8s-keepalived --restart always -d osixia/keepalived:1.4.4   在master1上再次使用该脚本,设置好变量。
https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh
INSTALL_CLUSTER="true"
# 是否安装Keepalived+HAproxy
INSTALL_SLB="false"
# 定义Kubernetes信息
KUBEVERSION="v1.12.2"
DOCKERVERSION="docker-ce-18.06.1.ce"
# k8s master VIP(使用负载均衡IP)
k8s_master_vip="master_slb_ip"
# 主机名:IP,需要执行脚本前设置
server0="master1:master1_ip"
server1="master2:master2_ip"
server2="master3:master3_ip"脚本执行后,至少是可以kubeadm init成功的,脚本过程中,会有命令提示,若master2和master3添加etcd集群失败,可手动按上面命令提示解决。    
集群健康后,修改master_slb的后端,添加master2和master3的6443。并将/etc/kubernetes/admin.conf 和~/.kube/config里修改成server: https://127.0.0.1:8443。因为他们都为master_slb后端,都不能访问master_slb的IP了。而其它非master节点,则可以通过server: https://master_slb_ip:8443访问。
将master1上的/etc/kubernetes/admin.conf拷贝为node5上的~/.kube/config,并修改为server: https://master_slb_ip:8443,这样即可以node5上通过<br/>kubeadm token create --print-join-command获取集群添加命令。
在node5上继续使用该脚本,设置好变量。
https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh
INSTALL_CLUSTER="false"
# 可获取kubeadm join命令的节点IP
k8s_join_ip="node5_ip"  # 脚本中是通过ssh到该IP变量获取kubeadm join命令执行脚本,即可添加节点成功。
因为EIP只有一个,所以存在单点问题,当然可以通过添加EIP绑定ECS解决。因为各种限制条件,没有可以直接上网的私有云服务器好用,使用过程中,可能出现访问不允许代理情况,或者部分地址不需要使用代理访问。若后续Nginx ingress使用阿里SLB暴露服务,需要考虑nginx ingress是否为HTTPS。总之,很折腾。
原文:http://blog.51cto.com/ygqygq2/2325202