k8s - Flannel

1.Flannel概念剖析

Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。这次的分享内容将从Flannel的介绍、工作原理及安装和配置三方面来介绍这个工具的使用方法。

Flannel通过给每台宿主机分配一个子网的方式为容器提供虚拟网络,它基于Linux TUN/TAP,使用UDP封装IP包来创建Overlay网络,并借助Etcd维护网络的分配情况。Flannel is a simple and easy way to configure a layer 3 network fabric designed for Kubernetes.

2. Flannel工作原理

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的IP地址。

在默认的Docker配置中,每个Node的Docker服务会分别负责所在节点容器的IP分配。Node内部得容器之间可以相互访问,但是跨主机(Node)网络相互间是不能通信。

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

Flannel 使用Etcd存储配置数据和子网分配信息。Flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。Etcd也存储这个每个主机对应的IP。

Flannel 使用Etcd的watch机制监视/atomic.io/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。为了提高性能,Flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的IP分片做了代理。

3. Flannel架构介绍

Flannel默认使用8285端口作为UDP封装报文的端口,VxLan使用8472端口。
在这里插入图片描述
那么一个网络报文请求是怎么从一个容器发送到另外一个容器的呢?例如从node1上的Container1容器(IP:10.244.0.13)访问node2上面Container2容器(IP:10.244.1.14)容器。

  • Container1容器10.244.0.13直接访问目标容器Container2的IP 10.244.1.14,请求默认通过容器内部的eth0网卡发送出去。
  • 请求报文通过Veth pair(虚拟设备对)被发送到Docker宿主机VethXXX设备上。
  • VethXXX设备是直接连接到虚拟交换机Docker0(Cni0)的,所以请求报文通过虚拟Bridge Docker0发送出去。
  • 然后查找Docker宿主机的路由表信息,同时外部容器IP的报文都会转发到Flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的Flanneld进程。
  • 因为Flannel在Etcd中存储着子网和宿主机ip的对应关系,所以能够找到10.244.1.14对应的宿主机IP为11.101.1.3,进而开始组装UDP数据包发送数据到目的主机。
    这个请求得以完成的原因每个节点上都启动着一个Flanneld udp进程,都监听着8285端口,所以node1通过Flanneld进程把数据包通过宿主机的Interface网卡发送给node2的Flanneld进程的相应端口即可。
  • 请求报文到达node2之后,继续往上传输,到传输层,交给监听在8285端口的Flanneld程序处理。
  • 请求数据被解包,然后发送给Flannel0虚拟网卡。
  • 查找路由表,发现对应容器的报文要交给Docker0(cni0)。
  • Docker0找到连到自己的容器,把报文发送给Container2,反之同样的工作方式。

4. Kubernetes工作原理剖析

Kubernetes集群是一组节点,这些节点可以是物理服务器或者虚拟机,在其上安装Kubernetes平台。下图为了强调核心概念有所简化。Kubernetes架构图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上图,我们可以看到K8S组件和逻辑关系:Kubernetes集群主要由Master和Node两类节点组成。Master的组件包括:Apiserver、Controller-manager、Scheduler和Etcd等几个组件,其中Apiserver是整个集群的网关。

Node主要由kubelet、kube-proxy、docker引擎等组件组成。kubelet是K8S集群的工作与节点上的代理组件。

在企业生产环境中,一个完整的K8S集群,还包括CoreDNS、Prometheus(或HeapSter)、Dashboard、Ingress Controller等几个附加组件。其中cAdivsor组件作用于各个节点(master和node节点)之上,用于收集及收集容器及节点的CPU、内存以及磁盘资源的利用率指标数据,这些统计数据由Heapster聚合后,可以通过apiserver访问。
K8S集群中创建一个资源(Pod容器)的工作流程和步骤:

  • 客户端提交创建(Deployment、Namespace、Pod)请求,可以通过API Server的Restful API,也可以使用kubectl命令行工具。
  • 然后API Server处理用户的请求,并且存储相关的数据(Deployment、Namespace、Pod)到Etcd配置数据库中。
  • K8S Scheduler调度器通过API Server查看未绑定的Pod。尝试为该Pod分配Node主机资源。
  • 过滤主机 (调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。
  • 主机打分(调度优选):对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。
  • 选择主机:选择打分最高的主机,进行binding操作,结果存储到etcd中。
  • Node节点上Kubelet根据调度结果,调用主机上的Docker引擎执行Pod创建操作,绑定成功后,Scheduler会调用APIServer的API在etcd中创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息。
  • 同时运行在每个工作节点上的Kubelet也会定期与etcd同步boundpod信息,一旦发现应该在该工作节点上运行的boundpod对象没有更新,则调用Docker API创建并启动pod内的容器。

5. Kubernetes 本地私有仓库实战

Docker仓库主要用于存放Docker镜像,Docker仓库分为公共仓库和私有仓库,基于registry可以搭建本地私有仓库,使用私有仓库的优点如下:
节省网络带宽,针对于每个镜像不用去Docker官网仓库下载;
下载Docker镜像从本地私有仓库中下载;
组件公司内部私有仓库,方便各部门使用,服务器管理更加统一;
可以基于GIT或者SVN、Jenkins更新本地Docker私有仓库镜像版本。
官方提供Docker Registry来构建本地私有仓库,目前最新版本为v2,最新版的docker已不再支持v1,Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如下为在192.168.1.147服务器上构建Docker本地私有仓库的方法及步骤:
(1)下载Docker registry镜像,命令如下:

docker pull registry

(2)启动私有仓库容器,启动命令如下:

mkdir -p  /data/registry/
docker run -itd  -p  5000:5000 -v /data/registry:/var/lib/registry  docker.io/registry

Docker本地仓库启动后台容器启动,如图24-2所示:
在这里插入图片描述
默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下。

(3)上传镜像至本地私有仓库:
客户端上传镜像至本地私有仓库,如下以busybox镜像为例,将busybox上传至私有仓库服务器。

docker   pull    busybox
docker   tag    busybox  192.168.1.147:5000/busybox
docker   push  192.168.1.147:5000/busybox

(4)检测本地私有仓库:

curl -XGET http://192.168.1.147:5000/v2/_catalog
curl -XGET http://192.168.1.147:5000/v2/busybox/tags/list

(5)客户端使用本地私有仓库:
客户端docker配置文件添加如下代码,同时重启docker服务,获取本地私有仓库如图24-3所示:

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry 192.168.1.147:5000'
ADD_REGISTRY='--add-registry 192.168.1.147:5000'

在这里插入图片描述
至此,docker本地私有仓库部署完毕,可以向仓库中添加或者更新Docker镜像。
在K8S Docker客户端主机添加本地仓库地址,添加方法如下:
vim /etc/docker/daemon.json文件中代码如下:

{
"insecure-registries":["192.168.1.147:5000"]
}

6. Kubernetes+Jenkins+Docker仓库整合

在企业生产环境中,通常会将K8S+Jenkins+Docker仓库整合起来,实现业务全自动发布。需求如下:
1)K8S云计算平台、Jenkins平台、Docker仓库平台;(提前准备好)
2)部署一套bbs.jfedu.net业务,在Jenkins创建工程-绑定SVN仓库地址-从SVN下载网站代码;
3)网站代码下载成功-制作CentOS7镜像-将网站程序打包至镜像中;
4)将制作的CentOS7镜像(网站程序)-上传至Docker仓库平台;
5)基于K8S云计算平台-部署bbs.jfedu.net业务(CentOS云主机)-NodePort端口-外网用户访问。
6)编写SHELL编程脚本,实现以上步骤整合操作,SHELL代码如下:

#进入Jenkins工程目录;
cd /root/.jenkins/workspace/bbs.jfedu.net/
#查看从SVN下载网站代码;
ls -l index.html
#创建Dockerfile镜像制作文件;
cat>Dockerfile<<EOF
#2022年11月23日11:22:12
#指定基础镜像;
FROM ansible/centos7-ansible:latest
#指定维护者信息;
MAINTAINER www.jfedu.net 2022
#指定工作目录;
WORKDIR /root/
#删除EPEL扩展源;
RUN rm -rf /etc/yum.repos.d/epel*
#安装网络工具和openssh server服务;
RUN yum install -y net-tools openssh-server httpd
#修改系统密码为1;
RUN echo 1|passwd --stdin root
#生成SSHD服务启动基础KEY文件;
RUN ssh-keygen -A
#将网站程序部署至镜像中;
COPY index.html /var/www/html/
RUN chmod 644 /var/www/html/index.html
#暴露映射目录;
VOLUME /var/www/html/
#指定容器入口命令;
ENTRYPOINT /usr/sbin/init
CMD /usr/sbin/sshd -D
EOF
#制作CentOS7镜像文件;
docker build -t centos7-ssh:v2 ./
#修改CentOS7镜像文件tag号;
docker tag centos7-ssh:v2 10.0.12.13:5000/centos7-ssh:v2
#将CentOS7镜像上传Docker私有仓库;
docker push 10.0.12.13:5000/centos7-ssh:v2
#创建K8S bbs-jfedu-net部署yaml文件;
cat>bbs-jfedu-net.yaml<<EOF
kind: Deployment
apiVersion: apps/v1
metadata:name: bbs-jfedu-netnamespace: defaultuid: 16adfc69-ecf1-48d3-9190-518ecffb8818resourceVersion: '3854'generation: 1creationTimestamp: '2022-11-23T13:02:03Z'labels:k8s-app: bbs-jfedu-netannotations:deployment.kubernetes.io/revision: '1'managedFields:- manager: dashboardoperation: UpdateapiVersion: apps/v1time: '2022-11-23T13:02:03Z'fieldsType: FieldsV1fieldsV1:'f:metadata':'f:labels':.: {}'f:k8s-app': {}'f:spec':'f:progressDeadlineSeconds': {}'f:replicas': {}'f:revisionHistoryLimit': {}'f:selector': {}'f:strategy':'f:rollingUpdate':.: {}'f:maxSurge': {}'f:maxUnavailable': {}'f:type': {}'f:template':'f:metadata':'f:labels':.: {}'f:k8s-app': {}'f:name': {}'f:spec':'f:containers':'k:{"name":"bbs-jfedu-net"}':.: {}'f:image': {}'f:imagePullPolicy': {}'f:name': {}'f:resources': {}'f:securityContext':.: {}'f:privileged': {}'f:terminationMessagePath': {}'f:terminationMessagePolicy': {}'f:dnsPolicy': {}'f:restartPolicy': {}'f:schedulerName': {}'f:securityContext': {}'f:terminationGracePeriodSeconds': {}- manager: kube-controller-manageroperation: UpdateapiVersion: apps/v1time: '2022-11-23T13:02:04Z'fieldsType: FieldsV1fieldsV1:'f:metadata':'f:annotations':.: {}'f:deployment.kubernetes.io/revision': {}'f:status':'f:conditions':.: {}'k:{"type":"Available"}':.: {}'f:lastTransitionTime': {}'f:lastUpdateTime': {}'f:message': {}'f:reason': {}'f:status': {}'f:type': {}'k:{"type":"Progressing"}':.: {}'f:lastTransitionTime': {}'f:lastUpdateTime': {}'f:message': {}'f:reason': {}'f:status': {}'f:type': {}'f:observedGeneration': {}'f:replicas': {}'f:unavailableReplicas': {}'f:updatedReplicas': {}
spec:replicas: 1selector:matchLabels:k8s-app: bbs-jfedu-nettemplate:metadata:name: bbs-jfedu-netcreationTimestamp: nulllabels:k8s-app: bbs-jfedu-netspec:containers:- name: bbs-jfedu-netimage: '10.0.12.13:5000/centos7-ssh:v2'resources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FileimagePullPolicy: IfNotPresentsecurityContext:privileged: truerestartPolicy: AlwaysterminationGracePeriodSeconds: 30dnsPolicy: ClusterFirstsecurityContext: {}schedulerName: default-schedulerstrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 25%maxSurge: 25%revisionHistoryLimit: 10progressDeadlineSeconds: 600
status:observedGeneration: 1replicas: 1updatedReplicas: 1unavailableReplicas: 1conditions:- type: Availablestatus: 'False'lastUpdateTime: '2022-11-23T13:02:04Z'lastTransitionTime: '2022-11-23T13:02:04Z'reason: MinimumReplicasUnavailablemessage: Deployment does not have minimum availability.- type: Progressingstatus: 'True'lastUpdateTime: '2022-11-23T13:02:04Z'lastTransitionTime: '2022-11-23T13:02:03Z'reason: ReplicaSetUpdatedmessage: ReplicaSet "bbs-jfedu-net-598fb758b6" is progressing.EOF
#创建bbs-jfedu-net-service.yaml文件;
cat>bbs-jfedu-net-service.yaml<<EOF
kind: Service
apiVersion: v1
metadata:name: bbs-jfedu-netnamespace: defaultuid: c259b7a1-4688-4e51-b5ce-7b9d0a600e15resourceVersion: '4636'creationTimestamp: '2022-11-23T13:16:20Z'labels:k8s-app: bbs-jfedu-netmanagedFields:- manager: dashboardoperation: UpdateapiVersion: v1time: '2022-11-23T13:16:20Z'fieldsType: FieldsV1fieldsV1:'f:metadata':'f:labels':.: {}'f:k8s-app': {}'f:spec':'f:externalTrafficPolicy': {}'f:ports':.: {}'k:{"port":80,"protocol":"TCP"}':.: {}'f:name': {}'f:port': {}'f:protocol': {}'f:targetPort': {}'f:selector':.: {}'f:k8s-app': {}'f:sessionAffinity': {}'f:type': {}
spec:ports:- name: tcp-80-80-js226protocol: TCPport: 80targetPort: 80nodePort: 30286selector:k8s-app: bbs-jfedu-netclusterIP: 10.10.232.164clusterIPs:- 10.10.232.164type: LoadBalancersessionAffinity: NoneexternalTrafficPolicy: Cluster
status:loadBalancer: {}
EOF
#基于yaml文件部署bbs-jfedu-net业务和Service;
kubectl apply -f bbs-jfedu-net.yaml
kubectl apply -f bbs-jfedu-net-service.yaml
#查看bbs-jfedu-net业务是否部署成功;
sleep 20
kubectl get pods -n default

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/157495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

④. GPT错误:导入import pandas as pd库,存储输入路径图片信息存储错误

꧂ 问题最初꧁ 用 import pandas as pd 可是你没有打印各种信息input输入图片路径 print图片尺寸 大小 长宽高 有颜色占比>0.001的按照大小排序将打印信息存储excel表格文件名 表格路径 图片大小 尺寸 颜色类型 占比信息input输入的是文件就处理文件 是文件夹&#x1f4c…

44.ES

一、ES。 &#xff08;1&#xff09;es概念。 &#xff08;1.1&#xff09;什么是es。 &#xff08;1.2&#xff09;es的发展。 es是基于lucene写的。 &#xff08;1.3&#xff09;总结。 es是基于lucene写的。 &#xff08;2&#xff09;倒排索引。 &#xff08;3&#xf…

flutter 开发中的问题与技巧

一、概述 刚开始上手 flutter 开发的时候&#xff0c;总会遇到这样那样的小问题&#xff0c;而官方文档又没有明确说明不能这样使用&#xff0c;本文总结了一些开发中经常会遇到的一些问题和一些开发小技巧。 二、常见问题 1、Expanded 组件只能在 Row、Column、Flex 中使用 C…

GEE:基于GLDAS数据集分析土壤湿度的时间序列变化

作者:CSDN @ _养乐多_ 本篇博客将介绍如何使用Google Earth Engine(GEE)进行土壤湿度数据的分析。我们将使用NASA GLDAS(Global Land Data Assimilation System)数据集,其中包括了关于土壤湿度的信息。通过该数据集,我们将了解土壤湿度在特定区域和时间段内的变化,并生…

springboot vue 部署至Rocky(Centos)并自启,本文部署是若依应用

概述 1、安装nohup&#xff08;后台进程运行java&#xff09; 2、安装中文字体&#xff08;防止中文乱码&#xff09; 3、安装chrony&#xff08;保证分布式部署时间的一致性&#xff09; 5、安装mysql数据&#xff0c;迁移目录&#xff0c;并授权自启动&#xff1b; 6、安…

SpringBoot注解篇之@Validated

目录 前言Validated作用NotNull与NotBlank区别总结 前言 大家好&#xff0c;我是AK&#xff0c;在做新项目顺便整理SpringBoot相关内容&#xff0c;这里主要介绍下Validated注解的应用&#xff0c;减少核心业务逻辑中一些参数判断的代码。 Validated作用 Validated 是 Spring…

Linux友人帐之系统管理与虚拟机相关

一、虚拟机相关操作 1.1虚拟机克隆 虚拟机克隆是指将一个已经安装好的虚拟机复制出一个或多个完全相同的副本&#xff0c;包括虚拟机的配置、操作系统、应用程序等&#xff0c;从而节省安装和配置的时间和资源。 虚拟机克隆的主要用途有&#xff1a; 创建多个相同或相似的虚拟…

论文导读|八月下旬Operations Research文章精选:定价问题专题

编者按&#xff1a; ​ ​在“ Operations Research论文精选”中&#xff0c;我们有主题、有针对性地选择了Operations Research中一些有趣的文章&#xff0c;不仅对文章的内容进行了概括与点评&#xff0c;而且也对文章的结构进行了梳理&#xff0c;旨在激发广大读者的阅读兴…

win10搭建gtest测试环境+vs2019

首先是下载gtest&#xff0c;这个我已经放在了博客上方资源绑定处&#xff0c;这个适用于win10vs版本&#xff0c;关于liunx版本的不能用这个。 或者百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码&#xff1a;vfxz 下…

asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 会议预约管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 会议预约管理系统 二、…

miRNA测序数据生信分析——第四讲,未知物种的生信分析实例

miRNA测序数据生信分析——第四讲&#xff0c;未知物种的生信分析实例 miRNA测序数据生信分析——第四讲&#xff0c;未知物种的生信分析实例1. 下载测序数据2. 原始数据质控——软件fastqc3. 注释tRNA和rRNA&#xff0c;使用Rfam数据库——软件blast&#xff0c;Rfam_statisti…

Excel 插入和提取超链接

构造超链接 HYPERLINK(D1,C1)提取超链接 Sheet页→右键→查看代码Sub link()Dim hl As HyperlinkFor Each hl In ActiveSheet.Hyperlinkshl.Range.Offset(0, 1).Value hl.AddressNext End Sub工具栏→运行→运行子过程→提取所有超链接地址参考&#xff1a; https://blog.cs…

C++编程基础|多级指针

C编程基础|多级指针 一级指针二级指针三级指针多级指针的意义一维数组与数组指针二维数组与数组指针 在看代码时发现下面的内容 GridNodePtr *** GridNodeMap;struct GridNode; typedef GridNode* GridNodePtr;显而GridNodePtr是结构体GridNode首地址指针 那么GridNodeMap是什…

暴力递归转动态规划(九)

题目 题有点难&#xff0c;但还挺有趣 有一个咖啡机数组arr[]&#xff0c;其中arr[i]代表每一个咖啡机冲泡咖啡所需的时间&#xff0c;有整数N&#xff0c;代表着准备冲咖啡的N个人&#xff08;假设这个人拿到咖啡后喝完的时间为0&#xff0c;拿手里咖啡杯即变空&#xff09;&a…

09_Webpack打包工具

1 初识Webpack 1.1 什么是Webpack Webpack打包工具对项目中的复杂文件进行打包处理&#xff0c;可以实现项目的自动化构建&#xff0c;并且给前端开发人员带来了极大的便利。 目前&#xff0c;企业中的绝大多数前端项目是基于Webpack打包工具来进行开发的。 1.2 Webpack的安…

CentOS 7系统安装配置Zabbix 5.0LTS 步骤

目录 一、查看Zabbix官方教程&#xff08;重点&#xff09; 二、安装 Docker 创建 Mysql 容器 安装 Docker 依赖包 添加 Docker 官方仓库 安装 Docker 引擎 启动 Docker 服务并设置开机自启 验证 Docker 是否成功安装 拉取 MySQL 镜像 查看本地镜像 运行容器 停止和启…

安装项目运行环境(python依赖包+allure)

目录 一、安装自动化项目依赖包1.导出项目依赖库2.上传到远程仓库3.进入jenkins容器内&#xff0c;检查是否安装git4.配置git用户信息5.生成秘钥6.把代码拉取下来7.安装python项目依赖8.运行项目 二、安装allure1.jenkins容器内安装allure&#xff0c;进入/usr/local/2.下载all…

IIS 解析漏洞复现

文章目录 IIS 解析漏洞复现1. 漏洞描述2. 漏洞复现3. 漏洞原因4. 安全加固5. 安全防护 IIS 解析漏洞复现 1. 漏洞描述 说明内容漏洞编号漏洞名称IIS 解析漏洞漏洞评级高危影响范围IIS 6.0及以前版本IIS 7.0IIS 7.5漏洞描述IIS 解析漏洞是指在 IIS 服务器上存在的安全漏洞&…

【Hello Algorithm】暴力递归到动态规划(一)

暴力递归到动态规划&#xff08;一&#xff09; 斐波那契数列的动态规划机器人走路初级递归初级动态规划动态规划 先后选牌问题初级递归初级动态规划动态规划 我们可以一句话总结下动态规划 动态规划本质是一种以空间换时间的行为 如果你发现有重复调用的过程 在经过一次之后把…

GRU的 电影评论情感分析 - python 深度学习 情感分类 计算机竞赛

1 前言 &#x1f525;学长分享优质竞赛项目&#xff0c;今天要分享的是 &#x1f6a9; GRU的 电影评论情感分析 - python 深度学习 情感分类 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这…