一、简介

版本信息

IP

Hostname

role

OS

Kernel

Docker

Kubernetes

172.17.0.2k8s-mastermastercentos7.4.17083.10.0-69319.03.8v1.18.2
172.17.0.3k8s-node1nodecentos7.4.17083.10.0-69319.03.8v1.18.2
172.17.0.4k8s-node2nodecentos7.4.17083.10.0-69319.03.8v1.18.2

*操作系统为CentOS7.4.17.8,Docker版本和k8s版本可以自行修改或者适配,请保证节点所有版本和配置一致。

安装方式

k8s-集群搭建的三种方式,目前主流的搭建k8s集群的方式有minikube二进制包以及kubeadm

minikube 一般用于本地开发、测试和学习,不能用于生产环境,是一个工具,minikube快速搭建一个运行在本地的单节点的Kubernetes,本篇不再赘述;

二进制包安装,是在官网下载相关的组件的二进制包,安装和配置集群所有组件;二进制包下载方便,灵活定制,早期kubernetes版本多数用二进制包安装的方式,且经过生产环境验证;

kubeadm安装, kubeadm是一个工具,用于快速搭建kubernetes集群,各个组件均有默认配置,可以省去部分繁琐的配置,在网络可达的情况下能够轻松安装kubernetes集群。

本篇使用kubeadm进行Kubernetes集群部署。

k8s v1.14版本之前多数生产环境集群安装基本通过二进制方式,也经过生产实践,通过二进制安装可以对各个模块有直接的感知,加深对集群组件的理解,也便于排查问题。不过二进制安装方式步骤较为繁琐,搭建过程并不轻松,且kubernetes官网推荐的kubeadm 工具目前已趋于成熟,对镜像的获取也有一定的途径,因此我们这里采用kubeadm的安装方式。

二、部署结构

 

部署结构图

Kubernetes结构说明

架构是master/node的主从架构
master:API Server ,Scheduler,Controller-Manager    (这三个是组件,也是守护进程)

node:kubelet,docker,kube-proxy

组件介绍

API Server:负责接收请求,解析请求,处理请求。
Scheduler:调度器,调度容器创建的请求,负责去观测每一个node之上总共可用的CPU,RAM和存储资源并根据用户所请求创建容器的资源量(因为在k8s上我们可以设定容器的资源上限和资源下限我们成为资源请求量),调度器就是根据容器的最低需求,来进行评估,哪一个节点最合适。因此k8s设定了一个两级调度的方式来完成调度,第一步先做预选(先评估一下到底有多少个是符合这个容器运行需求的节点,比如有三个)。第二步要做优选,从这三者中在选择一个最佳适配,到底哪个是最佳取决于调度算法当中的优选算法来决定的。
kubelet:集群代理,用于能够与master通信的,接收master和调度过来的各种任务由他来执行的我们称为集群代理,是保证容器始终处于健康运行状态的软件。简单来讲API Server把任务编排以后由Scheduler来调度,Scheduler的调度结果由kubelet来执行。比如启动pod、在本地上管理pod健康、创建存储卷等等都由kubelet来执行,但是kubelet本身并不能运行容器,他最多就能接收任务,并在本机上试图启动容器,运行容器就需要容器引擎来运行,最流行的引擎就是docke,是用于pod中的容器的而创建的。

Controller-Manager:控制器管理器,负责监控每一个控制器是健康的,他本身是高可用的,是冗余的。假如Master是三个节点,那么Master每一个上面都有一个控制器管理器,大家都在的时候这三个控制器管理器只有一个正常工作,他是主节点,其他都是做冗余的。
pod:是k8s的最小运行地单元。其可以理解为容器的外壳,给容器做了一层抽象的封装,pod是k8s系统之上最小的调度的逻辑单元,他的内部主要是用来放容器的,pod有一个工作特点:一个pod内可以包含多个容器,多个容器共享同一个底层的网络命名空间Net(网络设备、网络栈、端口等),UTS(主机名和域名)和IPC(信号量、消息队列和共享内存)三个网络名称空间,另外三个互相隔离User、MNT、PID是互相隔离的。所以说pod对外更像是一个模拟虚拟机,而且同一个pod下的容器还共享存储卷,存储卷就不在属于容器而属于pod。各个node主要是运行pod的,一般说一个pod只放一个容器,除非容器之间有非常紧密的关系需要放在同一个pod中,通常他们中的一个容器为主容器,其他的容器是辅助这个主容器中的应用程序完成更多功能来实现的。
 

三、准备工作

kubernetes的正确运行依赖于一些基础环境的设定,如各节点时间通过网络时间保持同步和主机名称解析等,集群规模较大的实践场景中,主机名称即系通常由DNS服务器完成。本篇安装中时间同步服务直接基于系统的默认配置从互联网的时间服务中获取,主机名称即系则由hosts文件进行。

域名和主机名

分布式系统环境中的多主机通信通常基于主机名称进行,这在IP地址存在变化的可能性是为主机提供了固定的访问入口,因此次一般需要有专用的DNS服务负责解决各节点主机名。不过,考虑到此处部署的是测试集群,因此为了降低系统的复杂度,将采用基于hosts的文件进行主机名称解析。

所有节点/etc/hosts文件内容如下:

[root@k8smaster ~]# cat  /etc/hosts

 

172.17.0.2   k8smaster

172.17.0.3   k8snode1

172.17.0.4   k8snode2

 

*172.17.0.x是作者本地的地址,别忘了修改成自己机器的地址

主机时间同步

如果个主机可以直接访问互联网,则直接启动个主机上的chronyd服务即可。或者同步本地时间服务器,或者直接同步集群master节点时间。

关闭防火墙服务

各Node运行的kube-proxy组件均要借助iptables或ipvs构建service资源对象,该资源对象是kubernetes的核心资源之一。出于简化问题复杂度之需,需要事先清除所有主机上的IPtables规则以及关闭firewalld。

所有节点执行:

[root@k8smaster ~]# systemctl stop firewalld.service iptables.service

 

[root@k8smaster ~]# systemctl disable firewalld.service

 

[root@k8smaster ~]# systemctl disable iptables.service

关闭并禁用SElinux

SElinux是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要掌握难度较大。一般情况下,直接把 SELinux 关闭了。有兴趣的可以尝试配置SElinux,本篇直接将SElinux关闭。

所有节点执行:

[root@k8smaster ~]# setenforce 0

 

[root@k8smaster ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

关闭Swap

kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换。 设计者不想交换,因为它会减慢速度。所以关闭swap主要是为了性能考虑。

swap在etcd当中的一个经典问题就是内存超了用到swap导致心跳超时 然后就不断有节点加入退出加入退出最后把整个集群都拖垮。当内存不足时,linux会自动使用swap,将部分内存数据存放到磁盘中,这个这样会使性能下降,为了性能考虑推荐关掉。

所有节点执行:

[root@k8smaster ~]# swapoff -a

 

[root@k8smaster ~]# sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

调整系统参数

所有节点执行:

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

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv6.conf.lo.disable_ipv6 = 1

net.ipv4.neigh.default.gc_stale_time = 120

net.ipv4.conf.all.rp_filter = 0

net.ipv4.conf.default.rp_filter = 0

net.ipv4.conf.default.arp_announce = 2

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_announce = 2

net.ipv4.ip_forward = 1

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_syn_backlog = 1024

net.ipv4.tcp_synack_retries = 2

# 要求iptables不对bridge的数据进行处理

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

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

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

net.netfilter.nf_conntrack_max = 2310720

fs.inotify.max_user_watches=89100

fs.may_detach_mounts = 1

fs.file-max = 52706963

fs.nr_open = 52706963

vm.overcommit_memory=1

vm.panic_on_oom=0

EOF

 

sysctl -p /etc/sysctl.d/k8s.conf

sysctl --system

 

 

如果出现以下错误

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-arptables: No such file or directory

sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: No such file or directory

请执行如下命令

modprobe br_netfilter

modprobe ip_conntrack

安装yum管理工具,Docker存储驱动

yum install -y yum-utils device-mapper-persistent-data lvm2

*yum-utils是用于yum存储库、安装调试包、源包、等包和包管理库的扩展的工具和程序的集合。旨在提升yum扩展性能。

添加yum镜像源配置

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

卸载旧版本Docker

yum remove docker docker-client docker-client-latest docker-common  docker-latest docker-latest-logrotate docker-logrotate docker-selinux  docker-engine-selinux docker-engine -y

安装Docker

yum install -y docker-ce docker-ce-cli containerd.io

指定安装版本

yum install -y docker-ce-18.09.6-3.el7 docker-ce-cli containerd.io

配置Docker lib存储目录

mkdir /home/docker/lib -p

mv /var/lib/docker /home/docker/lib/

ln -s /home/docker/lib/docker /var/lib/docker

systemctl restart docker

设定/home目录为存储目录,建议建立软链接,将目录链接至/home下,不至于/var/lib/docker存储文件增加后,导致根目录 / 空间不够用;

若/var/lib/docker目录(一般是根目录 /)存储空间能满足使用,本步骤可以跳过。

添加docker镜像代理

所有节点执行:

# cat /etc/docker/daemon.json

{

 

"registry-mirrors": [

"https://1nj0zren.mirror.aliyuncs.com",

"https://docker.mirrors.ustc.edu.cn",

"http://f1361db2.m.daocloud.io",

"https://registry.docker-cn.com"

]

}

#默认没有此文件,需要手动创建

systemctl restart docker

添加kubernetes镜像源

 cat  /etc/yum.repos.d/kubernetes.repo

 

[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

安装kubeadm工具

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

此处也可以指定其他版本。

查看kubeadm镜像列表

kubeadm config images list

提前拉取镜像

kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

四、安装master节点

Master节点初始化

kubeadm init --kubernetes-version=1.18.2 --apiserver-advertise-address=172.17.0.2 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --p

od-network-cidr=10.244.0.0/16

*请记录返回的信息,在worker节点通过此discovery-token-ca-cert-hash,执行kubeadm join加入集群。kubeadm init命令执行成功后,会提示你在worker节点执行kubeadm join命令加入master集群,拷贝加入集群即可。

根据提示执行下面的命令,完成master的最终配置

kubectl get node

mkdir -p $HOME/.kube

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

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

在master安装完成后,需要为k8s集群配置网络插件,这里选用的是calico,也有其他网络插件可选。

安装网络插件

wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml

 

kubectl apply -f calico-3.13.1.yaml

五、安装worker节点

kubeadm join 172.17.0.2:6443 --token 93sgg3.t930acppsvsfo02b \
--discovery-token-ca-cert-hash sha256:183ee125ba11f69670a2ed5d5c11af7d31488e7029b3ca4f4696c89aec32272c

*上述ip需要更改成自己master的地址,端口不变,请用自己环境Master节点的返回信息。

六、验证集群

kubectl get nodes

kubectl get all -A

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐