1、监控Docker命令
docker inspect -f {"state"}
2、K8s的组件有哪些
# 1.API Server(kube-apiserver :中央管理器,调度管理集群) == 领导(不干活)
负责处理来自用户的请求,其主要作用就是对外提供RESTful的接口
包括用于查看集群状态的读请求以及改变集群状态的写请求,也是唯一一个于etcd集群通信的组件。
# 2.Controller(kube-controller-manager :控制器: 管理容器,监控容器) == 安装人干活
管理器运行了一系列的控制器进程,这些进程会按照用户的期望状态在后台不断地调节整个集群中的对象
当服务的状态发生改变,控制器就会发现这个改变并且开始向目标状态迁移。
# 3.Scheduler(kube-scheduler:调度器:调度容器)== 具体通过算法让某一个干活
调度器其实为Kubernetes中运行的Pod选择部署的Worker节点
它会根据用户的需要选择最能满足请求的节点来运行Pod,它会在每次需要调度Pod时执行。
# 4.Flannel(提供集群间网络)
# 5.Etcd(数据库) == 存放的信息
负载存储集群中各种资源对象的信息
# 6.kubelet(部署容器,监控容器)
# 7.kube-proxy(提供容器间的网络)
# 8.DNS (域名解析)
3、常用控制器以及特点?
Deployment # 部署无状态应用
DaemonSet # 每个节点上都部署一个,用于收集、监控日志
StatufluSet # 部署有状态应用
4、Service的类型有哪些?
ClusterIP # 向集群内部暴露服务
NodePort # 通过宿主主机IP和端口向外部暴露服务
LoadBalancer # 通过弹性IP向外部暴露服务
ExtennalName # 将外部的一个服务定义一个集群内部的别名
5、Ingress-Nginx的工作原理
根据ingress配置清单,实时生成Nginx配置,并且使其生效,之后通过nginx反向代理转发流量到pod中
6、从ingress到pod的流程
ingress ---> endprints(HeadLess Service) ---> pod
7、控制器、service、ngress管理pod的方式?
控制器 ---> 通过标签
Service ---> endPoints
ingress ---> endpoints
8、主容器的作用
1.提供一个Pod的基础网路命名空间
2.提供共享存储
3.监控业务容器
9、Pod的生命周期
1.调度服务到节点
2.创建Pod
2.创建主容器
3.依次创建业务容器
4.执行开始回调钩子
5.进行健康检查:存活探测、就绪探测
6.执行结束回调钩子
7.依次结束业务容器
8.结束主容器
9.销毁Pod
10、在k8s中yaml配置清单的最基本结构
apiVersion:
kind:
metadata:
spec:
status:
11、Ingress 设置重定向的方式有哪些,区别是什么?
1.注解 # 当前ingress生效
2.configmap # 全局生效
12、部署Wordpress的流程
1.将Wordpress打包到镜像并构建
2.编写配置清单(Service、Deployment、Ingress)
3.部署、访问测试
13、Docker的四种网络模式
Brigre # 默认,启动Docker进程时,会在主机上创建一个名为docker0的虚拟网桥,和物理交换机类似
None # 容器有独立的 Network namespace,但并没有对其进行任何网络设置
Host # 容器和宿主机共享 Network namespace
Container # 容器与容器共享一个NameSpace,K8s中的Pod就是采用此模式
14、Dockerfile常用指令
FROM # 镜像来源
ADD # 复制文件到镜像,支持tar包自动解压,强于COPY
RUN # 指定构建镜像时运行的命令
ARG # 用于指定传递给构建时的变量
ENV # 环境变量
COPY # 复制文件到镜像
LABEL # 为镜像添加元数据,不常用
EXPOSE # 制定与外界交互的端口
VOLUME # 用于指定持久化目录
ONBUILD # 镜像触发器,可触发基础镜像内的动作
WORKDIR # 工作目录,类似于cd后的初始路径
CMD # 指定容器运行时的默认命令,如启动命令
15、K8s组件及协同关系
所有服务均是由Apiserver调度
1.Kubectl发送了一个部署nginx的任务
2.进入Master节点进行安全认证
3.通过认证后,Apiserver接受指令
4.将部署的命令数据记录到ETCD中
5.Apiserver再读取ETCD中的数据
6.Apiserver找到Scheduler,告诉它要部署服务
7.Scheduler向Apiserver调取工作节点数据,看部署在哪台合适
8.Apiserver调取ETCD中粗出的数据,并发送给Scheduler
9.Scheduler通国计算比较,找到最合适的Node节点并发送给Apiserver
10.Apiserver把要部署在Node节点的计划储存到ETCD中
11.Apiserver读取ETCD中的部署计划,通知Node节点的Kubelet来部署容器
12.Kubelet根据指令部署Nginx容器,kube-proxy为Nginx容器创建网桥
13.容器网桥部署完成后,Kubelet通知Apiserver已完成部署工作
14.Apiserver将部署状态存储在ETCd中,同时通知Controller-Manager来活了
15.Controller-Manager向Apiserve要需监控容器的数据
16.Apiserver找ETCD读取相应数据,同时通知Kubelet要源源不断发送监控的数据
17.Apiserver找Kubelet发送来的数据存储到ETCD中
18.Apiserver将ETCD的数据返回给Controller-Manager
19.Controller-Manager根据数据计算判断容器是否存在或健康
16、K8s存储卷有哪些
empyDir
# Pod调度到节点时创建的一个临时空目录,Pod删除随之删除,用于容器间分享文件
hostPath
# 节点存储卷,挂在宿主机的文件或目录到Pod中
PV/PVC
# 是外部存储系统中的一块存储空间,具有持久性,生命周期独立于Pod
StoageClass
# 是充当PV的模板,从而可以动态创建所需的PV,自动构建相对应的PV持久化存储卷
configmap
# 能使一个配置文件多台机器共用,杜绝重复修改,支持热更新,且支持挂载
两种方式:挂载、存储卷
secret
# 将密码转换为密文,写入配置清单中,起到加密的作用。
17、健康检查的方式+针对点+错误处理方式
存活性监测 # 容器是否正常启动 --> 删除容器
就绪性检测 # 容器是否正常提供服务 --> 移出负载均衡
18、将Pod调度到master节点的方法
1.删除污点:
删除master节点上打的污点标签,用亲和性使Pod调度到master(scheduler)
2.容忍污点:
设置Pod容忍污点,使用selectNode调度到master
19、简单说明emptyDir与hostPath
emptyDir # 用来作为Pod中的临时目录
hostPath # 类似于docker -v 参数,将存储卷挂载在本地
20、部署Discuz的步骤
1.编写配置清单
# 部署MySQL集群
创建命名空间
创建Service提供负载均衡
使用控制器部署Discuz
# 部署Discuz应用
创建命名空间
创建Service提供负载均衡(headless service)
创建服务并挂载代码
# 连接服务器
Discuz连接MySQL --> mysql.mysql.svc.cluster.local
2.部署~
21、K8s的配错方法有哪些?
1.权限不足
2.内存不足
33.网络问题
22、K8s网络流量入栈到出栈的流程
23、说明PV/PVC
PV # 相当于磁盘分区
PVC # 相当于磁盘请求
24、部署Discuz的流程
1.构建镜像
php:MySQL+php-fpm
nginx
2.设计网络流程
Ingress --> endpoints --> Pod
若discuz中包含第三方服务,则使用ExternalName(别名)
3.编写配置文件
mysql.yaml
word.yaml
4.测试
25、部署MySQL一主多从的步骤
1.准备MySQL主、从节点的配置文件 my.cnf
2.创建主、从节点的镜像
3.设计网络流程
主节点:
namespace.ymal
stoage.yaml
job.yaml
mysql.yaml
从节点:
namespace.yaml
config.yaml
mysql.yaml
mysql-cluster-mysqldump.yaml
4.部署测试
26、怎样使用动态PV持久化数据库
只要不删除PVC即可
27、K8s中的安全机制是什么
集群组件之间的安全机制:证书
集群内部之间的安全机制: 准入机制
28、Secret挂载到容器的环境变量写法
env:
- name: nginx
valueFrom:
secretkeyRef:
key: nginx
name: configmap-name
29、怎样随时随地的修改Docker容器启动命令
通过外界脚本随时随地的监控修改
30、Git是什么?
代码管理工具
31、Git仓库的手动建立过程
mkdir data
cd data
git init
32、Git如何回滚
git reset --hard [回滚id] # 回滚id通过 git log 查询
33、Git提交文件到远程仓库的流程
git add . # 添加到暂存区
git commit -m 'init' . # 添加到缓存区
git push -u origin master # 推送至远程仓库
34、部署代码一般用什么来拉取代码?
通过标签或分支名称来拉取
git clone -b [tag name | branch name] [仓库地址]
35、Git pull与Git Clone 区别是什么?
git pull # 更新拉取,在已有的仓库下,更新已有的代码
git clone # 下载克隆,将远程仓库下载到本地
36、Git Branch与Git Tag的区别是什么?
git tag # 特殊的分支,只能删除不能修改
git branch # 可以修改
37、GitLab与Git的关系是什么?
git # 代码管理工具
gitlab # 远程代码仓库(免费的私有化部署)
38、GitLab设置权限的流程是什么?
Guest # 能创建issue、发表评论,不能读写版本库
Reporter # 能克隆代码,不能提交,QA、PM可用此权限
Developer # 能克隆、开发、提交、推送代码,普通开发可用此权限
Maintainer # 能创建编辑项目、添加tag、保护分支、添加项目成员、可新开发可用此权限
Owner # 能设置项目访问权限,- Visibility Level、删除项目、迁移项目、管理组成员,开发组组长可用此权限
39、在K8s上部署MySQL主从的设计方案
先设计主节点,再设计从节点
1.主节点
创建一个复制用户
保持server_id唯一
备份
2.从节点
保持server_id唯一
连接上主节点
40、如何处理Jenkins忘记Admin密码?
参考:https://blog.csdn.net/qq_23995091/article/details/116240686#6jenkins_118
41、K8s工作中遇到的问题?
主节点有多个apiserver同时工作 # 内网防火墙开启导致
ETCD数据不一致,导致集群错乱(apiserver,ETCD脑裂)
42、Jenkins设置权限流程
创建权限组 --> 部署用户 --> 分配权限组
43、简单说明Jenkins源码管理、构建、构建后分别在哪台服务器执行?
构建之前 --> 在Jenkins服务器
构建之后 --> 在部署服务的机器
44、简单说明用Jenkins+GiaLab部署服务的流程
1.使用 git 工具将源代码上传到GitLab远程代码仓库
2.使用 Jenkins 将远程代码仓库的源代码拉取下来
3.将源代码部署到对应的项目上并构建
4.将构建的项目通过SSH连接部署到其他服务器上
45、Devops由哪些组成?
git、gitee、gitlab、Jenkins
jenkins + gitlab + HarBor
46、使用Jenkins部署Java的流程
1、部署流程
1、容器化部署
部署环境
编译型语言
1、开发编写代码,推送到gitlab中
2、拉取代码,同时进行环境检查。
3、编译代码
4、构建镜像,并推送至镜像仓库
5、部署至k8s
6、发送部署成功邮件
脚本型语言
1、开发编写代码,推送到gitlab中
2、拉取代码,同时进行环境检查。
4、构建镜像,并推送至镜像仓库
5、部署至k8s
6、发送部署成功邮件
运行环境
k8s -> (deployment、service、ingress、configmap、secret、pv/pvc)
2、非容器化部署
部署环境
编译型语言
1、开发编写代码,推送到gitlab中
2、拉取代码,同时进行环境检查。
3、编译代码
5、部署至tomcat
6、发送部署成功邮件
脚本型语言
1、开发编写代码,推送到gitlab中
2、拉取代码,同时进行环境检查。
4、构建镜像,并推送至镜像仓库
5、部署至服务器
6、发送部署成功邮件
运行环境
2、业务流程
1、开发环境(dev)
2、测试环境(test)
3、预发布环境(pre)
3.1、测试人员编写发布申请单(签名确认),于星期四下午六点准时发布
3.2、将预发布分支代码合并至master分支,并打tag
3.3、将发布申请单交给运维,等待发布
3.4、到六点时,开始发布
4、生产环境(master)
4.1、产品经理去线上环境进行验收
4.2、产品经理签字确认,发布成功
47、Jenkins部署PHP的流程
1.准备代码,并上传至代码仓库
2.用Jenkins拉取代码并编译
3.部署PHP到web服务器
4.测试
48、Jenkins自由风格主要的部署步骤
1.参数构建
2.源代码管理
3.构建
4.构建后操作
5.系统管理 -> 全局配置 -> publish over ssh -> 配置Jenkins服务器私钥+远程服务器的ssh
49、列举参数化构建中你熟悉的参数
文本参数
密码参数
凭证参数
下拉参数
字符串参数
50、为何使用git tag而不是git branch?
因标签是不可以修改的,每个标签版本都是固定不变的
51、Jenkins流水线的步骤是什么?
1.在建立一个代码仓库(空的,不能有README.md)Gitlab或Gitee,用来存放jenkinsfile
2.编写流水线步骤,填写仓库地址
3.根据业务要求对应修改(Jenkins)
4.测试运行
53、Jenkins连接K8s
在K8s中创建证书 --> 在Jenkins上配置连接
54、Jenkins部署Golang的流程?
1.将源代码上传至gitlab远程代码仓库
2.Jenkins拉取代码并编译
3.运行部署代码
4.测试
55、Jenkins创建pipline的流程
56、普罗米修斯的组件有哪些?
Prometheus Server
# 服务核心组件,通过pull metrics从exporter拉取、存储监控数据,并提供一套灵活的查询语言PromQL
pushgateway
# 接受push而来的数据,并暴露给Prometheus的Server拉取的中转站
Exporters/Jobs
# 负责收集目标对象(host,container..)的性能数据,并通过HTTP接口供Prometheus Server获取
Service Discovery
# 服务发现,Prometheus通过第三方接口查询需要监控的Target列表,轮训这些Target获取监控数据
Alertmanager
# 从Prometheus Server端接收到alerts后,会去重、分组,并路由到对方的接受方式发出报警(邮件、微信)
57、普罗米修斯UI页面的三种实现方法?
Granafa # 美观、强大的可视化监控指标展示工具
Prometheus web UI # 自带,不怎么好用
API Clients # 自己开发的监控展示工具
58、普罗米修斯怎样监控一台Linux主机?
1.在被监控主机上安装node组件,解压到/usr/local并启动
2.在管理主机上修改配置文件,添加被监控主机的信息
3.启动管理主机
59、普罗米修斯怎样监控一台MySQL主机?
1.在被监控主机上安装MySQL组件,解压到/usr/local
2.在组件路径编写.my,cnf配置文件,指定并启动
2.在管理主机上修改配置文件,添加被监控主机的信息
3.启动管理主机
60普罗米修斯获取数据的方式有哪些?
pull
push
61、Jenkins流水线容器化步骤?
1.Jenkins连接K8s集群
在Jenkins SSH Server连接
通过pipline kubeconfig连接
2.编写Dockerfile
4.创建流水线任务
62、简单介绍微服务?
分布式:将多台Linux主机组到一起,做成像一台主机一样来使用,像MySQL主从一样
微服务:将一台Linux主机拆分成多台Linux使用,像部署discuz,将nginx+php放一起,MySQL单独
微服务:按不同功能、业务拆分成多个模块,以至于某一个模块出问题后,不至于导致全站的服务不可用
63、如何用普罗米修斯监控其他K8s集群?
带有metricts接口的服务(ETCD):
# 使用Prometheus Operator创建相应的ServiceMonitor,匹配该服务的Service,就能自动将服务纳入监控中
64、普罗米修斯监控的架构图
65、普罗米修斯监控获取数据的接口是什么?
metricts
66、普罗米修斯监控 的类型有哪些?
1.携带metricts接口的服务
2.不携带metricts接口的服务
67、PromeQL的作用及增长率?
作用:用于查询普罗米修斯监控的数据
增长率:rate
68、普罗米修斯预测如何监控?
predict_linear
69、部署一个Discuz到k8s的步骤
1、设计网络、镜像
2、编写配置,构建镜像
3、部署
4、测试
5、配置Jenkins
6、测试使用Jenkins部署
70、docker要隔离的的6种namespace
UTS 主机和域名
IPC 信号量、消息队列和共享内容
PID 进程编号
network 网络设备、网络栈、端口等
mount 挂载点(文件系统)
user 用户和用户组
71、在部署中你遇到那些问题,怎么解决的?
1、容器化部署时,jenkins master和容器化的client节点端口冲突
2、容器化编译Java时,maven下载的各种包太多,而且使用的时国外的网站,导致部署超时,最终导致部署失败。
3、在普通部署的情况下,由于部署的节点太多,导致部署超时,进而导致部署失败。