从零开始搭建k8s(v1.13.1)高可用集群(3master+worker)

我们今天的目标是:


k8s-ha.png

环境准备

3台最小化安装后服务器并关闭防火墙和selinux:
hostname: master1          master2           master3
IP:             172.18.0.81    172.18.0.82     172.18.0.83
以下步骤均在三台服务器上执行

# systemctl stop firewalld
# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
# swapoff -a

编辑/etc/fstab,确保swap开机关闭

#cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 21 05:19:53 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a5a945d9-4423-4b00-87db-42dc829b680e /boot                   xfs     defaults        0 0
#/dev/mapper/centosbn -swap swap                    swap    defaults        0 0

安装基本包:

# yum -y install epel-release vim tree ntpdate

添加时间同步

# crontab -l
5 * * * * ntpdate 0.pool.ntp.org

升级内核

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Retrieving http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Retrieving http://elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:elrepo-release-7.0-3.el7.elrepo  ################################# [100%]
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * elrepo-kernel: hkg.mirror.rackspace.com
elrepo-kernel                                                                                                                                                                        | 2.9 kB  00:00:00     
elrepo-kernel/primary_db                                                                                                                                                             | 1.8 MB  00:00:05     
Available Packages
kernel-lt.x86_64                                                                                      4.4.168-1.el7.elrepo                                                                     elrepo-kernel
kernel-lt-devel.x86_64                                                                                4.4.168-1.el7.elrepo                                                                     elrepo-kernel
kernel-lt-doc.noarch                                                                                  4.4.168-1.el7.elrepo                                                                     elrepo-kernel
kernel-lt-headers.x86_64                                                                              4.4.168-1.el7.elrepo                                                                     elrepo-kernel
kernel-lt-tools.x86_64                                                                                4.4.168-1.el7.elrepo                                                                     elrepo-kernel
kernel-lt-tools-libs.x86_64                                                                           4.4.168-1.el7.elrepo                                                                     elrepo-kernel
kernel-lt-tools-libs-devel.x86_64                                                                     4.4.168-1.el7.elrepo                                                                     elrepo-kernel
kernel-ml.x86_64                                                                                      4.19.11-1.el7.elrepo                                                                     elrepo-kernel
kernel-ml-devel.x86_64                                                                                4.19.11-1.el7.elrepo                                                                     elrepo-kernel
kernel-ml-doc.noarch                                                                                  4.19.11-1.el7.elrepo                                                                     elrepo-kernel
kernel-ml-headers.x86_64                                                                              4.19.11-1.el7.elrepo                                                                     elrepo-kernel
kernel-ml-tools.x86_64                                                                                4.19.11-1.el7.elrepo                                                                     elrepo-kernel
kernel-ml-tools-libs.x86_64                                                                           4.19.11-1.el7.elrepo                                                                     elrepo-kernel
kernel-ml-tools-libs-devel.x86_64                                                                     4.19.11-1.el7.elrepo                                                                     elrepo-kernel
perf.x86_64                                                                                           4.19.11-1.el7.elrepo                                                                     elrepo-kernel
python-perf.x86_64                                                                                    4.19.11-1.el7.elrepo                                                                     elrepo-kernel
# yum --enablerepo=elrepo-kernel install kernel-ml

编辑/etc/default/grub:

# cat /etc/default/grub 
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.19.11-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-4.19.11-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-862.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-eafcd01abd94457a8dd71c8c323e46e7
Found initrd image: /boot/initramfs-0-rescue-eafcd01abd94457a8dd71c8c323e46e7.img
done
# reboot

安装docker17.03.2

# yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-selinux \
>                   docker-engine-selinux \
>                   docker-engine
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum install -y --setopt=obsoletes=0  docker-ce-17.03.2.ce-1.el7.centos.x86_64

修改/usr/lib/systemd/system/docker.service:

 ExecStart=/usr/bin/dockerd --graph=/data/docker

启动docker并设置开机启动

# systemctl enable docker
# systemctl start docker

docker安装完成
开始安装kubeadm:
设置阿里云源:

cat <<EOF> /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes  baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64  enabled=1  gpgcheck=0  repo_gpgcheck=0  gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg         [<u>http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg</u>](http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg)
EOF

安装kubeadm

# yum -y install kubelet kubeadm kubectl --disableexcludes=kubernetes
# systemctl enable kubelet
# cat  <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p

拉取镜像(请添加阿里云镜像加速)

# cat pull_mirror.sh 
#!/bin/sh
set -x

docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.13.1
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.13.1
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.13.1
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.13.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd-amd64:3.2.24
docker pull coredns/coredns:1.2.6

docker tag docker.io/mirrorgooglecontainers/kube-proxy-amd64:v1.13.1 k8s.gcr.io/kube-proxy:v1.13.1
docker tag docker.io/mirrorgooglecontainers/kube-apiserver-amd64:v1.13.1 k8s.gcr.io/kube-apiserver:v1.13.1
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager-amd64:v1.13.1 k8s.gcr.io/kube-controller-manager:v1.13.1
docker tag docker.io/mirrorgooglecontainers/kube-scheduler-amd64:v1.13.1 k8s.gcr.io/kube-scheduler:v1.13.1
docker tag docker.io/mirrorgooglecontainers/etcd-amd64:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1

docker rmi mirrorgooglecontainers/kube-proxy-amd64:v1.13.1
docker rmi mirrorgooglecontainers/kube-apiserver-amd64:v1.13.1
docker rmi mirrorgooglecontainers/kube-controller-manager-amd64:v1.13.1
docker rmi mirrorgooglecontainers/kube-scheduler-amd64:v1.13.1
docker rmi mirrorgooglecontainers/etcd-amd64:3.2.24
docker rmi coredns/coredns:1.2.6
docker rmi mirrorgooglecontainers/pause:3.1
# bash pull_mirror.sh 

创建初始化集群文件kubeadm-config.yaml

# cat kubeadm-config.yaml 
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.0
apiServer:
  certSANs:
  - "172.18.0.81"
controlPlaneEndpoint: "172.18.0.81:8443"
networking:
  podSubnet: 10.244.0.0/16

podSubnet: 我用flannel,这里要填写网络类型
certSANS: 填写负载均衡器的ip
controlPlaneEndpoint:填写负载均衡器的ip和端口,比如我的nginx:

stream {
    server {
        listen 8443;
        proxy_pass kube_apiserver;
    }

    upstream kube_apiserver {
        server 172.18.0.81:6443 weight=10 max_fails=3 fail_timeout=5s;
        server 172.18.0.82:6443 weight=10 max_fails=3 fail_timeout=5s;
        server 172.18.0.83:6443 weight=10 max_fails=3 fail_timeout=5s;
    }
}

初始化master1

# kubeadm init --config=kubeadm-config.yaml
...
Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 172.18.0.81:8443 --token wipo2g.wl0is1y9zm7fe7je --discovery-token-ca-cert-hash sha256:15c3869d81037dba2eec8456b9ff7722848586b9df3c16afeac1ac04fe3f3026

创建文件,保存join:

# echo 'kubeadm join 172.18.0.81:8443 --token wipo2g.wl0is1y9zm7fe7je --discovery-token-ca-cert-hash sha256:15c3869d81037dba2eec8456b9ff7722848586b9df3c16afeac1ac04fe3f3026' > join
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config

查看,可知master1已经装好了

# kubectl get nodes
NAME      STATUS     ROLES    AGE     VERSION
master1   NotReady   master   3m46s   v1.13.1

安装flannel网络插件:

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml

把master1生成的证书,拷贝到master2、master3:

# USER=root
# CONTROL_PLANE_IPS="172.18.0.82 172.18.0.83"
# for host in ${CONTROL_PLANE_IPS}; do
     scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
     scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
     scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
     scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
     scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
     scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
     scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
     scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
     scp /etc/kubernetes/admin.conf "${USER}"@$host:
 done

分别在master2、master3中执行以下操作:

# mkdir -p /etc/kubernetes/pki/etcd
# mv ca.crt /etc/kubernetes/pki/
# mv ca.key /etc/kubernetes/pki/
# mv sa.pub /etc/kubernetes/pki/
# mv sa.key /etc/kubernetes/pki/
# mv front-proxy-ca.crt /etc/kubernetes/pki/
# mv front-proxy-ca.key /etc/kubernetes/pki/
# mv etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# mv etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
# mv admin.conf /etc/kubernetes/admin.conf

分别在master2、master3上执行刚才保存的join,后面跟上--experimental-control-plane
在node节点上执行join即可

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

推荐阅读更多精彩内容