k8sv1.18.2多master节点高可用集群搭建

虚拟机: VMware Workstation Pro 15

Linux 版本:CentOS Linux release 7.8.2003 (Core)

docker版本:19.03.11

kubectl版本: v1.18.2

操作系统:centos7.6以及更高版本都可以配置:4核cpu,4G内存,1块50G硬盘

==================================所有主机执行如下基础配置:============================================

systemctl stop firewalld  && systemctl  disable  firewalld

yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack ntpdate

yum install iptables-services -y

service iptables stop  && systemctl disable iptables

#时间同步

ntpdate cn.pool.ntp.org

1)crontab -e

* */1 * * * /usr/sbin/ntpdate   cn.pool.ntp.org

2)重启crond服务进程:

service crond restart

关闭selinux

sed -i  's/SELINUX=enforcing/SELINUX=disabled/'  /etc/sysconfig/selinux

sed -i  's/SELINUX=enforcing/SELINUX=disabled/g'  /etc/selinux/config

setenforce 0  #关闭selinux

swapoff -a   #关闭swap

关闭交换分区

swapoff -a# 永久禁用,打开/etc/fstab注释掉swap那一行。sed -i 's/.*swap.*/#&/' /etc/fstab

cat <<EOF >  /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sysctl --system

hostnamectl set-hostname master1

hostnamectl set-hostname master2

hostnamectl set-hostname master3

hostnamectl set-hostname node1

cat >> /etc/hosts << EOF

192.168.180.135 master1

192.168.180.136 master2

192.168.180.137 master3

192.168.180.138 node1

EOF

reboot -f

# 配置master1到node无密码登陆,配置master1到master2、master3无密码登陆

在master1上操作

ssh-keygen -t rsa

#一直回车就可以

ssh-copy-id -i .ssh/id_rsa.pub root@master2

#上面需要输入yes之后,输入密码,输入master2物理机密码即可

ssh-copy-id -i .ssh/id_rsa.pubroot@master3

#上面需要输入yes之后,输入密码,输入master3物理机密码即可

ssh-copy-id -i .ssh/id_rsa.pubroot@node1

#上面需要输入yes之后,输入密码,输入node1物理机密码即可

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

echo 1 >/proc/sys/net/bridge/bridge-nf-call-ip6tables

echo """

vm.swappiness = 0

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

""" > /etc/sysctl.conf

sysctl -p

cat > /etc/sysconfig/modules/ipvs.modules <<EOF

#!/bin/bash

ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"

for kernel_module in \${ipvs_modules}; do

/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1 if [ $? -eq 0 ];

then /sbin/modprobe \${kernel_module} fidone

EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

1.所有机器安装docker环境

===========================================安装docker===============================================

sudo yum update

curl -sSL https://get.docker.com/ | sh

sudo service docker start

docker run hello-world

docker version

yum -y install epel-release

yum -y install python-pip

sudo pip install --upgrade pip

pip -V

sudo pip install docker-compose

安装过程中如果出现如下错误:

Cannot uninstall ‘requests’. It is adistutils installed project and thus we cannot accurately determine which filesbelong to it which would lead to only a partial uninstall.

解决办法:pip install docker-compose--ignore-installed requests

sudo docker-compose --version

######## subprocess32报错解决方案

yum -y install gcc gcc-c++

yum install python-devel

sudo pip install subprocess32 -U

sudo pip install docker-compose

2.所有主机安装k8s环境(kubelet kubeadm kubectl)

===========================================安装k8s===============================================

2.1 按照顺序执行如下

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=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

指定版本方式(本次安装使用这种方式)

yum install -y kubelet-1.18.2 kubectl-1.18.2 kubeadm-1.18.2

或者可以选择安装最新版本方式

yum makecache fast

yum install -y kubelet kubeadm kubectl

# 跳过密钥安装如下

yum install kubectl-1.18.2-0.x86_64 --nogpgcheck

yum install kubelet-1.18.2-0.x86_64 --nogpgcheck

yum install kubeadm-1.18.2-0.x86_64 --nogpgcheck

systemctl enable kubelet.service

2.2 创建一个目录mkdir kubernetes上传all包文件 (官方下载的镜像)


执行如下命令安装:

docker load -i   1-18-kube-apiserver.tar.gz

docker load -i   1-18-kube-scheduler.tar.gz

docker load -i   1-18-kube-controller-manager.tar.gz

docker load -i   1-18-pause.tar.gz

docker load -i   1-18-cordns.tar.gz

docker load -i   1-18-etcd.tar.gz

docker load -i   1-18-kube-proxy.tar.gz

2.3 部署keepalive+lvs实现master节点高可用-对apiserver做高可用

2.3.1 部署keepalived+lvs,在各master节点操作

yum install -y socat keepalived ipvsadm conntrack

2.3.2 修改配置

<master 1 >节点修改之后的keepalived.conf如下所示:

global_defs {

  router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state BACKUP

    nopreempt

    interface ens33

    virtual_router_id 80

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass just0kk

    }

    virtual_ipaddress {

        192.168.180.200

    }

}

virtual_server 192.168.180.200 6443 {

    delay_loop 6

    lb_algo loadbalance

    lb_kind DR

    net_mask 255.255.255.0

    persistence_timeout 0

    protocol TCP

    real_server 192.168.180.135 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 192.168.180.136 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 192.168.180.137 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

<master 2 >节点修改之后的keepalived.conf如下所示:

global_defs {

  router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state BACKUP

    nopreempt

    interface ens33

    virtual_router_id 80

    priority 50

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass just0kk

    }

    virtual_ipaddress {

        192.168.180.200

    }

}

virtual_server 192.168.180.200 6443 {

    delay_loop 6

    lb_algo loadbalance

    lb_kind DR    net_mask 255.255.255.0

    persistence_timeout 0

    protocol TCP

    real_server 192.168.180.135 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 192.168.180.136 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 192.168.180.137 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

<master 3 >节点修改之后的keepalived.conf如下所示:

global_defs {

  router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state BACKUP

    nopreempt

    interface ens33

    virtual_router_id 80

    priority 30

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass just0kk

    }

    virtual_ipaddress {

        192.168.180.200

    }

}

virtual_server 192.168.180.200 6443 {

    delay_loop 6

    lb_algo loadbalance

    lb_kind DR

    net_mask 255.255.255.0

    persistence_timeout 0

    protocol TCP

    real_server 192.168.180.135 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 192.168.180.136 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 192.168.180.137 6443 {

        weight 1

        SSL_GET {

            url {

              path /healthz

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

2.3.3  提示:重要知识点,必看,否则生产会遇到巨大的坑

keepalive需要配置BACKUP,而且是非抢占模式nopreempt,假设master1宕机,启动之后vip不会自动漂移到master1,这样可以保证k8s集群始终处于正常状态,因为假设master1启动,apiserver等组件不会立刻运行,如果vip漂移到master1,那么整个集群就会挂掉,这就是为什么我们需要配置成非抢占模式了

2.3.4 启动顺序master1->master2->master3,在master1、master2、master3依次执行如下命令

systemctl enable keepalived  && systemctl start keepalived  && systemctl status keepalived

2.3.5 ip addr 查看ens33网卡下是否有192.168.180.200 如果只是master1有VIP 则正常  如果出现master节点都有的情况 大概率是vrrp组播问题

则需要执行如下处理:

yum install tcpdump

sudo tcpdump -i ens33 vrrp -n

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

#刷新防火墙

firewall-cmd --reload;

2.4 创建kubeadm-config.yaml 初始化文件 在master1上操作如下

cat kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2

kind: ClusterConfiguration

kubernetesVersion: v1.18.2

controlPlaneEndpoint: 192.168.180.200:6443

apiServer:

certSANs:

- 192.168.180.135

- 192.168.180.136

- 192.168.180.137

- 192.168.180.138

- 192.168.180.200

networking:

podSubnet: 10.244.0.0/16

---

apiVersion: kubeproxy.config.k8s.io/v1alpha1

kind:  KubeProxyConfiguration

mode: ipvs

初始化命令:

kubeadm init --config kubeadm-config.yaml

初始化命令执行成功之后显示如下内容,说明初始化成功了

在master1节点执行如下,这样才能有权限操作k8s资源

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 nodes

master1节点是NotReady

kubectl get pods -n kube-system

cordns也是处于pending状态

安装网络插件解决该问题

docker load -i   cni.tar.gz

docker load -i   calico-node.tar.gz

可以访问下面的github地址,把下面的目录clone和下载下来,解压之后,在把文件传到master1节点即可

https://github.com/luckylucky421/kubernetes1.17.3/tree/master

GIT链接:https://github.com/luckylucky421/kubernetes1.17.3.git

kubectl apply -f calico.yaml

把master1节点的证书拷贝到master2和master3上

(1)在master2和master3上创建证书存放目录

cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p ~/.kube/

(2)在master1节点把证书拷贝到master2和master3上,在master1上操作如下:

scp /etc/kubernetes/pki/ca.crt root@master2:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/ca.key root@master2:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.key root@master2:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.pub root@master2:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.crt root@master2:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.key root@master2:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/etcd/ca.crt root@master2:/etc/kubernetes/pki/etcd/

scp /etc/kubernetes/pki/etcd/ca.key root@master2:/etc/kubernetes/pki/etcd/

scp /etc/kubernetes/pki/ca.crt master3:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/ca.key master3:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.key master3:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.pub master3:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.crt master3:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.key master3:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/etcd/ca.crt master3:/etc/kubernetes/pki/etcd/

scp /etc/kubernetes/pki/etcd/ca.key master3:/etc/kubernetes/pki/etcd/

在master2和master3上执行:

kubeadm join 192.168.180.200:6443 --token lazpeh.w7ofsulkv2ccsz52 \

  --discovery-token-ca-cert-hash sha256:a5ac0c822dcac9f74339768a2173f0aac460dffd04364d4eaad70f77573d5d18 \

  --control-plane

备注:--control-plane:这个参数表示加入到k8s集群的是master节点

在master2和master3上操作:

    mkdir -p $HOME/.kube

    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

    sudo chown $(id -u):$(id -g)$HOME/.kube/config

在node1上执行:(不需要拷贝证书)

kubeadm join 192.168.180.200:6443 --token lazpeh.w7ofsulkv2ccsz52 \

    --discovery-token-ca-cert-hash sha256:a5ac0c822dcac9f74339768a2173f0aac460dffd04364d4eaad70f77573d5d18

安装traefik

每个节点下执行

docker load -i  traefik_1_7_9.tar.gz

1)生成traefik证书,在master1上操作

mkdir  ~/ikube/tls/ -p

echo """

[req]

distinguished_name = req_distinguished_name

prompt = yes

[ req_distinguished_name ]

countryName                     = Country Name (2 letter code)

countryName_value               = CN

stateOrProvinceName             = State or Province Name (full name)

stateOrProvinceName_value       = Beijing

localityName                    = Locality Name (eg, city)

localityName_value              = Haidian

organizationName                = Organization Name (eg, company)

organizationName_value          = Channelsoft

organizationalUnitName          = Organizational Unit Name (eg, section)

organizationalUnitName_value    = R & D Department

commonName                      = Common Name (eg, your name or your server\'s hostname)

commonName_value                = *.multi.io

emailAddress                    = Email Address

emailAddress_value              = lentil1016@gmail.com

""" > ~/ikube/tls/openssl.cnf

openssl req -newkey rsa:4096 -nodes -config ~/ikube/tls/openssl.cnf -days 3650 -x509 -out ~/ikube/tls/tls.crt -keyout ~/ikube/tls/tls.key

kubectl create -n kube-system secret tls ssl --cert ~/ikube/tls/tls.crt --key ~/ikube/tls/tls.key

2)执行yaml文件  github仓库下载

kubectl apply -f traefik.yaml

3)查看traefik是否部署成功:

kubectl get pods -n kube-system

安装kubernetes-dashboard 2.0版本(kubernetes的web ui界面)

每个节点下执行

docker load -i dashboard_2_0_0.tar.gz

docker load -i metrics-scrapter-1-0-1.tar.gz

只在master1节点操作

kubectl apply -f kubernetes-dashboard.yaml

查看dashboard是否安装成功:

kubectl get pods -n kubernetes-dashboard

查看dashboard前端的service

kubectl get svc -n kubernetes-dashboard

修改service type类型变成NodePort:

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

把 type: ClusterIP变成 type: NodePort,保存退出即可

kubectl get svc -n kube-system

https://192.168.180.200:31102/

通过yaml文件里指定的默认的token登陆dashboard

1)查看kubernetes-dashboard名称空间下的secret

kubectl get secret -n kubernetes-dashboard

kubectl  describe  secret  kubernetes-dashboard-token-lrpsj -n   kubernetes-dashboard

创建管理员token,可查看任何空间权限

kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard

安装metrics监控相关的插件

docker load -i metrics-server-amd64_0_3_1.tar.gz

docker load -i addon.tar.gz

只需要在master1上执行

kubectl apply -f metrics.yaml

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容