架构

从borg到k8s

BorgMaster专门负责请求分发类似大脑,而工作节点是由Borglet负责提供(容器,计算,服务等等),上述都有多个副本3,5,7,9可以防止选举出现双数导致的问题。

提供了多种访问方式,浏览器,命令行,文件——->BrogMaster——–>scheduler(调度器)写入paxos数据库存储,并进行监听,如果发现请求就进入消费环节。

K8S

特点:

轻量级:消耗资源小

开源

弹性伸缩

负载均衡:iptables IPVS

基础概念:什么是pod 控制器类型K8S网络通讯模式—flannel—pod–etcd

kubernetes: 构建k8s集群

资源清单: 资源 掌握资源清单的语法yaml 编写pod掌握pod的生命周期

pod控制器:各种控制器的特点及使用定义方式

服务发现:掌握svc原理及其构建方式

存储:掌握多种存储类型的特点,并且能够在不同环境中选择合适的存储方案(工作中自主选择)

——————————————-
k8s组件:

kubectl: k8s是命令行端,用来发送客户的操作指令。

API server: 是k8s 集群的前端接口,各种客户端工具以及k8s的其他组件可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API,即K8S API。是所有服务访问的统一入口。

Scheduler: 负责决定将Pod放在哪个Node上运行。在调度时,会充分考虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、数据亲和性和需求。负责介绍任务,选择合适的节点进行分配任务。

Controller Manager: 负责管理集群的各种资源,保证资源处于预期的状态,用来维持副本期望数量。它由多种Controller 组成,包括Replication Controller维护副本数量即期望值,创建删除pod、Endpoints Controller、Namespace Controller、Serviceaccounts Controller等等。

Etcd: 键值对数据库 存储k8s集群所有重要信息(持久化),负责保存k8s集群的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速的通知k8s相关组件。第三方组件,它有可替换方案 Consul、zookeeper。

Etcd的官方将它定位成一个**可信赖**(天生支持集群化)的**分布式键值存储服务**(k-v结构),能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。

V2版本会把所有数据写入到内存中,关机后数据丢失

V3版本会做本地持久化,写入到本地存储。

Kubelet: 它是Node的agent(代理),当Scheduler确定某个Node上运行Pod之后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向Master报告运行状态。管理(增删改查)Pod.

kube-proxy: 负责将访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

COREDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析

DASEBORD: 给k8s提供一个B/S结构的UI界面。

INGRESS Crontroller:官方只能实现4层负载均衡,它可以实现7层负载均衡。

Pod:k8s集群的最小组成单位。一个Pod内,可以运行一个或多个容器。大多数情况下,一个Pod内只有一个Container容器。

Flannel: 是k8s集群网路方案,可以保证Pod的跨主机通信。第三方解决方案,也有替换方案。

服务分类:
有状态服务:DBMS数据库管理系统(MYSQL)从pod中剔除后,再恢复就会造成数据丢失。
无状态服务:LVS APACHE NGINX

对docker来说更适合运行无状态服务,对k8s来说目标就是可以运行好有状态服务

运行一个例子:

#创建一个deployment资源对象。Pod控制器。kubectl run test-web --image=httpd --replicas=2 

注:k8s 1.15之前的命令

分析各个组件的作用以及架构工作流程:*****

1. kubectl发送部署请求到API server
2. APIserver通知Controller Manager 创建一个Deployment资源。
3. Scheduler执行调度任务,将两个副本Pod分发到node上。
4. node上的kubelet在各自节点上创建并运行Pod。

补充:

​ 1.应用的配置和当前的状态信息保存在etcd中,执行kubectl get pod 时 API server 会从etcd中读取这些数据。

2. flannel会为每个Pod分配一个IP。但此时没有创建Service资源,目前kube-proxy还没有参与进来。

———————————-

常见资源对象类型( pod控制器类型)

ReplicationController: 用于确保每个Pod副本在任意时刻都能满足目标数量,简单点来说,它用于保证每个容器或容器组总是运行并且可以访问的:老一代无状态的Pod应用控制器。

ReplicaSet: 新一代的无状态的Pod应用控制器,它与RC的不同之处在于支持的标签选择器不同,RC只支持等值选择器,RS还额外支持基于集合的选择器。

Deployment: 为Pod和Replicaset提供了一个声明式定义(declarative)方法,用来替代以前的ReplicaionController来方便的管理应用。
典型的应用场景:
定义Deployment来创建Pod和ReplicaSet
滚动升级和回滚应用
扩容和缩容
暂停和继续Deployment

DaemonSet: 用于确保每一个节点都运行了某个Pod的一个副本,新增的节点一样会被添加此类Pod,在节点移除时,此类Pod会被回收。
典型的应用场景:
运行集群存储daemon
在node上运行日志收集daemon
在node上运行监控daemon

StatefulSet: 用于管理有状态的持久化应用,如database服务程序,它与Deployment不同之处在于,它会为每一个Pod创建一个独有的持久性标识符,并确保每个Pod之间的顺序性。
典型的应用场景:
稳定的持久化存储
稳定的网络标志
有序部署,有序扩展
有序收缩,有序删除

Job: 用于管理运行完成后即可终止的应用,例如批量处理作业任务,保证一次性任务pod成功结束。

Cronjob:管理基于时间的job,即:
在给定的时间点只运行一次
周期性地在给定时间点运行

Horizontal Pod Autoscaling: 应用的资源使用率通常都有高峰和低谷,削峰填谷,提高集群的整体资源利用率,让service的pod个数自动调整,使pod水平自动缩放。

kubernetes集群命令行

1.kubectl语法格式:

kubectl [command] [TYPE] [NAME] [flags]

(1)command:指定要对资源执行的操作,例如create,get,describe和delete

(2)TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数,复数和缩略的形式。例如:

kubectl get pod pod1kubectl get pods pod1kubectl get po pod1

(3)NAME:指定资源的名称,名称也是大小写敏感的。如果省略名称,则会显示所有的资源。例如:

kubectl get pods

(4)flages:指定可选的参数。例如,可用-s或者-server参数指定k8s API server的地址和端口。

2.kubectl获取帮助

kubectl --help

具体查看某个操作的帮助

kubectl get --help

3.kubectl子命令使用分类

基础命令:
create:通过文件名或标准输入创建资源
expose:将资源公开为一个新的服务
run:在集群中运行一个特定的镜像
set:在对象上设置特定的功能
get:显示一个或多个资源
explain:文档参考资料
edit:使用编辑器编辑一个资源
delete:删除资源
部署命令:
rollout: 管理资源的发布
rolling-update: 滚动更新
scale: 扩、缩容
autoscale:自动扩缩容
集群管理命令:
certificate: 修改证书资源
cluster-info:显示集群信息
top: 显示资源(cpu,内存,存储)
cordon: 标记节点不可调度
uncordon: 标记节点可调度
drain: 维护期间下线
taint: 更新污点数
故障诊断和调试命令:
describe: 显示特定资源或资源组的详细信息
logs: 在一个Pod中打印一个容器日志
attach:附加到一个运行的容器
exec:执行命令到容器
port-forward: 转发本地端口到pod
proxy: 运行一个proxy到api server
cp: 复制文件目录到容器
auth:检查授权
高级命令:
apply: 通过文件或标准输入对资源应用配置
patch:使用补丁修改、更新资源的字段
replace:通过文件或标准输入替换一个资源
convert: 不同的api版本之间转换配置文件
设置命令:
label:更新资源上的标签
annotate: 更新资源上的注释
completion: 用于实现kubectl工具自动补全
其他命令:
api-versions: 打印受支持的api版本
config:修改kubeconfig文件(用于访问api,配置认证信息等)
help: 帮助
plugin:运行一个命令行插件
version:打印客户端和服务版本信息

(1)基础命令

kubectl create deployment nginx --image=nginx #创建一个pod控制器kubectl expose deployment nginx --name=nginx-svc --port=80 --type=NodePort#对外暴露端口 其他主机可以访问 在浏览器中打开http://ip:端口kubectl get pod,svc,cs #查询pod和详细信息及运行状况kubectl get pod(deployment) -o wide #输出pod,deployment资源的信息pod资源包含ip地址,deployment包含名称,镜像来源。kubectl describe pod nginx #查看名字叫nginx的pod的详细信息 ip等 *****

用命令行的方式创建:

//创建Pod控制器,deployment(到k8s:1.18版本,此方式已变为创建Pod资源)kubectl run web --image=nginx --replicas=5 #1.15版本方式,在1.18版本中此方式只会创建一个pod资源 kubectl create deployment web --image=nginx:latest #1.18 版本创建pod控制器方式#查看控制器情况kubectl get deployment#查看资源详细信息kubectl describe deployment web

PS: 查看某种资源对象,没有指定名称空间,默认是在default名称空间。可以加上-n选项,查看指定名称空间的资源。

注意:直接运行创建的Deployment资源对象,是经常使用的一个控制器资源类型,除了deployment,还有rc,rs等Pod控制器,Deployment是一个高级的Pod控制器。

//创建Service资源类型。

kubectl expose deployment web --name=web-svc --port=80 --type=NodePort

//ps:kubectl get service //查看service资源 和暴露端口 其中web-svc 对应的30921是整个k8s集群对外暴露的端口不指定对外暴露端口的情况下,会随机生成端口类似于docker 中的-P 80

[root@docker01 ~]# kubectl get service
NAME TYPECLUSTER-IP EXTERNAL-IPPORT(S)AGE
kubernetesClusterIP10.96.0.1443/TCP4h12m
nginxNodePort10.108.14.25380:32148/TCP138m
web-svc NodePort10.97.171.7 80:30921/TCP10m

[root@docker01 ~]# crul 192.168.10.170:30921

ps:如果想要外网能够访问服务,可以暴露deployment资源,得到service资源,但svc资源的类型必须为NodePort(大小写必须严格按照要求)。

**服务的扩容与缩容**

kubectl scale deployment web --replicas=8. kubectl edit deployment web #编辑web资源的配置文件

——————————————-

##### 服务升级(变更镜像)与回滚 *****

#删除旧的nginx控制器kubectl delete deployment nginx#重新创建nginx:1.17的控制器kubectl create deployment nginx --image=nginx:1.17kubectl describe pod nginx-...(补全)#升级到nginx:1.18kubectl set image deployment nginx nginx=nginx:1.18kubectl describe pod nginx-...(补全)#升级到nginx:latestkubectl set image deployment nginx nginx=nginx:latestkubectl describe pod nginx-...(补全)#回滚 回滚成上次的镜像kubectl rollout undo deployment nginx

常用命令集合

kubectl run#创建一个deployment或job来管理创建的容器1.18中 用kubectl create创建deployment资源kubectl get#显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源kubectl expose#将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)kubectl describe #显示特定资源或资源组的详细信息kubectl scale #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件kubectl set#更改现有的应用程序资源kubectl rollout#资源回滚管理kubectl delete#删除某个资源 PS: 如果资源状态为Terminating,可以强制删除,比如强制删除某个Pod:kubectl delete po  --grace-period=0 --force

—————————————-
## 配置清单(yml、yaml):

常见Yaml文件写法:以及字段的作用

1.语法格式

*通过缩进表示层级关系

*不能使用Tab进行缩进,只能使用空格。(高版本支持缩进我们设置为tab一次缩进2个空格,写法尽量要统一用缩进,或都用空格)
vim /root/.vimrc
set tabstop=2

*一般文件开头缩进两个空格

*字符后面缩进一个空格,比如冒号,逗号等后面

*使用—表示yaml文件开始

*使用#代表注释

2.一级字段作用 5个 (apiVersion、kind、metadata、spec、status)一般只考虑前4个。

apiVersion:api版本信息

apiVersion: v1 //apiserver的版本

kind:资源对象的类别

kind: Pod //指明创建的资源类型

metadata: 元数据 名称字段必写。

metadata:

name: deploy1 //meatdata字段下必须有name这个二级字段定义名称

[“a”,”b”,”c”] (字典写法)
– a

– b

– c

spec:用户期望的状态。

spec的例子:只删除pod,deployment会按照spec期望值重新生成pod

[root@master ~]# kubectl get deployments.apps
NAMEREADYUP-TO-DATEAVAILABLEAGE
nginx1/1 1120m

[root@master ~]# kubectl get pod
NAME READYSTATUSRESTARTSAGE
nginx-755c56db9f-hp8w91/1 Running0 9m40s

[root@master ~]# kubectl delete pod nginx-755c56db9f-hp8w9
pod “nginx-755c56db9f-hp8w9” deleted

[root@master ~]# kubectl get pod
NAME READYSTATUSRESTARTSAGE
nginx-755c56db9f-gjmsr1/1 Running0 5s

通过例子可以看到,spec:下面期望有1个副本,删除掉其中一个后,发现还是1个,这时注意一下运行时间发现已经删除掉旧的的,但会根据期望值创建一个新的。维持spec的期望值不变。

status: 资源现在处于什么样的状态。通常创建yaml时不用写,是描述现在的状态的,和spec做对比。

=================================================

可以使用kubectl explain 命令查看我们要写的资源对象的yaml文件怎么写。比如查看deployment资源的话就可以写成:

kubectl explain deploykubectl explain deployment.metadata #查看deployment下matedata字段的写法帮助

##### 如何快速编写yaml文件

第一种 使用kubectl create命令生成yaml文件,生成过程中并不执行,主要是要生成yaml文件。

第二种 当资源已经部署过了,可以直接使用kubectl get命令导出yaml文件,在此基础上编辑。

第一种:

kubectl create deployment web --image=nginx -o yaml --dry-run > myl.yaml #并不真正执行,只会输出yaml文件。
kubectl apply -f my1.yaml #执行yaml文件生成资源

第二种:

kubectl get deploy nginx -o=yaml --export > my2.yaml

—————————————————-
##### 动手写第一yaml文件

#写第一yaml文件mkdir /root/yamlvim /root/yaml/deploy1.yaml**Deployment**apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels:app: nginxspec: replicas: 3 selector:matchLabels: app: nginx template:metadata: labels:app: nginxspec: containers: - name: nginximage: nginx:1.18ports:- containerPort: 80

在该例中:
apiVersion API版本
kind资源类型
metadata 资源元数据
spec资源规格,期望
replicas 副本数量
selector 标签选择器
template Pod模板
metadata Pod元数据
specPod规格
container 容器配置

创建名为 nginx-deployment(由 .metadata.name 字段标明)的 Deployment。
该 Deployment 创建三个(由 replicas 字段标明)Pod 副本。

selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你只需选择在 Pod 模板中定义的标签(app: nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。

说明: matchLabels 字段是 {key,value} 偶对的映射。在 matchLabels 映射中的单个 {key,value} 映射等效于 matchExpressions 中的一个元素,即其 key 字段是 “key”,operator 为 “In”,value 数组仅包含 “value”。在 matchLabels 和 matchExpressions 中给出的所有条件都必须满足才能匹配。

template 字段包含以下子字段:
Pod 被使用 labels 字段打上 app: nginx 标签。
Pod 模板规约(即 .template.spec 字段)指示 Pods 运行一个 nginx 容器, 该容器运行版本为 1.18 的nginx Docker Hub镜像。
创建一个容器并使用 name 字段将其命名为 nginx。
开始之前,请确保的 Kubernetes 集群已启动并运行。 按照以下步骤创建上述 Deployment

执行yaml文件:
kubectl apply -f deploy1.yaml

##### 更新Deployment

更新 Deployment
你可以通过更新一个新的 YAML 文件来更新 Deployment。下面的 YAML 文件指定该 Deployment 镜像更新为 nginx:latest。

apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector:matchLabels: app: nginx replicas: 2 template:metadata: labels:app: nginxspec: containers: - name: nginximage: nginx:latestports:- containerPort: 80#使用kubectl apply 命令运行yaml文件。kubectl apply -f deploy1.yaml##### //在线命令方式更新kubectl edit deployment nginx-deploymentkubectl get deploymentskubectl edit deployment nginx-deployment #把副本数量修改成5个,镜像换成httpdkubectl get deploymentskubectl get pod -o widekubectl get deployment -o wide