2021/01/28 k8s核心组件及工作流程

2021/01/28 k8s核心组件及工作流程_第1张图片
2021/01/28 k8s核心组件及工作流程_第2张图片
2021/01/28 k8s核心组件及工作流程_第3张图片
2021/01/28 k8s核心组件及工作流程_第4张图片

2021/01/28 k8s核心组件及工作流程_第5张图片

K8S用etcd(CP)存储数据,比如pod在哪个节点上
APIserver接收请求,整个集群的访问入口,还有安全访问控制authentication authorization,etcd的数据只能api去写入。
所有的数据想要同步只能通过apiserver来做。
scheduler把业务容器调度到最合适的节点上去

2021/01/28 k8s核心组件及工作流程_第6张图片
加入告诉K8S集群要启动两个副本,谁去保证有2个副本在启动,这是controller manager管理的,假如有一个挂了,它会再次启动。不管怎么样,它去保证副本数是2,副本控制器replication controller。
controller manager其实是一类控制器的总称,总合起来就可以让集群按照我们期望的方式去执行

2021/01/28 k8s核心组件及工作流程_第7张图片

工作节点上的各种状态,管理节点需要知道(比如跑了什么服务,状态是什么)kubelet类似master插在node地方上的大使,汇报想要的数据源。
kubelet功能分三个:启动pod,node节点状态(会监控一些数据源调用apiserver,传到etcd数据库里),健康检查。
proxy是去维护iptables规则。有一些负载均衡的任务

2021/01/28 k8s核心组件及工作流程_第8张图片
2021/01/28 k8s核心组件及工作流程_第9张图片
**所有命令都是通过apiserver,去做一些鉴权,写入etcd,之后,scheduler调度器监听apiserver是否有没有调度的pod,找遍所有节点,哪个节点打分最高就调度到哪个节点。调度好了通过apiserver写到etcd里。
kubelet也是通过监听apiserver bound pod,假如容器调度到自身了,就调用docker运行起来。docker跑起来后也是通过apiserver写入到etcd里
**

2021/01/28 k8s核心组件及工作流程_第10张图片
2021/01/28 k8s核心组件及工作流程_第11张图片
apiserver是所有的请求入口,control manage控制中枢,存储,scheduler主管调度,kubelet负责运行。
除了etcd,其他都是无数据无状态的,更好做高可用

2021/01/28 k8s核心组件及工作流程_第12张图片
2021/01/28 k8s核心组件及工作流程_第13张图片
2021/01/28 k8s核心组件及工作流程_第14张图片
其他组件需要监听

2021/01/28 k8s核心组件及工作流程_第15张图片

第2章 集群安装

2.1 集群安装详解

2021/01/28 k8s核心组件及工作流程_第16张图片
是集成在一个节点的简易K8S,是去测试的一个

在这里插入图片描述
现在两个是比较建议的

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第17张图片
创建三台机器

2021/01/28 k8s核心组件及工作流程_第18张图片
2021/01/28 k8s核心组件及工作流程_第19张图片
2021/01/28 k8s核心组件及工作流程_第20张图片
一般都是间隔一个版本去用,比如现在1.17那就使用1.15
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第21张图片
三台主机进行修改hosts

2021/01/28 k8s核心组件及工作流程_第22张图片
修改/etc/hosts

2021/01/28 k8s核心组件及工作流程_第23张图片
2021/01/28 k8s核心组件及工作流程_第24张图片
2021/01/28 k8s核心组件及工作流程_第25张图片
开启forward转发
2021/01/28 k8s核心组件及工作流程_第26张图片
关闭swap,否则kubelet启动不起来
2021/01/28 k8s核心组件及工作流程_第27张图片

2021/01/28 k8s核心组件及工作流程_第28张图片
2021/01/28 k8s核心组件及工作流程_第29张图片
2021/01/28 k8s核心组件及工作流程_第30张图片
加载br_netfilter,是内核层面的包
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第31张图片
有一个K8S的源

2021/01/28 k8s核心组件及工作流程_第32张图片

2021/01/28 k8s核心组件及工作流程_第33张图片
2021/01/28 k8s核心组件及工作流程_第34张图片
这一个镜像加速

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第35张图片
指定的版本是1.16.2
2021/01/28 k8s核心组件及工作流程_第36张图片
三台节点都去执行一下

2021/01/28 k8s核心组件及工作流程_第37张图片
只在master节点操作
2021/01/28 k8s核心组件及工作流程_第38张图片
在这里插入图片描述

这里如果是多台,就需要改成lb的地址

在这里插入图片描述

让kubeadmin打印初始化的配置
在这里插入图片描述
这里的源改成阿里云的源

在这里插入图片描述
pod网段,默认是没有的,需要加一下,pod网段是跟宿主机无关的,虚拟网络,不管本地虚拟机是192.168的网段还是别的,都是可以用这个地址,只要这个段和物理机不要重复就行

在这里插入图片描述
这是kubeadm安装需要的初始化文件

2021/01/28 k8s核心组件及工作流程_第39张图片
2021/01/28 k8s核心组件及工作流程_第40张图片
2021/01/28 k8s核心组件及工作流程_第41张图片

需要使用的镜像列表

2021/01/28 k8s核心组件及工作流程_第42张图片
拉取镜像

在这里插入图片描述
三个核心的组件

2021/01/28 k8s核心组件及工作流程_第43张图片
coredns是做内部dns解析的

在这里插入图片描述
阿里云的源不能用就用下面的方式

2021/01/28 k8s核心组件及工作流程_第44张图片
下面是dockerhub上,别人推的google镜像mirror

2021/01/28 k8s核心组件及工作流程_第45张图片
2021/01/28 k8s核心组件及工作流程_第46张图片
初始化master节点
在这里插入图片描述
手动如果去安装的话,controller-manager。scheduler,proxy都需要去配置,怎么和apiserver去调用通信,kubeadm的工具都帮你完成了
master节点已经完成初始化了

2021/01/28 k8s核心组件及工作流程_第47张图片
2021/01/28 k8s核心组件及工作流程_第48张图片
在这里插入图片描述
现在看到有一个节点,状态是notready,因为网络插件还没有安装
2021/01/28 k8s核心组件及工作流程_第49张图片
先把s’lave节点添加进去

2021/01/28 k8s核心组件及工作流程_第50张图片
输出什么就在slave节点上添加

2021/01/28 k8s核心组件及工作流程_第51张图片
因为每个K8S集群都需要一个CNI的一个网络插件

2021/01/28 k8s核心组件及工作流程_第52张图片
常用的插件有flannel,calico

2021/01/28 k8s核心组件及工作流程_第53张图片
多尝试几次,这个网站比较慢

2021/01/28 k8s核心组件及工作流程_第54张图片

在这里插入图片描述
需要修改一些配置

2021/01/28 k8s核心组件及工作流程_第55张图片
2021/01/28 k8s核心组件及工作流程_第56张图片
2021/01/28 k8s核心组件及工作流程_第57张图片
以防下载flannel镜像下载错误,可以换成私有的的地址
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第58张图片
2021/01/28 k8s核心组件及工作流程_第59张图片
flannel是在每个节点都需要执行的
2021/01/28 k8s核心组件及工作流程_第60张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第61张图片
2021/01/28 k8s核心组件及工作流程_第62张图片
这里已经是ready状态了

2021/01/28 k8s核心组件及工作流程_第63张图片
2021/01/28 k8s核心组件及工作流程_第64张图片
看一下日志

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第65张图片
150行,改一下地址

2021/01/28 k8s核心组件及工作流程_第66张图片
2021/01/28 k8s核心组件及工作流程_第67张图片
2021/01/28 k8s核心组件及工作流程_第68张图片
2021/01/28 k8s核心组件及工作流程_第69张图片
2021/01/28 k8s核心组件及工作流程_第70张图片
2021/01/28 k8s核心组件及工作流程_第71张图片
在这里插入图片描述
default正在创建中
在这里插入图片描述
在这里插入图片描述
可以直接去访问这个ip的
2021/01/28 k8s核心组件及工作流程_第72张图片
2021/01/28 k8s核心组件及工作流程_第73张图片
2021/01/28 k8s核心组件及工作流程_第74张图片
2021/01/28 k8s核心组件及工作流程_第75张图片
2021/01/28 k8s核心组件及工作流程_第76张图片
修改service为nodeport类型

2021/01/28 k8s核心组件及工作流程_第77张图片
2021/01/28 k8s核心组件及工作流程_第78张图片
2021/01/28 k8s核心组件及工作流程_第79张图片
新加了一个dashboard

2021/01/28 k8s核心组件及工作流程_第80张图片
在这里插入图片描述
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第81张图片
仪表盘的认证

2021/01/28 k8s核心组件及工作流程_第82张图片
2021/01/28 k8s核心组件及工作流程_第83张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第84张图片
2021/01/28 k8s核心组件及工作流程_第85张图片
2021/01/28 k8s核心组件及工作流程_第86张图片
拿到token

2021/01/28 k8s核心组件及工作流程_第87张图片
2021/01/28 k8s核心组件及工作流程_第88张图片
2021/01/28 k8s核心组件及工作流程_第89张图片
2021/01/28 k8s核心组件及工作流程_第90张图片

2.2 理解k8s的组件和资源

master上有三个核心组件,apiserver,controler manager,schedule,etcd
2021/01/28 k8s核心组件及工作流程_第91张图片
都是在master节点上

2021/01/28 k8s核心组件及工作流程_第92张图片
kubelet是一个systemd的管理服务

2021/01/28 k8s核心组件及工作流程_第93张图片
2021/01/28 k8s核心组件及工作流程_第94张图片
node和pod都是K8S的资源类型

2021/01/28 k8s核心组件及工作流程_第95张图片
在这里插入图片描述
kubectl api-resources可以查看所有的资源

2021/01/28 k8s核心组件及工作流程_第96张图片
在这里插入图片描述
pod和node

在这里插入图片描述
namespace,默认default

2021/01/28 k8s核心组件及工作流程_第97张图片
名称空间是K8S集群虚拟的概念。
整个K8S可以看作一个资源池,每个namespace就是对资源池的划分,也就是一个小池,里面有各种资源,pod,service

2021/01/28 k8s核心组件及工作流程_第98张图片

这里有true和false,是否是必须在一个名称空间里
2021/01/28 k8s核心组件及工作流程_第99张图片
node不是必须在一个名称空间里的,它是可以跨namespace的

在这里插入图片描述
这里其实是简写

在这里插入图片描述
在这里插入图片描述
同一个namespace有不同的资源

2021/01/28 k8s核心组件及工作流程_第100张图片
2021/01/28 k8s核心组件及工作流程_第101张图片
想要知道get方法如何使用

2021/01/28 k8s核心组件及工作流程_第102张图片
2021/01/28 k8s核心组件及工作流程_第103张图片
CKA考试的时候会用kubectl很多命令
2021/01/28 k8s核心组件及工作流程_第104张图片
创建名称空间,不知道如何使用可以加-h

2021/01/28 k8s核心组件及工作流程_第105张图片
2021/01/28 k8s核心组件及工作流程_第106张图片

第3章 使用k8s管理业务应用实践

3.1 使用Pod管理业务应用入门

K8S调度最小单元是pod,(豆荚),pod里裹着容器
2021/01/28 k8s核心组件及工作流程_第107张图片
docker并不是唯一的容器引擎,还有RKT,也可以作为容器引擎。K8S作为一个管理平台,去管理容器,都要去兼容。就设计了pod,在pod这一层和容器进行了一个解耦。
容器网络,container网络模式可以去建立容器,管理网络加入到已经存在的容器里,也就是多个容器去共享一个网络空间。pod里的多容器支持的场景更加灵活。

2021/01/28 k8s核心组件及工作流程_第108张图片
使用yaml格式定义pod资源
2021/01/28 k8s核心组件及工作流程_第109张图片

2021/01/28 k8s核心组件及工作流程_第110张图片

2021/01/28 k8s核心组件及工作流程_第111张图片
如果改成JSON格式要表示这个yaml,也就是kv对
2021/01/28 k8s核心组件及工作流程_第112张图片
这个-杠对应的是一个数组
2021/01/28 k8s核心组件及工作流程_第113张图片
其实yaml比json省空间

2021/01/28 k8s核心组件及工作流程_第114张图片
env,这是几个环境变量

2021/01/28 k8s核心组件及工作流程_第115张图片
kind是定义K8S哪种类型
在这里插入图片描述
apiversion通常表示这个功能的成熟程度,成熟之后就用v1
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第116张图片
资源类型和apiversion对照表

2021/01/28 k8s核心组件及工作流程_第117张图片
2021/01/28 k8s核心组件及工作流程_第118张图片
2021/01/28 k8s核心组件及工作流程_第119张图片
explain可以看这个pod的解释,把pod支持的每个属性都打印出来了

2021/01/28 k8s核心组件及工作流程_第120张图片
metadata是固定的,pod对象名字name是myblog,名称空间namespace是luffy,label标签,component:myblog

2021/01/28 k8s核心组件及工作流程_第121张图片
spec特定的一些属性,containers 容器是可以多个的,需要一个myblog镜像,一个mysql数据库,这里的name是容器的名字,可以跟pod的name属性无关
2021/01/28 k8s核心组件及工作流程_第122张图片
docker是用-e 传变量的
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第123张图片
同一个pod容器是可以通过localhost通信的

2021/01/28 k8s核心组件及工作流程_第124张图片
mysql运行的时候,初始化一个数据库
2021/01/28 k8s核心组件及工作流程_第125张图片
2021/01/28 k8s核心组件及工作流程_第126张图片

克隆一下项目地址
2021/01/28 k8s核心组件及工作流程_第127张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第128张图片
2021/01/28 k8s核心组件及工作流程_第129张图片
在这里插入图片描述
去创建一个镜像仓库2021/01/28 k8s核心组件及工作流程_第130张图片
2021/01/28 k8s核心组件及工作流程_第131张图片
启动

2021/01/28 k8s核心组件及工作流程_第132张图片
本地仓库起来了

2021/01/28 k8s核心组件及工作流程_第133张图片
把yaml文件拷贝到机器上

2021/01/28 k8s核心组件及工作流程_第134张图片
制作一个mysql-utf8的镜像

2021/01/28 k8s核心组件及工作流程_第135张图片
2021/01/28 k8s核心组件及工作流程_第136张图片
2021/01/28 k8s核心组件及工作流程_第137张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第138张图片
2021/01/28 k8s核心组件及工作流程_第139张图片
制作dockerfile

在这里插入图片描述
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第140张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第141张图片

python项目镜像构建打tag并且推送到自建仓库上

2021/01/28 k8s核心组件及工作流程_第142张图片
现在yaml里的镜像都有了
2021/01/28 k8s核心组件及工作流程_第143张图片
2021/01/28 k8s核心组件及工作流程_第144张图片
拷贝yaml

2021/01/28 k8s核心组件及工作流程_第145张图片
创建pod

2021/01/28 k8s核心组件及工作流程_第146张图片
创建一个luffy的namespace
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
正在创建中

2021/01/28 k8s核心组件及工作流程_第147张图片
在这里插入图片描述
去slaveka
2021/01/28 k8s核心组件及工作流程_第148张图片
2021/01/28 k8s核心组件及工作流程_第149张图片
describe里有事件

2021/01/28 k8s核心组件及工作流程_第150张图片
两个容器

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第151张图片
访问podip端口

在这里插入图片描述
mysql需要做一下初始化

如果是用docker就只能到K8S-slave1节点上进入容器
在这里插入图片描述
默认进入的是myblog容器

在这里插入图片描述
想进入mysql容器可以-c
2021/01/28 k8s核心组件及工作流程_第152张图片
正常访问里面的数据库

2021/01/28 k8s核心组件及工作流程_第153张图片
再次进入myblog容器对mysql执行初始化,使用django的migrate
2021/01/28 k8s核心组件及工作流程_第154张图片
这里 的mysql就是localhost
2021/01/28 k8s核心组件及工作流程_第155张图片
现在就可以访问了

2021/01/28 k8s核心组件及工作流程_第156张图片
2021/01/28 k8s核心组件及工作流程_第157张图片
2021/01/28 k8s核心组件及工作流程_第158张图片
现在有三个容器,mysql,myblog,pause容器。
每个K8S创建pod的时候,都会去创建pause容器,基础设施的这样一个容器,它的作用就是创建网络名称空间,以后新加入pod里的容器都会用这个pause的网络名称空间。同一个pod内部容器都共享网络名称空间

2021/01/28 k8s核心组件及工作流程_第159张图片
pod容器里会去共享网络名称空间
2021/01/28 k8s核心组件及工作流程_第160张图片
mysql和myblog的ip地址都是一样的

2021/01/28 k8s核心组件及工作流程_第161张图片
2021/01/28 k8s核心组件及工作流程_第162张图片
容器名,pod名,名称空间,随机字符串

2021/01/28 k8s核心组件及工作流程_第163张图片
2021/01/28 k8s核心组件及工作流程_第164张图片
这个事件默认是一个小时,一个小时再看就没有数据了
2021/01/28 k8s核心组件及工作流程_第165张图片
也可以查看yaml
2021/01/28 k8s核心组件及工作流程_第166张图片
进入到一个pod里查看哪个容器的一些信息
2021/01/28 k8s核心组件及工作流程_第167张图片
logs查看容器日志
2021/01/28 k8s核心组件及工作流程_第168张图片
显示最新的10行

2021/01/28 k8s核心组件及工作流程_第169张图片

3.2 使用Pod管理业务应用进阶

2021/01/28 k8s核心组件及工作流程_第170张图片
镜像如何更新到K8S里去
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第171张图片
修改成v2版本
2021/01/28 k8s核心组件及工作流程_第172张图片
2021/01/28 k8s核心组件及工作流程_第173张图片
没有这个镜像,拉取镜像失败了

2021/01/28 k8s核心组件及工作流程_第174张图片
在这里插入图片描述
改回v1
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第175张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第176张图片
在这里插入图片描述
通过文件删除,delete -f
2021/01/28 k8s核心组件及工作流程_第177张图片
2021/01/28 k8s核心组件及工作流程_第178张图片

也可以直接删除pod
在这里插入图片描述
mysql数据需要持久化

2021/01/28 k8s核心组件及工作流程_第179张图片
在K8S里需要一个volumeMounts。这个关键字是和container一个级别的
2021/01/28 k8s核心组件及工作流程_第180张图片
这个volume定义的是每个container都可以使用的,是定义一个全局的,具体容器想用哪个都可以去挂载。

2021/01/28 k8s核心组件及工作流程_第181张图片
hostpath是主机上的目录,定义了一个volume叫mysql-data,类型是hostpath,挂载的宿主机就是path:/opt/mysql/data
2021/01/28 k8s核心组件及工作流程_第182张图片
这里是把上面定义的volume挂载上,
2021/01/28 k8s核心组件及工作流程_第183张图片
2021/01/28 k8s核心组件及工作流程_第184张图片
这两个名字应该是一致的。mountpath就是代表挂载到容器内的,也就是把宿主机的/opt/mysql/data挂载到/var/lib/mysql

2021/01/28 k8s核心组件及工作流程_第185张图片
但是现在只是针对slave1节点,pod飘到slave2节点就没有数据了

2021/01/28 k8s核心组件及工作流程_第186张图片
避免这个情况,就需要nodeselector做定义
在这里插入图片描述
nodeselector作用域也是整个pod,固定飘在mysql标签的节点上
2021/01/28 k8s核心组件及工作流程_第187张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第188张图片
把原来的删掉

在这里插入图片描述

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第189张图片
describe命令去查看为什么pending
2021/01/28 k8s核心组件及工作流程_第190张图片
查看node的标签
2021/01/28 k8s核心组件及工作流程_第191张图片
在这里插入图片描述
slave1的标签就多了一个
2021/01/28 k8s核心组件及工作流程_第192张图片
现在已经running了
2021/01/28 k8s核心组件及工作流程_第193张图片
node打上标签后,就检测到了合适的节点,就调度成功了
2021/01/28 k8s核心组件及工作流程_第194张图片
mysql的数据就可以在slave上的目录看到

2021/01/28 k8s核心组件及工作流程_第195张图片
这只是其中一种方式

2021/01/28 k8s核心组件及工作流程_第196张图片
2021/01/28 k8s核心组件及工作流程_第197张图片
2021/01/28 k8s核心组件及工作流程_第198张图片

这种方式需要定点,把pod和某一个node绑定死,想要实现pod来回调度,通过pv+pvc连接分布式存储的方案。现在ceph用的比较多,但是运维起来比较麻烦
2021/01/28 k8s核心组件及工作流程_第199张图片
K8S提供了健康检查的方式去判断服务是否运行正常。
livenessprobe,存活性探针

2021/01/28 k8s核心组件及工作流程_第200张图片
访问myblog的8002端口,路由是/blog/index

2021/01/28 k8s核心组件及工作流程_第201张图片
两次探针检测间隔时间,默认10秒

在这里插入图片描述
超时时间
在这里插入图片描述
httpget只是其中一种检测方式,这个url只要超过2秒未返回,或者状态码不是200-300之间,就认为是错误的

在这里插入图片描述
livenessprobe主要是去判断容器是否存活,如果不健康,则kublet会把容器杀掉,并根据容器重启策略重启。
如果没有livenessprobe探针,就默认永远成功

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第202张图片
如果探测失败,去把pod杀掉,去做restartpod

2021/01/28 k8s核心组件及工作流程_第203张图片
2021/01/28 k8s核心组件及工作流程_第204张图片
可用性探针就是判断容器是否能提供正常服务。ready是否为true
2021/01/28 k8s核心组件及工作流程_第205张图片
2021/01/28 k8s核心组件及工作流程_第206张图片
2021/01/28 k8s核心组件及工作流程_第207张图片
加入pod执行失败了

2021/01/28 k8s核心组件及工作流程_第208张图片
如果容器ready为false,endpoint controller控制器将此pod的endpoint从对于的service 的endpoint、列表删除。这个失败了,kubelet不会把pod删除掉,只是把流量断了

2021/01/28 k8s核心组件及工作流程_第209张图片
除了httpget方式,其他还有exec和tcpsocket,exec可以定义一个脚本,判断脚本返回值来决定true和flase。如果是0,容器就是健康的。
tcpsocket,就是pod建立tcp链接,建立成功,就代表容器健康

2021/01/28 k8s核心组件及工作流程_第210张图片
2021/01/28 k8s核心组件及工作流程_第211张图片
给myblog应用加上livenessprobe和readinessprobe

2021/01/28 k8s核心组件及工作流程_第212张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第213张图片
在这里插入图片描述
!在这里插入图片描述
再去生成
在这里插入图片描述
这里是1,mysql容器没有加健康检查,所以认为是1

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第214张图片
在这里插入图片描述
这里现在都是500,没有做数据库migrate,也就是path访问不了

2021/01/28 k8s核心组件及工作流程_第215张图片
2021/01/28 k8s核心组件及工作流程_第216张图片
执行migrate
2021/01/28 k8s核心组件及工作流程_第217张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第218张图片
容器的异常退出或健康检查失败后,根据写的重启策略做重启
2021/01/28 k8s核心组件及工作流程_第219张图片
2021/01/28 k8s核心组件及工作流程_第220张图片
args可以理解为docker时候的CMD,这里的1号进程退出码是0,因为正常退出

2021/01/28 k8s核心组件及工作流程_第221张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第222张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第223张图片
10秒钟就会退出,completed就是完成sleep了

2021/01/28 k8s核心组件及工作流程_第224张图片
crashloopbackoff,就是被杀掉了
2021/01/28 k8s核心组件及工作流程_第225张图片
always就是不管什么原因,容器进程退出后,就会帮你去重启
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第226张图片
onfailure只有当容器异常退出,才会去重启
在这里插入图片描述
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第227张图片
在这里插入图片描述
这个状态保持不动了,onfailure只针对非正常退出的场景
2021/01/28 k8s核心组件及工作流程_第228张图片
在这里插入图片描述
在这里插入图片描述
让脚本返回1,认为非正常退出

2021/01/28 k8s核心组件及工作流程_第229张图片
不重启就认为是ok的
在这里插入图片描述
exit 1就是非正常,变成error了
2021/01/28 k8s核心组件及工作流程_第230张图片

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第231张图片
2021/01/28 k8s核心组件及工作流程_第232张图片
ifnotpresent 这里是给容器设置一个镜像的拉取策略

2021/01/28 k8s核心组件及工作流程_第233张图片
always。不管有没有都去拉
ifnotpresent,本地没有就去拉取

2021/01/28 k8s核心组件及工作流程_第234张图片
对于pod 可以做一些资源限制
2021/01/28 k8s核心组件及工作流程_第235张图片
2021/01/28 k8s核心组件及工作流程_第236张图片
request是请求的,是资源调度阶段,容器的最小分配,limit是上限
2021/01/28 k8s核心组件及工作流程_第237张图片
2021/01/28 k8s核心组件及工作流程_第238张图片

、只是做一个调度的时候的判断依据

在这里插入图片描述
在这里插入图片描述
这个cpu只能写一个时间比,相对的值

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第239张图片
2021/01/28 k8s核心组件及工作流程_第240张图片
docker-run的时候相关的限制

2021/01/28 k8s核心组件及工作流程_第241张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第242张图片

3.3 使用Pod管理业务应用优化篇

这个是完善以后的yaml
2021/01/28 k8s核心组件及工作流程_第243张图片
2021/01/28 k8s核心组件及工作流程_第244张图片
2021/01/28 k8s核心组件及工作流程_第245张图片
2021/01/28 k8s核心组件及工作流程_第246张图片
优化的地方,账号密码现在是明文

2021/01/28 k8s核心组件及工作流程_第247张图片
这个容器更新频率是很低的,只是 一个数据库,不应该和业务容器在一起
2021/01/28 k8s核心组件及工作流程_第248张图片
2021/01/28 k8s核心组件及工作流程_第249张图片
中间件不适合频繁更新,是为多个资源提供服务的。yaml不应该存在敏感信息
2021/01/28 k8s核心组件及工作流程_第250张图片
2021/01/28 k8s核心组件及工作流程_第251张图片
2021/01/28 k8s核心组件及工作流程_第252张图片
2021/01/28 k8s核心组件及工作流程_第253张图片
以host网络模式启动容器

2021/01/28 k8s核心组件及工作流程_第254张图片
node选择器

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第255张图片
删除目前的pod

在这里插入图片描述
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第256张图片

2021/01/28 k8s核心组件及工作流程_第257张图片
创建一个mysql pod

在这里插入图片描述
在这里插入图片描述
apply可以把镜像替换掉

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第258张图片
2021/01/28 k8s核心组件及工作流程_第259张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第260张图片
在这里插入图片描述
现在就都跑起来了

在这里插入图片描述
现在就可以访问到页面了

2021/01/28 k8s核心组件及工作流程_第261张图片
2021/01/28 k8s核心组件及工作流程_第262张图片
现在是两个pod

在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第263张图片
configmap和secret可以实现让配置文件和yaml文件分离,yaml文件不变,configmap和secret术语进行改变

2021/01/28 k8s核心组件及工作流程_第264张图片
2021/01/28 k8s核心组件及工作流程_第265张图片
namespace一定要和pod是一个
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第266张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第267张图片
2个术语
2021/01/28 k8s核心组件及工作流程_第268张图片
2021/01/28 k8s核心组件及工作流程_第269张图片
虽然K8S的所有资源都可以通过yaml创建,但是也可以通过kubectl这个命令创建configmap资源
2021/01/28 k8s核心组件及工作流程_第270张图片
2021/01/28 k8s核心组件及工作流程_第271张图片
可以基于文件,目录创建configmap
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210208220000676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3ODE4,si2021/01/28 k8s核心组件及工作流程_第272张图片
从文件里创建,key1类似mysql_host
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第273张图片
也可以从环境变量里创建

也可以从环境变量里窗口
2021/01/28 k8s核心组件及工作流程_第274张图片
不知道怎么用还可以到官网查

2021/01/28 k8s核心组件及工作流程_第275张图片
secret和configmap的区别,secret管理敏感类信息,默认会base64编码存储

2021/01/28 k8s核心组件及工作流程_第276张图片
注意echo -n做一下base64加密
2021/01/28 k8s核心组件及工作流程_第277张图片
两次不一样
2021/01/28 k8s核心组件及工作流程_第278张图片
做一下解码。多一个换行

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
制作secret.yaml文件
2021/01/28 k8s核心组件及工作流程_第279张图片
在这里插入图片描述
在这里插入图片描述
这样就拿到数据

2021/01/28 k8s核心组件及工作流程_第280张图片
还可以通过文件创建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
内容跟第一种方式一致,这是自动的去做的base64
2021/01/28 k8s核心组件及工作流程_第281张图片
2021/01/28 k8s核心组件及工作流程_第282张图片2021/01/28 k8s核心组件及工作流程_第283张图片
2021/01/28 k8s核心组件及工作流程_第284张图片
原来的env是key和value都能看,现在把配置写在了configmap,secret里
2021/01/28 k8s核心组件及工作流程_第285张图片

2021/01/28 k8s核心组件及工作流程_第286张图片
name是以前env里的key,value是从name叫myblog的configmap去引用源mysql_host的key
2021/01/28 k8s核心组件及工作流程_第287张图片
mysqluser就有点不一样了,就是从secret里引用

2021/01/28 k8s核心组件及工作流程_第288张图片
2021/01/28 k8s核心组件及工作流程_第289张图片
现在这个模板就可以不管什么环境都可以去部署了

2021/01/28 k8s核心组件及工作流程_第290张图片

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第291张图片
把旧的删除
在这里插入图片描述
创建新的
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第292张图片
2021/01/28 k8s核心组件及工作流程_第293张图片
在这里插入图片描述
输入env查看变量
2021/01/28 k8s核心组件及工作流程_第294张图片
configmap和secret不能跨namespace使用,且更新后,pod内的env不会去更新

2021/01/28 k8s核心组件及工作流程_第295张图片
通过configmap和secret解决了变量的敏感信息带来的安全隐患

2021/01/28 k8s核心组件及工作流程_第296张图片
2021/01/28 k8s核心组件及工作流程_第297张图片
K8S默认就建立了很多namespace
2021/01/28 k8s核心组件及工作流程_第298张图片
2021/01/28 k8s核心组件及工作流程_第299张图片
可以直接拿它的来进行参考

2021/01/28 k8s核心组件及工作流程_第300张图片
这里更新了,kubelet会自动更新

2021/01/28 k8s核心组件及工作流程_第301张图片

3.4 pod状态与生命周期

2021/01/28 k8s核心组件及工作流程_第302张图片
kubectl创建的时候,apiserver接收请求,至少一个容器启动,running,如果一个容器以非正常状态退出,进入failed,策略如果是onfailure,kubelet再杀掉,重新启动2021/01/28 k8s核心组件及工作流程_第303张图片
一般是网络问题
在这里插入图片描述

main是pod里主容器,一般是业务容器,infa是基础设施容器pause,init是pod的初始化容器
2021/01/28 k8s核心组件及工作流程_第304张图片
初始化容器的作用,验证业务依赖的组件是否正常启动。修改目录的权限(要求在容器内部有一定目录权限)
2021/01/28 k8s核心组件及工作流程_第305张图片
是和container一个级别的,可以定义多个初始化容器
2021/01/28 k8s核心组件及工作流程_第306张图片
第一个容器
2021/01/28 k8s核心组件及工作流程_第307张图片更新系统配置

在这里插入图片描述
安全上下文

在这里插入图片描述
还有一个容器是fix-permissions,因为是用1000这个用户启动进程,如果不给目录1000的权限,可能会失败

2021/01/28 k8s核心组件及工作流程_第308张图片
这个目录一般是通过宿主机去挂载的,如果外部用的是root,可能挂载失败,没有权限,就需要fix-permissions把权限给它

在这里插入图片描述
main这个容器在启动的时候,还有生命周期,post start 启动后,pre stop停止前。类似关卡,一般容器运行main后,lieness和readiness做检测。
先启动初始化容器init,然后再去启动main容器

2021/01/28 k8s核心组件及工作流程_第309张图片
从0开始先执行init container,poststart 和maincontainer几乎同一时间运行,进行健康检查,然后停止前做操作
2021/01/28 k8s核心组件及工作流程_第310张图片

2021/01/28 k8s核心组件及工作流程_第311张图片
定义一个初始化容器
2021/01/28 k8s核心组件及工作流程_第312张图片
2021/01/28 k8s核心组件及工作流程_第313张图片
这里定义了本地路径挂载,把宿主机的tmp目录挂载到了容器的loap目录
在这里插入图片描述
初始化容器往目录里写了数据

2021/01/28 k8s核心组件及工作流程_第314张图片
主容器

在这里插入图片描述
开始后,停止前是定义在lifecycle生命周期里的,和readinessprobe同级别

2021/01/28 k8s核心组件及工作流程_第315张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第316张图片
直接运行

2021/01/28 k8s核心组件及工作流程_第317张图片
在slave1上

在这里插入图片描述
end之后重启了。是因为默认是always

2021/01/28 k8s核心组件及工作流程_第318张图片
主动杀掉pod才会触发pre-stop

2021/01/28 k8s核心组件及工作流程_第319张图片

第4章 Pod控制器

4.1 使用Pod控制器管理Django应用

1.K8S为了与特定的容器进行解耦,引入了pod概念。
2.k8s使用yaml文件创建资源。
3.通过kubectl create|get|exec|logs|delete等操作K8S资源,必须指定namespce
4.每启动一个pod,为了实现网络空间共享,会先创建infra容器,并把其他容器网络加入该容器。
5.通过livenessprobe和readinessprobe去对容器的 存活性和就绪性做健康检查,livenessprobe主要是为了解决pod是否会不断的重启。readinness是关乎pod是否是ready,不ready,上层的 ingress controller会把流量断开。
6.request和limit限制资源
7.pod通过initcontainer和lifecycle分别来执行初始化、pod启动,删除时候的操作,使得功能更加全面和灵活。
8.编写yaml讲究方法,学习K8S,养成从官方网站查询 只是的习惯。

2021/01/28 k8s核心组件及工作流程_第320张图片
每个namespace都有一些资源,然后去定义pod,service,configmap
2021/01/28 k8s核心组件及工作流程_第321张图片
4.每启动一个pod,为了实现网络空间共享,会先创建infra容器,并把其他容器网络加入该容器。
他们两个加入infra容器,就可以通过127.0.0.1的来访问了
2021/01/28 k8s核心组件及工作流程_第322张图片
2021/01/28 k8s核心组件及工作流程_第323张图片
只用到pod吗,会面临一些问题:
1.业务应用启动多个副本,
2.pod重建后,ip变化,外部如何访问到pod服务
3.pod挂了,可以自动帮你把pod转移到集群中可用的节点启动起来
4.如果pod是收集节点的数据,需要运行在每个节点上

2021/01/28 k8s核心组件及工作流程_第324张图片
2021/01/28 k8s核心组件及工作流程_第325张图片
工作负载是管理pod的中间层,确保pod资源符合预期的状态,pod出现问题,会尝试重启,重启无效,会新建pod

**replicat是代替用户创建指定 数量的pod。
deployment是在repicaset之上的,用于管理无状态的应用,比如nginx,跑到哪里都可以。
daemonset确保集群中的每一个节点只运行特定的pod副本,通常能够用于实现系统级后台的任务。比如EFK服务。
job只要完成就立即退出,不需要重启或重建。
cronjob 周期性任务控制,不需要持续后台运行。
statefulset 管理有状态的应用,集群服务,es集群,zk集群,这样的每个集群里的节点都需要通信,节点之间还需要hostname命名要求的。
**
2021/01/28 k8s核心组件及工作流程_第326张图片
deployment是目前使用最多的副本控制器
2021/01/28 k8s核心组件及工作流程_第327张图片
2021/01/28 k8s核心组件及工作流程_第328张图片
2021/01/28 k8s核心组件及工作流程_第329张图片
2021/01/28 k8s核心组件及工作流程_第330张图片
metadata一般 定义名字,名称空间,label标签

在这里插入图片描述
replicas期望的副本数
selector选择器,选择匹配标签是app=mysql的pod

2021/01/28 k8s核心组件及工作流程_第331张图片
模板理由metadata,,这都是固定的格式
上面是给deployment打label,下面是给pod打label,

2021/01/28 k8s核心组件及工作流程_第332张图片

10行和14行,这两个标签不一样会匹配不到,应该是一样的
2021/01/28 k8s核心组件及工作流程_第333张图片
现在定义了一个deployment,里面去管理了一个pod,找matchlabels,app=mysql的一个pod,正好在template里定义了一个app=mysql的pod

2021/01/28 k8s核心组件及工作流程_第334张图片
下面都是pod的定义

2021/01/28 k8s核心组件及工作流程_第335张图片
在yaml文件格式上也可以看到,是管理pod上层的pod控制器

在这里插入图片描述
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第336张图片
myblog的deployment

2021/01/28 k8s核心组件及工作流程_第337张图片
2021/01/28 k8s核心组件及工作流程_第338张图片

2021/01/28 k8s核心组件及工作流程_第339张图片
2021/01/28 k8s核心组件及工作流程_第340张图片

在这里插入图片描述
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第341张图片

在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第342张图片
创建myblog
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第343张图片
deployment下的两个pod

在这里插入图片描述
进入容器初始化数据库

2021/01/28 k8s核心组件及工作流程_第344张图片
链接不上数据库
2021/01/28 k8s核心组件及工作流程_第345张图片
要用host模式,先把原来的删除
在这里插入图片描述
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第346张图片
在这里插入图片描述
现在已经ready了

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第347张图片
2021/01/28 k8s核心组件及工作流程_第348张图片
**创建deployment的时候,会创建replicas,会保证一个副本的数量 **
2021/01/28 k8s核心组件及工作流程_第349张图片
前面是replicas,后面是deployment

2021/01/28 k8s核心组件及工作流程_第350张图片
查看一下api-resources

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第351张图片
删掉一个pod,查看副本控制器会如何管理

2021/01/28 k8s核心组件及工作流程_第352张图片
pod会重建一个
2021/01/28 k8s核心组件及工作流程_第353张图片
scale是伸缩一个资源,这个资源是deployment,–replicas副本数

在这里插入图片描述
在这里插入图片描述
现在数量就是2个了
2021/01/28 k8s核心组件及工作流程_第354张图片
pod驱逐eviction,某些 节点失联,会把pod驱逐到其他节点上

2021/01/28 k8s核心组件及工作流程_第355张图片
默认5分钟,kubecrotroller-manager会去检查节点是否ready,不ready会把pod调度到其他节点上

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第356张图片
不想要默认5分钟,把这个参数定义到上面的yaml文件即可
在这里插入图片描述
节点如果内存不足也会驱逐其他pod

2021/01/28 k8s核心组件及工作流程_第357张图片
跟盘至少保持80%以上的容量
在这里插入图片描述

4.2 实现Django应用的滚动更新与服务回滚

deployment管理pod

2021/01/28 k8s核心组件及工作流程_第358张图片
现在只有一个版本叫v1
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第359张图片
现在做一个v2版本
2021/01/28 k8s核心组件及工作流程_第360张图片
2021/01/28 k8s核心组件及工作流程_第361张图片
如果是给pod更新,那么直接更改镜像版本就行
2021/01/28 k8s核心组件及工作流程_第362张图片
这是第一种方式
在这里插入图片描述
在线编辑
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第363张图片
2021/01/28 k8s核心组件及工作流程_第364张图片
现在用的是v1版本

在这里插入图片描述
在这里插入图片描述
这里改成v2版本

2021/01/28 k8s核心组件及工作流程_第365张图片
保存以后会自动更新

在这里插入图片描述
新启动一个,杀掉一个

2021/01/28 k8s核心组件及工作流程_第366张图片
也可以通过给deployment设置镜像
2021/01/28 k8s核心组件及工作流程_第367张图片
deployment后面的名字就是这里的name

2021/01/28 k8s核心组件及工作流程_第368张图片

2021/01/28 k8s核心组件及工作流程_第369张图片
如果不标注会有默认的策略
2021/01/28 k8s核心组件及工作流程_第370张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第371张图片
后面的这一串,其实就是hash整个deploy yaml文件得出来的
2021/01/28 k8s核心组件及工作流程_第372张图片
目标是从v1版本升级到v2版本,通过rs去逐步过度的过程
2021/01/28 k8s核心组件及工作流程_第373张图片
maxsurge最大激增数
maxunavailable最大可用数

在这里插入图片描述
maxsurge,在更新过程中,最多可以比预先设定 值多出几个pod数量,向上取整,5个+5*0.25=6.3,=7个

2021/01/28 k8s核心组件及工作流程_第374张图片
K8S整个更新过程中,最大副本数不能超过2+2*0.25=3
2021/01/28 k8s核心组件及工作流程_第375张图片
2021/01/28 k8s核心组件及工作流程_第376张图片
第一步,类似这样的情况,之前2 个还在,新启动一个新版本的
2021/01/28 k8s核心组件及工作流程_第377张图片
不能少于两个pod,在更新的时候,旧的保持不动,等新的ready,再把旧的删除
在这里插入图片描述
在这里插入图片描述
新启动一个pod,把老的下掉
2021/01/28 k8s核心组件及工作流程_第378张图片
K8S提供了自己的一套revision回滚机制
2021/01/28 k8s核心组件及工作流程_第379张图片
在这里插入图片描述
现在有两个版本

2021/01/28 k8s核心组件及工作流程_第380张图片
删掉deploy

2021/01/28 k8s核心组件及工作流程_第381张图片
2021/01/28 k8s核心组件及工作流程_第382张图片
2021/01/28 k8s核心组件及工作流程_第383张图片
再去创建
2021/01/28 k8s核心组件及工作流程_第384张图片
第一次创建
2021/01/28 k8s核心组件及工作流程_第385张图片
在这里插入图片描述
在更新中
2021/01/28 k8s核心组件及工作流程_第386张图片
现在就是两个版本
2021/01/28 k8s核心组件及工作流程_第387张图片
2021/01/28 k8s核心组件及工作流程_第388张图片
现在是v2版本

2021/01/28 k8s核心组件及工作流程_第389张图片
在这里插入图片描述
也是异步更新

2021/01/28 k8s核心组件及工作流程_第390张图片
2021/01/28 k8s核心组件及工作流程_第391张图片
现在就回到了v1版本了

2021/01/28 k8s核心组件及工作流程_第392张图片

第5章 负载均衡与服务发现

5.1 负载均衡与服务发现实现原理

2021/01/28 k8s核心组件及工作流程_第393张图片
不在K8S及群里,访问这个是不通的
在这里插入图片描述
这是一个service的yaml
2021/01/28 k8s核心组件及工作流程_第394张图片
上面service的80端口转发到下面pod的8002端口
2021/01/28 k8s核心组件及工作流程_第395张图片
跟deployment一样,service也是有选择器的,找所有app=myblog的pod
2021/01/28 k8s核心组件及工作流程_第396张图片
在这里插入图片描述
现在label是app=myblog,后面是对应的rs出来的哈希值
在这里插入图片描述
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第397张图片

在这里插入图片描述
现在就有service了
2021/01/28 k8s核心组件及工作流程_第398张图片
查看这个ip地址反代了哪些pod
2021/01/28 k8s核心组件及工作流程_第399张图片
只要-l有数据,就会加到enpoint
在这里插入图片描述
可以加别名,避免一直敲
在这里插入图片描述
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第400张图片
2021/01/28 k8s核心组件及工作流程_第401张图片
2021/01/28 k8s核心组件及工作流程_第402张图片
2021/01/28 k8s核心组件及工作流程_第403张图片
删掉的话会立即创建一个pod,ip地址就会改变

2021/01/28 k8s核心组件及工作流程_第404张图片
这里K8S强制删除,就不会等待docker指令,就直接操作etcd数据库把数据删除

2021/01/28 k8s核心组件及工作流程_第405张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第406张图片
2021/01/28 k8s核心组件及工作流程_第407张图片
K8S创建svc的时候,就会去创建同名的endpoints,也可以称为ep,endpoint-controller会控制流量的转发,如果pod健康就绪性检查没过,endpoint-controller会把pod删除

2021/01/28 k8s核心组件及工作流程_第408张图片
从上层的cluster ip反代到 下面的pod ip
2021/01/28 k8s核心组件及工作流程_第409张图片
2021/01/28 k8s核心组件及工作流程_第410张图片
访问上层的cluster ip
2021/01/28 k8s核心组件及工作流程_第411张图片
2021/01/28 k8s核心组件及工作流程_第412张图片
给mysql也创建service
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第413张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第414张图片

2021/01/28 k8s核心组件及工作流程_第415张图片

2021/01/28 k8s核心组件及工作流程_第416张图片
使用hostnetwork,有可能引发宿主机端口冲突

2021/01/28 k8s核心组件及工作流程_第417张图片

在这里插入图片描述
这样等于写死了ip,不是最终j解决方案

在这里插入图片描述
利用servicename来访问
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第418张图片

在这里插入图片描述
这样是可以访问到的

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第419张图片
这样就可以实现去ip化,方便迁移
2021/01/28 k8s核心组件及工作流程_第420张图片
原来这里的ip地址,换成mysql
2021/01/28 k8s核心组件及工作流程_第421张图片

在这里插入图片描述
删掉这一行

2021/01/28 k8s核心组件及工作流程_第422张图片
删掉重新 创建

2021/01/28 k8s核心组件及工作流程_第423张图片
修改configmap

在这里插入图片描述
需要加双引号

2021/01/28 k8s核心组件及工作流程_第424张图片
mysql新启动了pod,但是myblogready是0了
在这里插入图片描述
现在就已经切换
2021/01/28 k8s核心组件及工作流程_第425张图片
重启了一次拿到最新的configmap数据

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第426张图片
为什么可以通过servicename去访问,肯定有对应的dns服务器去做解析,coredns
2021/01/28 k8s核心组件及工作流程_第427张图片
系统相关的组件都在kube-system里
2021/01/28 k8s核心组件及工作流程_第428张图片
2021/01/28 k8s核心组件及工作流程_第429张图片
查看容器里的dns服务,这个ip从哪来
在这里插入图片描述
这里有一个kube-dns 的service,只要是kubeadm安装的,会固定10.96.0.10这ip,容器启动会把dns配置注入到容器里作为dns解析
在这里插入图片描述
还有一个搜索域
2021/01/28 k8s核心组件及工作流程_第430张图片
mysql因为匹配到了上面的搜索域才能被访问到,这也是为什么直接访问mysql短名也能被访问到的原因

2021/01/28 k8s核心组件及工作流程_第431张图片
这是namespace
2021/01/28 k8s核心组件及工作流程_第432张图片
这样可以完成一跨域的访问

2021/01/28 k8s核心组件及工作流程_第433张图片
default的namespace里有一个kuberbetes的一条服务,这个也是K8s初始化安装的时候的service

2021/01/28 k8s核心组件及工作流程_第434张图片
clusterip可以通过宿主机直接访问,-k不带证书访问,默认 访问K8S服务组件是要带证书的
2021/01/28 k8s核心组件及工作流程_第435张图片
假如从luffy的名称空间里去访问default的,在这样实现了跨namespace访问
2021/01/28 k8s核心组件及工作流程_第436张图片
2021/01/28 k8s核心组件及工作流程_第437张图片
之前把mysql服务从host模式,改成了service,configmap把ip也去掉了,但是现在还不能 通过浏览器去访问

service有一种类型是clusterip 还有一种是nodeport,端口是30000到32767
2021/01/28 k8s核心组件及工作流程_第438张图片
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第439张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第440张图片

通过30294端口可以从外部访问

2021/01/28 k8s核心组件及工作流程_第441张图片
2021/01/28 k8s核心组件及工作流程_第442张图片
其他宿主机ip也可以
2021/01/28 k8s核心组件及工作流程_第443张图片
nodeport是集群里的每个节点都会监听
2021/01/28 k8s核心组件及工作流程_第444张图片
kube-proxy是agent运行在每个节点上,每个节点都会去部署应用

2021/01/28 k8s核心组件及工作流程_第445张图片
有三种模式
2021/01/28 k8s核心组件及工作流程_第446张图片
用户空间的,让kube-proxy在用户空间监听一个端口,所有的service转到这个端口,kube-proxy对其转发,所有报文都从一遍用户态,性能不高

在这里插入图片描述
不给kube-proxy指定,就会使用 iptables模式,用iptables来实现把流量转发到具体pod的规则
在这里插入图片描述
ipvs同样基于内核的netilter,但是采用哈希表,数量达到一定不过规模的时候,速度有优势,K8S1。18来引入,需要开启宿主机的ipvs模块
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第447张图片
kube-proxy去针对一系列ptables规则去转发到pod,所以kube-proxy是daemonset服务,每个节点都需要

2021/01/28 k8s核心组件及工作流程_第448张图片
2021/01/28 k8s核心组件及工作流程_第449张图片
但是没看到具体往哪里pod转发的规则

在这里插入图片描述
random随机模式 0–probability可能性,有0.5的几率转发到KUBE-SVC-4RG7UZRJ,剩下的转发到另外一个
在这里插入图片描述
这个地址是clusterip,所有往这里去的流量转发到KUBE-SVC-4RG7UZRJ

2021/01/28 k8s核心组件及工作流程_第450张图片
dnat是目标地址转换
2021/01/28 k8s核心组件及工作流程_第451张图片
总结起来i就是访问clusterip的流量,有50%的纪律访问10.244.1.29,剩下的访问18上
2021/01/28 k8s核心组件及工作流程_第452张图片
也就是kube-proxy用iptables来实现流量转发,也就是通过 ipables的规则来实现一个lb,nodeport其实也跟clusterip一样
2021/01/28 k8s核心组件及工作流程_第453张图片
通过kubeproxy调用iptables规则,也就是内核的netfilter,来做一个lb
2021/01/28 k8s核心组件及工作流程_第454张图片
iptables加iptables规则,ipvs加ipvs规则

2021/01/28 k8s核心组件及工作流程_第455张图片
pod的ip需要前面的上层的lb自动更新,才有service概念

2021/01/28 k8s核心组件及工作流程_第456张图片
利用服务发现能力,通过组件之间的servicename来访问
在这里插入图片描述
pod启动的时候把dns注入到容器里
2021/01/28 k8s核心组件及工作流程_第457张图片
service没法通过集群外部访问,nodeport就可以实现让外部机器访问

为什么clusterip和nodeport可以转发到内部服务,就是因为kube-proxy

2021/01/28 k8s核心组件及工作流程_第458张图片

第6章 Ingerss实现七层原理

6.1 通过ingress实现业务应用7层代理

K8S的service,clusterip和nodePort都是4层负载。实现7层的负载就需要ingress。
ingress控制器,外部的流量通过7层转发到集群内部的组件,ingress是一个统称,实现有很多,nginx,countour,haproxy,trafik,istio。
现在用nginx,trafik,istio比较多

2021/01/28 k8s核心组件及工作流程_第459张图片
2021/01/28 k8s核心组件及工作流程_第460张图片
**这个控制组件是在K8S里用pod方式运行的,这个pod就会根据用户写的ingress规则,这个规则就对应ingress yaml文件。ingress是K8S里,新的resources,controller控制器去通过apiserver动态的查询ingress定义的文件,转换成nginx配置文件,通过reload方式让nginx生效 **
在这里插入图片描述
ingress对象,就是把nginx的配置抽象成了imgress资源
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第461张图片
rules里是个数组,里面定义path,通过哪个域名去访问
2021/01/28 k8s核心组件及工作流程_第462张图片
可以直接配置servicename去访问

在这里插入图片描述
port是前面port

2021/01/28 k8s核心组件及工作流程_第463张图片
外部访问K8S集群服务,首先从ingress域名tea.foo.bar.com,下面的service知道访问哪些pod(通过abel selector)

2021/01/28 k8s核心组件及工作流程_第464张图片
实现逻辑
1.ingress controller去通过apiserver交互,动态感知ingress规则变化
2.读取ingress规则,按照规则,生成nginx配置
3.生成以后,写入到nginx-ingress-controller(等于一个nginx服务),nginx-ingress-controller写入到nginx.conf
4.最后reload

2021/01/28 k8s核心组件及工作流程_第465张图片
安装ingress-controler

2021/01/28 k8s核心组件及工作流程_第466张图片
2021/01/28 k8s核心组件及工作流程_第467张图片
修改部署节点
2021/01/28 k8s核心组件及工作流程_第468张图片
默认是这样一个label

2021/01/28 k8s核心组件及工作流程_第469张图片
在这里插入图片描述
改成ingress=true
2021/01/28 k8s核心组件及工作流程_第470张图片
加一个hostnetwork

2021/01/28 k8s核心组件及工作流程_第471张图片
创建了一系列资源
2021/01/28 k8s核心组件及工作流程_第472张图片
和ingress相关的资源都放在ingress-nginx这个名称空间里

在这里插入图片描述
controller也是用deployment,是workload使用范围最广的一个
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第473张图片

在这里插入图片描述
在这里插入图片描述
如果现在要通过ingres访问到myblog应用的时候该如何去做
2021/01/28 k8s核心组件及工作流程_第474张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第475张图片
在这里插入图片描述
之前的ingress=true已经打在K8S-Master上了,所以之前的pod调度成功了,不然iu是pendding2021/01/28 k8s核心组件及工作流程_第476张图片
只要执行这个命令,节点上就打上标记了

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第477张图片
可以查看ingress
2021/01/28 k8s核心组件及工作流程_第478张图片
2021/01/28 k8s核心组件及工作流程_第479张图片
这是两个endpoint
在这里插入图片描述
ingress会去动态生成upstrem的配置,查看nginx的配置
2021/01/28 k8s核心组件及工作流程_第480张图片
2021/01/28 k8s核心组件及工作流程_第481张图片
生成的配置文件还是很多的
2021/01/28 k8s核心组件及工作流程_第482张图片
2021/01/28 k8s核心组件及工作流程_第483张图片

这里加上hostnetwork=true,宿主机的端口80就被监听了
2021/01/28 k8s核心组件及工作流程_第484张图片
在这里插入图片描述
ingess是运行在10节点上
在这里插入图片描述
生产环境一般用lb
在这里插入图片描述
修改本机hosts

2021/01/28 k8s核心组件及工作流程_第485张图片
2021/01/28 k8s核心组件及工作流程_第486张图片
2021/01/28 k8s核心组件及工作流程_第487张图片
如果要https的,可以先自己自签名
2021/01/28 k8s核心组件及工作流程_第488张图片
crt就是一个证书文件,key就是私钥
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第489张图片
secret就是来存储一些敏感信息

在这里插入图片描述
指定一下secretname即可
2021/01/28 k8s核心组件及工作流程_第490张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第491张图片
在这里插入图片描述
这里就多监听 了一个443
2021/01/28 k8s核心组件及工作流程_第492张图片
现在就可以了

2021/01/28 k8s核心组件及工作流程_第493张图片
多路径如何去实现

2021/01/28 k8s核心组件及工作流程_第494张图片
2021/01/28 k8s核心组件及工作流程_第495张图片
/跟一定要放在最后
在这里插入图片描述
在这里插入图片描述

2021/01/28 k8s核心组件及工作流程_第496张图片
在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第497张图片
这样就实现 了多个转发

2021/01/28 k8s核心组件及工作流程_第498张图片
删除

在这里插入图片描述
nginx url 重写
2021/01/28 k8s核心组件及工作流程_第499张图片
直接访问是这样的,admin这个路径是原样转发到后面的路径

2021/01/28 k8s核心组件及工作流程_第500张图片
如果想要实现url这样重写

在这里插入图片描述
2021/01/28 k8s核心组件及工作流程_第501张图片
加了一个申明,rewrite-target重写的目标
2021/01/28 k8s核心组件及工作流程_第502张图片
在这里插入图片描述
在这里插入图片描述
name是rewrite-path

2021/01/28 k8s核心组件及工作流程_第503张图片
2021/01/28 k8s核心组件及工作流程_第504张图片
foo这个规则转发到admin,$1就是括号匹配到的
2021/01/28 k8s核心组件及工作流程_第505张图片
在这里插入图片描述
访问fooo转发到admin里
2021/01/28 k8s核心组件及工作流程_第506张图片
在这里插入图片描述
配置一下解析

2021/01/28 k8s核心组件及工作流程_第507张图片
先转到这个地址

2021/01/28 k8s核心组件及工作流程_第508张图片
在这里插入图片描述
转到了这个路径上

2021/01/28 k8s核心组件及工作流程_第509张图片
重写的不能和 默认 的ingress放在一起,只要是写了rewrite之后,是针对下面所有配置生效的,要实现规则,要保留两个ingress的数,一个是原生的,一个是针对重写的

2021/01/28 k8s核心组件及工作流程_第510张图片

第7章 小结

6.1 通过ingress实现业务应用7层代理

kubeadm有两个核心的命令,init,join
2021/01/28 k8s核心组件及工作流程_第511张图片
kube-proxy是daemon-set的组件,利用iptablees或者ipvs实现了防火墙
2021/01/28 k8s核心组件及工作流程_第512张图片

configmap存储一些基础 的数据,kv,secret去存储敏感数据,密码,证书
在这里插入图片描述
工作负载,还有daemonset,statsflust有状态服务(es,redis集群),conjob
在这里插入图片描述
去ip化,方便迁移

在这里插入图片描述
inges-controller调用apiserver拿到ingress配置转换成了nginx配置,controller里运行了一个nginx服务,动态reload

在这里插入图片描述

你可能感兴趣的:(K8S进阶)