从小白到大神之路之学习运维第79天-------Kubernetes网络组件详解

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

第四阶段

时  间2023年8月14日

参加人全班人员

内  容

Kubernetes网络组件详解

目录

一、Kubernetes网络组件

一Flannel网络组件

二Calico 网络插件

1Calico 网络模型工作组件

2Calico 网络 Node 之间两种网络

二、安装部署Calico 网络

一环境准备

二部署docker环境

三部署kubernetes集群

四部署Calico网络插件


 

一、Kubernetes网络组件

        随着 Docker 容器化兴起云计算面对的挑战越来越大例如网络管理、存储管理等。一个数据中心中基本上都有成百上千个容器这么多的容器需要运维人员集中管理。而在云计算的世界中计算是最基础的存储是最重要的网络则是最复杂的。Kubernetes 网络的实现不是集群内部自己实现而是依赖于第三方网络插件。本次主要介绍 Kubernetes网络组件中的一个重要成员——Calico。

一Flannel网络组件

        Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务。它的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。在默认的 Docker 配置中每个节点上的 Docker 服务会分别负责所在节点容器的 IP 分配。这样导致的问题是不同节点上容器可能获得相同的内网 IP 地址。

        Flannel 的设计目的就是为集群中的所有节点重新规划 IP 地址的使用规则从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP 地址并让属于不同节点上的容器能够直接通过内网 IP 地址通信。

        Flannel 实质上是一种“覆盖网络(overlay network)”也就是将 TCP 数据包装在另一种网络包里面进行路由转发和通信目前已经支持 UDP、VxLAN、AWS VPC 和 GCE 路由等数据转发方式默认的节点间数据通信方式是 UDP 转发。

 

        数据从源容器中发出后经由所在主机的 docker0 虚拟网卡转发到 flannel0 虚拟网卡

        这是个 P2P 的虚拟网卡flanneld 服务监听在网卡的另外一端。

        Flannel 通过 Etcd 服务维护了一张节点间的路由表。源主机的 flanneld 服务将原本的数据内容 UDP 封装后根据自己的路由表投递给目的节点的 flanneld 服务数据到达以后被解包然后直接进入目的节点的 flannel0 虚拟网卡之后被转发到目的主机的 docker0 虚拟网卡最后就像本机容器通信一下的有 docker0 路由到达目标容器。

二Calico 网络插件

        Calico 是一种基于 BGP 的、纯三层的、容器间互通的网络方案。与 OpenStack、Kubenetes、AWS、GCE 等云平台都能够良好的集成。在虚拟化平台中如 OpenStack、Docker 等都需要实现 workloads 之间互连但同时也需要对容器做隔离控制就像在Internet 中的服务仅开放 80 端口、公有云的多租户一样提供隔离和管控机制。

        而在多数的虚拟化平台实现中通常使用二层隔离技术来实现容器的网络这些二层技术有一些弊端比如需要依赖 VLAN、bridge 和隧道等技术。其中 bridge 带来了复杂性vlan 隔离和 tunnel 隧道则消耗更多的资源并对物理环境有要求随着网络规模的增大整体会变得越加复杂。我们尝试把 Host 当作 Internet 中的路由器同样使用 BGP 同步路由并使用 Iptables 来做安全访问策略最终设计出了 Calico 方案。

 

1Calico 网络模型工作组件

Felix运行在每一台 Host 的 agent 进程主要负责网络接口管理和监听、路由、ARP管理、ACL 管理和同步、状态上报等。

etcd分布式键值存储主要负责网络元数据一致性确保 Calico 网络状态的准确性可以与 kubernetes 共用

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

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

CalicoCtlCalico 命令行管理工具。

2Calico 网络 Node 之间两种网络

IPIP

从字面来理解就是把一个 IP 数据包又套在一个 IP 包里即把 IP 层封装到 IP 层的一个 tunnel。它的作用相当于一个基于 IP 层的网桥。一般来说普通的网桥是基于 mac 层的根本不需 IP而这个 ipip 则是通过两端的路由做一个 tunnel把两个本来不通的网络通过点对点连接起来。

BGP

边界网关协议Border Gateway Protocol, BGP是互联网上一个核心的去中心化自治路由协议。它通过维护 IP 路由表或‘前缀’表来实现自治系统AS之间的可达性属于矢量路由协议。BGP 不使用传统的内部网关协议IGP的指标而使用基于路径、网络策略或规则集来决定路由。因此它更适合被称为矢量性协议而不是路由协议。BGP通俗的讲就是讲接入到机房的多条线路如电信、联通、移动等融合为一体实现多线单 IPBGP 机房的优点服务器只需要设置一个 IP 地址最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的不会占用服务器的任何系统。

二、安装部署Calico 网络

一环境准备

IP地址

主机名

组件

192.168.100.131

k8s-master

kubeadm、kubelet、kubectl、docker-ce

192.168.100.132

k8s-node01

kubeadm、kubelet、kubectl、docker-ce

192.168.100.133

k8s-node02

kubeadm、kubelet、kubectl、docker-ce

注意所有主机配置推荐CPU2C+  Memory2G+

1、主机初始化配置

所有主机配置禁用防火墙和selinux

[root@localhost ~]# setenforce 0

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# systemctl stop NetworkManager

[root@localhost ~]# systemctl disable NetworkManager

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

 

配置主机名并绑定hosts不同主机名称不同

[root@localhost ~]# hostname k8s-master

[root@k8s-master ~]# cat << EOF >> /etc/hosts

192.168.100.131 k8s-master

192.168.100.132 k8s-node01

192.168.100.133 k8s-node02

EOF

[root@localhost ~]# hostname k8s-node01

[root@localhost ~]# hostname k8s-node02

 

所有主机配置初始化

[root@k8s-master ~]# yum -y install vim wget net-tools lrzsz

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

[root@k8s-master ~]# sed -i '/swap/s/^/#/' /etc/fstab

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

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

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

EOF

[root@k8s-master ~]#  modprobe br_netfilter

[root@k8s-master ~]# sysctl -p

 

二部署docker环境

        三台主机上分别部署 Docker 环境因为 Kubernetes 对容器的编排需要 Docker 的支持。

[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

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


        使用 YUM 方式安装 Docker 时推荐使用阿里的 YUM 源。

[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


[root@k8s-master ~]# yum clean all && yum makecache fast


[root@k8s-master ~]# yum -y install docker-ce

[root@k8s-master ~]# systemctl start docker

[root@k8s-master ~]# systemctl enable docker


镜像加速器所有主机配置

[root@k8s-master ~]# cat << END > /etc/docker/daemon.json

{

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

}

END

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

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

 

三部署kubernetes集群

1组件介绍

三个节点都需要安装下面三个组件

kubeadm安装工具使所有的组件都会以容器的方式运行

kubectl客户端连接K8S API工具

kubelet运行在node节点用来启动容器的工具

2配置阿里云yum源

使用 YUM 方式安装 Kubernetes时推荐使用阿里的 YUM 源。

准备好基础环境和 Docker 环境下面就开始通过 Kubeadm 来部署 Kubernetes 集群。首先安装 Kubelet、Kubeadm 和 Kubectl。

[root@k8s-master ~]# ls /etc/yum.repos.d/

[root@k8s-master ~]#

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

 

3安装kubelet kubeadm kubectl

所有主机配置

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

[root@k8s-master ~]# systemctl enable kubelet

        kubelet 刚安装完成后通过 systemctl start kubelet 方式是无法启动的需要加入节点或初始化为 master 后才可启动成功。

4配置init-config.yaml

        Kubeadm 提供了很多配置项Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的也可将这些配置写入配置文件方便管理复杂的配置项。Kubeadm 配内容是通过 kubeadm config 命令写入配置文件的。

        在master节点安装master 定于为192.168.200.111通过如下指令创建默认的init-config.yaml文件

[root@k8s-master ~]# kubeadm config print init-defaults > init-config.yaml

init-config.yaml配置如下

 

5安装master节点

拉取所需镜像

[root@k8s-master ~]# kubeadm config images list --config init-config.yaml

[root@k8s-master ~]# kubeadm config images pull --config init-config.yaml

 

安装matser节点

[root@k8s-master ~]# kubeadm init --config=init-config.yaml //初始化安装K8S

 

根据提示操作

kubectl 默认会在执行的用户家目录下面的.kube 目录下寻找config 文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf 拷贝到.kube/config

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

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

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

        Kubeadm 通过初始化安装是不包括网络插件的也就是说初始化之后是不具备相关网络功能的比如 k8s-master 节点上查看节点信息都是“Not Ready”状态、Pod 的 CoreDNS无法提供服务等。

6安装node节点

根据master安装时的提示信息

[root@k8s-node01 ~]# kubeadm join

[root@k8s-node02 ~]# kubeadm join

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

        前面已经提到在初始化 k8s-master 时并没有网络相关配置所以无法跟 node 节点通信因此状态都是“NotReady”。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。

四部署Calico网络插件

1、安装 Calico 网络插件

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

2、查看node节点状态。

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

 

3、查看所有pod状态

[root@k8s-master ~]# kubectl get pod --all-namespaces

 

4、查看所有system状态

[root@k8s-master ~]# kubectl get pod -n kube-system

 

5、查看所有docker镜像

[root@k8s-master ~]# docker images

 

6、查看master以及node 的ifconfig信息

Master

Node01

Node02

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s