0
点赞
收藏
分享

微信扫一扫

kubeadm搭建K8S容器集群管理系统(二)

使用kubeadm部署Kubernetes集群:

初始化集群环境

附:由于需要离线源和calico离线镜像,请提前下载

百度网盘地址

环境说明(centos7):

IP             主机名  角色    内存

192.168.1.63   k8s-master1master   4G

192.168.1.64   k8s-node1worker   4G

192.168.1.62   k8s-node2worker   4G

配置互信

生成ssh 密钥对

[root@k8s-master1~]# ssh-keygen  #一路回车,不输入密码

把本地的ssh公钥文件安装到远程主机对应的账户

[root@k8s-master1~]# ssh-copy-id 192.168.1.1

[root@k8s-master1~]# ssh-copy-id 192.168.1.2

[root@k8s-master1~]# ssh-copy-id 192.168.1.3


所有节点都关闭防火墙和selinux

[root@k8s-master1~]# systemctl stop firewalld ; systemctl disable firewalld

[root@k8s-node2~]# systemctl stop firewalld ; systemctl disable firewalld

[root@k8s-node1~]# systemctl stop firewalld ; systemctl disable firewalld

3台服务器的selinux都关闭

[root@k8s-master1~]# setenforce 0

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

[root@k8s-node2~]# setenforce 0

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

[root@k8s-node1~]# setenforce 0

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

关闭swap分区。

如果不关闭,初始化k8s时,会报以下错误:

Kubelet: Running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false.

[root@k8s-master1~]# swapoff -a

[root@k8s-master1~]# free -m  #可以看到swap分区的大小,已经变为0

total        used        free      shared  buff/cache   available

Mem:           5806         176        5430          12         198        5379

Swap:             0           0           0

关闭swap分区。

[root@k8s-master1~]# swapoff -a

[root@k8s-node2~]# swapoff -a

[root@k8s-node1~]# swapoff -a

永久关闭:注释swap挂载

[root@k8s-master1~]# vim /etc/fstab#给swap这行开头加一下注释#

kubeadm搭建K8S容器集群管理系统(二)_kubeadm部署k8s集群

[root@k8s-node2~]# vim /etc/fstab

kubeadm搭建K8S容器集群管理系统(二)_yum源_02

[root@k8s-node1~]# vim /etc/fstab

kubeadm搭建K8S容器集群管理系统(二)_yum源_03

注:如果是克隆主机请删除网卡中的UUID并重启网络服务。

内核参数修改:br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。

[root@k8s-master1~]# modprobe br_netfilter

[root@k8s-master1~]# echo "modprobe br_netfilter" >> /etc/profile

[root@k8s-master1~]# cat > /etc/sysctl.d/k8s.conf <<EOF

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

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

net.ipv4.ip_forward = 1

EOF

[root@k8s-master1~]# sysctl -p /etc/sysctl.d/k8s.conf

[root@k8s-node2~]# modprobe br_netfilter

[root@k8s-node2~]# echo "modprobe br_netfilter" >> /etc/profile

[root@k8s-node2~]# cat > /etc/sysctl.d/k8s.conf <<EOF

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

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

net.ipv4.ip_forward = 1

EOF

[root@k8s-node2~]# sysctl -p /etc/sysctl.d/k8s.conf

[root@k8s-node1~]# modprobe br_netfilter

[root@k8s-node1~]# echo "modprobe br_netfilter" >> /etc/profile

[root@k8s-node1~]# cat > /etc/sysctl.d/k8s.conf <<EOF

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

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

net.ipv4.ip_forward = 1

EOF

[root@k8s-node1~]# sysctl -p /etc/sysctl.d/k8s.conf

在k8s-master1上配置kubeadm、docker-ce的离线yum源

[root@k8s-master1~]# tar xf k8s-docker.tar.gz -C /opt/

[root@k8s-master1~]# tee /etc/yum.repos.d/k8s-docker.repo << 'EOF'

[k8s-docker]

name=k8s-docker

baseurl=file:///opt/k8s-docker

enabled=1

gpgcheck=0

EOF

配置k8s-node2上配置kubeadm、docker-ce的离线yum源:

[root@k8s-master1~]# scp /etc/yum.repos.d/k8s-docker.repo  192.168.1.62:/etc/yum.repos.d/

k8s-docker.repo                                 100%   80    19.5KB/s   00:00    

[root@k8s-master1~]# scp -r /opt/k8s-docker/  192.168.1.62:/opt/

配置k8s-node1上配置kubeadm、docker-ce的离线yum源:

[root@k8s-master1~]# scp /etc/yum.repos.d/k8s-docker.repo  192.168.1.64:/etc/yum.repos.d/

k8s-docker.repo                                 100%   80    19.5KB/s   00:00    

复制yum源所需软件包到k8s-node1

[root@k8s-master1~]# scp -r /opt/k8s-docker/  192.168.1.64:/opt/

在master和node上安装kubeadm组件,用于后期安装k8s使用,现在还没有安装k8s,注意安装kubelet的软件包在我们离线yum源中已经包含,可以直接安装,如需安装其他版本k8s可以配置在线源进行安装。

[root@k8s-master1~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@k8s-master1~]# systemctl enable kubelet && systemctl start kubelet

[root@k8s-node2~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@k8s-node2~]# systemctl enable kubelet && systemctl start kubelet

[root@k8s-node1~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@k8s-node1~]# systemctl enable kubelet && systemctl start kubelet

注:每个软件包的作用

kubelet   :运行在集群所有节点上,用于启动Pod和容器等对象的工具

kubeadm :用于初始化集群,启动集群的命令工具

kubectl    :用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

扩展:方法2:在线源配置方法:

配置阿里云Kubernetes yum源

[root@k8s-master1~]# tee /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=0

EOF

然后,再执行下面命令,使用在线yum源安装kubeadm和kubelet  

将k8s-master1上Kubernetes的yum源复制给k8s-node1

[root@k8s-master1~]# scp /etc/yum.repos.d/kubernetes.repo 192.168.1.64:/etc/yum.repos.d/

在线源安装一定要指定版本,否则安装最新版,软件版本要和将要安装的k8s集群版本一致。

[root@k8s-master1~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@k8s-master1~]# systemctl enable kubelet && systemctl start kubelet

[root@k8s-node1~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@k8s-node1~]# systemctl enable kubelet && systemctl start kubelet

在k8s-master1上安装docker-ce。我们已经配置了docker本地源,直接安装docker-ce服务。

[root@k8s-master1~]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker-ce

[root@k8s-master1~]# yum install docker-ce docker-ce-cli containerd.io -y

[root@k8s-master1~]# systemctl start docker && systemctl enable docker

添加阿里云镜像加速地址并修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认则为systemd,两者必须一致才可以。

拓展:docker文件驱动systemd

Cgroups 是 linux 内核提供的一种机制,如果你还不了解 cgroups,请参考《Linux cgroups 简介》先了解 cgroups。当 Linux 的 init 系统发展到 systemd 之后,systemd 与 cgroups 发生了融合(或者说 systemd 提供了 cgroups 的使用和管理接口,systemd 管的东西越来越多啊!)。

Systemd 依赖 cgroups

要理解 systemd 与 cgroups 的关系,我们需要先区分 cgroups 的两个方面:层级结构(A)和资源控制(B)。首先 cgroups 是以层级结构组织并标识进程的一种方式,同时它也是在该层级结构上执行资源限制的一种方式。我们简单的把 cgroups 的层级结构称为 A,把 cgrpups 的资源控制能力称为 B。

对于 systemd 来说,A 是必须的,如果没有 A,systemd 将不能很好的工作。而 B 则是可选的,如果你不需要对资源进行控制,那么在编译 Linux 内核时完全可以去掉 B 相关的编译选项。

[root@k8s-master1~]# tee /etc/docker/daemon.json << 'EOF'

{

"registry-mirrors": ["https://rncxm540.mirror.aliyuncs.com"],

 "exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

[root@k8s-master1~]# systemctl daemon-reload

[root@k8s-master1~]# systemctl restart docker

在k8s-node2上安装docker-ce。我们已经配置了docker本地源,直接安装docker-ce服务。

[root@k8s-node2~]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker-ce

[root@k8s-node2~]# yum install docker-ce docker-ce-cli containerd.io -y

[root@k8s-node2~]# systemctl start docker && systemctl enable docker.service

[root@k8s-node2~]# tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://rncxm540.mirror.aliyuncs.com"],

 "exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

[root@k8s-node2~]# systemctl daemon-reload&& systemctl restart docker

在k8s-node1上安装docker-ce。我们已经配置了docker本地源,直接安装docker-ce服务。

[root@k8s-node1~]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker-ce

[root@k8s-node1~]# yum install docker-ce docker-ce-cli containerd.io -y

[root@k8s-node1~]# systemctl start docker && systemctl enable docker.service

[root@k8s-node1~]# tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://rncxm540.mirror.aliyuncs.com"],

 "exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

[root@k8s-node1~]# systemctl daemon-reload

[root@k8s-node1~]# systemctl restart docker


 使用kubeadm初始化集群

在k8s-master1上,离线导入docker镜像。3台机器都导入一下,避免node节点找不到镜像。

[root@k8s-master1~]# docker load -i k8s-images-v1.20.4.tar.gz  #我已经把所有k8s镜像,都导成一个包了。  

[root@k8s-master1~]# gzip -dc k8s-images-v1.20.4.tar.gz  |ssh root@192.168.1.2 'cat | docker load'

[root@k8s-master1~]# gzip -dc k8s-images-v1.20.4.tar.gz  |ssh root@192.168.1.3 'cat | docker load'

注:gzip 参数:-c 将输出写到标准输出上,并保留原有文件。-d 将压缩文件解压。

使用kubeadm初始化k8s集群

[root@k8s-master1~]# kubeadm init --kubernetes-version=1.20.4 \

--apiserver-advertise-address=192.168.1.1 \

--image-repository registry.aliyuncs.com/google_containers  \

--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

注:--image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8ss.grc.io拉取镜像。我们本地有导入到的离线镜像,所以会优先使用本地的镜像。

安装完成。

kubeadm搭建K8S容器集群管理系统(二)_docker_04

节点注册命令我们保存下来稍后我们需要

kubeadm join 192.168.1.1:6443 --token rgz2ww.cmx4k1otzsizgzf2 \

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

     配置kubectl的配置文件,保存一个证书,这样kubectl命令可以使用这个证书对k8s集群进行管理

[root@k8s-master1~]# mkdir -p $HOME/.kube

[root@k8s-master1~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@k8s-master1~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@k8s-master1~]# kubectl get nodes

此时还没有安装calico网络组件,node节点还是不在线状态

 Calico简介

Calico 是一种容器之间互通的网络方案。在虚拟化平台中,比如 OpenStack、Docker 等都需要实现 workloads 之间互连,但同时也需要对容器做隔离控制。而在多数的虚拟化平台实现中,通常都使用二层隔离技术来实现容器的网络,这些二层的技术有一些弊端,比如需要依赖 VLAN、bridge 和隧道等技术,其中 bridge 带来了复杂性,vlan 隔离和 tunnel 隧道在拆包或加包头时,则消耗更多的资源并对物理环境也有要求。随着网络规模的增大,整体会变得越加复杂。

Calico把 Host 当作 Internet 中的路由器,使用 BGP 同步路由,并使用 iptables 来做安全访问策略。

设计思想:Calico 不使用隧道或 NAT 来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过 host 上路由配置完成跨 Host 转发。

设计优势:

1.更优的资源利用

二层网络使用 VLAN 隔离技术,最多有 4096 个规格限制,即便可以使用 vxlan 解决,但 vxlan 又带来了隧道开销的新问题。而 Calico 不使用 vlan 或 vxlan 技术,使资源利用率更高。

2.可扩展性

Calico 使用与 Internet 类似的方案,Internet 的网络比任何数据中心都大,Calico 同样天然具有可扩展性。

3.简单而更容易 debug

因为没有隧道,意味着 workloads 之间路径更短更简单,配置更少,在 host 上更容易进行 debug 调试。

4.更少的依赖

Calico 仅依赖三层路由可达。

5.可适配性

Calico 较少的依赖性使它能适配所有 VM、Container或者混合环境场景。

 k8s组网方案对比

flannel方案:需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod上。数据通信性能则大受影响

Overlay方案:在下层主机网络的上层,基于隧道封装机制,搭建层叠网络,实现跨主机的通信;Overlay无疑是架构最简单清晰的网络实现机制,但数据通信性能则大受影响。

calico方案:在k8s多个网路解决方案中选择了延迟表现最好的-calico方案

总结:Flannel网络非常类似于Docker网络的Overlay驱动,基于二层的层叠网络。

层叠网络的优势:

1.对底层网络依赖较少,不管底层是物理网络还是虚拟网络,对层叠网络的配置管理影响较少;

2.配置简单,逻辑清晰,易于理解和学习,非常适用于开发测试等对网络性能要求不高的场景。

层叠网络的劣势:

1.网络封装是一种传输开销,对网络性能会有影响,不适用于对网络性能要求高的生产场景;

2.由于对底层网络结构缺乏了解,无法做到真正有效的流量工程控制,也会对网络性能产生影响;

3.某些情况下也不能完全做到与下层网络无关,例如隧道封装会对网络的MTU限制产生影响。

Calico,就是非层叠网络:

Calico网络的优势

1.没有隧道封装的网络开销;

2.相比于通过Overlay构成的大二层层叠网络,用iBGP构成的扁平三层网络扩展模式更符合传统IP网络的分布式结构;

3.不会对物理层网络的二层参数如MTU引入新的要求。

Calico网络的劣势:

1.最大的问题是不容易支持多租户,由于没有封装,所有的虚拟机或者容器只能通过真实的IP来区分自己,这就要求所有租户的虚拟机或容器统一分配一个地址空间;而在典型的支持多租户的网络环境中,每个租户可以分配自己的私有网络地址,租户之间即使地址相同也不会有冲突;

2.不容易与其他基于主机路由的网络应用集成。

注:总结:calico 提供一种不同物理机之间,docker容器高速通信的组网方案

kubeadm搭建K8S容器集群管理系统(二)_离线_05

Calico网络模型主要工作组件:

1.Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。felix  [ˈfiːlɪks]费力克斯制导炸弹

2.etcd:分布式键值存储,相当于k8s集群中的数据库,存储着Calico网络模型中IP地址等相关信息。

3.BGP Client(BIRD):Calico 为每一台 Host 部署一个 BGP Client,即每台host上部署一个BIRD。BIRD 是一个单独的持续发展的项目,实现了众多动态路由协议比如 BGP、OSPF、RIP 等。在 Calico 的角色是监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播告诉剩余 Host 节点,从而实现网络互通。

4.BGP Route Reflector:在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步从而大大减少连接数。[meʃ] Reflector  [rɪˈflektə(r)]反射器

安装Calico网络组件:

下载的课程资料上传calico.yaml到linux中,使用yaml文件安装calico 网络插件 。

[root@k8s-master1~]# kubectl apply -f /root/calico.yaml

注:在线下载配置文件地址是:https://docs.projectcalico.org/manifests/calico.yaml

[root@k8s-master1~]# kubectl get pod -n calico-system

kubeadm搭建K8S容器集群管理系统(二)_docker_06

离线源和calico离线镜像链接:

百度网盘地址

举报

相关推荐

0 条评论