K8s基础和资源介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
k8是对容器的编排工具,之前使用的docker-compose是单机编排

k8s原生的语言:go语言

管理k8s集群工具:
1、vsocde
2、rancher(web图形化界面)
3、k9s

#和k8s类似的编排工具
borg
swarm(docker写的)
mesos
这些都在之前使用的编排工具,但现在k8s火起来了,他们就不怎么用了

1、K8s参考网站

1
2
3
4
5
6
7
8
官网:https://kubernetes.io
官方文档:https://kubernetes.io/zh-cn/docs/home/
kubeadm官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/
docker官方文档:https://docs.docker.com/
prometheus官方文档:https://prometheus.io/docs/introduction/overview/
ansible安装k8s项目:https://github.com/easzlab/kubeasz?tab=readme-ov-file
阿里云ACK:https://www.aliyun.com/product/kubernetes
亚马逊云EKS:https://aws.amazon.com/cn/eks/?nc2=h_ql_prod_ct_eks

2、K8s的2大组件

1
2
3
4
5
c/s结构的

1、master组件(控制平面组件(Control Plane Components))

2、node组件
  • 1、master组件 (控制平面组件(Control Plane Components))
1
2
3
4
5
6
7
8
9
10
11
1、kube-apiserver(apiserver):类似于司令部,所有master上的组件工作都要经过apiserver
(当在客户端执行命令或者在UI界面操作起一个容器都需要经过api,他会通知其他组件,所有组件调用什么东西或者计算什么东西都要经过他)

2、etcd:所有组价产生的数据存放位置,储存所有命令、资源清单、证书信任、web操作及其他组件数据
(如果这个宕了,这一套集群就废了,也就是说这套集群需要重新搭建,而不是修复一台etcd)

3、kube-scheduler(scheduler 时该丢了儿):资源计算、资源调度
(比如说在命令行执行创建10台容器,先经过他apiserver,会把期望值存档etcd,然后通知scheduler去etcd把数据取出来)

4、kube-controller-manager(controller 抗抽了儿):控制器,控制node组件启动容器
(schedule做完资源的计算调度,数据存档etcd了,controller通过apiserver拿到数据,会控制node组件启动)
  • 2、node组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1、kubelet:控制docker启动容器(控制容器运时,启动指定容器)
(每一个node都要装)


2、容器运行时(Container runtime)
(每一个node节点上得装一个容器运行时)
- containerd
- CRI-O
- Docker Engine
- Mirantis Container Runtime

3、kube-proxy(可选):POD端口映射,网络相关
可以理解为pod就是容器
起pod需要做端口映射,他就是做端口映射的工具




#k8s三大接口API二次开发,调用接口
CRI:runtime,容器操作接口
CNI:network,网络操作接口
CSI:storage,储存操作接口

3、K8s架构

单机节点架构

image-20240912101412211

高可用架构

image-20240912163330677

image-20240912102531543

pod创建流程

image-20240912103904760

image-20240912173745374

4、k8s核心资源(操作对象)

①、pod资源

①什么是pod
1、Pod是K8s的最小单位
2、Pod的IP地址是随机的,删除Pod会改变IP
3、Pod都有一个根容器
4、一个Pod内可以由一个容器或多个容器组成
5、一个Pod内的容器共享根容器的网络、名称空间、和文件系统卷 (比如说起一个nginx的pod,他会和根容器共享网络、名称空间、和文件系统。原理是:根容器里面的网络模式用的是docker网络模式中的Container模式)
6、一个Pod内的网络地址由根容器提供

1
2
3
请问贵公司k8s架构一个pod里面起几个容器

答精确的数字就是错误的,首先应该pod里面起几个容器取决于项目

image-20240912104532405

②pod运行状态,只要记住不是runing状态就是有问题的

状态 描述
Pending(等待) Pod已经被K8S系统接受,但是有一个或多个容器,尚未创建,亦未运行。此阶段包括等待Pod被调度的时间和通过网络下载镜像的时间
Running(运行) Pod已经绑定到某个节点(node),Pod中所有容器都已被创建,至少有一个容器仍在运行,或者处于启动或重启状态
Succeeded(成功) Pod中所有容器都已成功终止,并且不会再重启
Failed(失败) Pod中所有容器都已成功终止,并且有一个容器是因为失败而终止
Unknown(未知) 因为某些原因无法获取Pod状态,这种情况,通常是因为与Pod所在主机通信失败

②、service资源

1
service也是k8s核心资源之一,service定义了服务的入口地址,用来将后端的pod服务暴露给外部的用户访问

service提供了2种网络资源

image-20240912180101026

1
2
3
4
5
6
7
8
9
10
第一种:NodePort  宿主机端口映射clusterip端口,对外提供服务

第二种:ClusterIP pod的负载均衡(起10个pod,clusterip可以给这些pod负载,但是clusterip是内网ip,宿主机还是不能访问,所以service又提供了nodeport)

#问题:POD的IP是随机的,如果一个POD宕机了,k8s会自动拉起一个新的pod,ip变了如何加入到ClusterIP这个负载均衡集群中?
解决方案:使用DNS解析POD的IP到一个'字符串上'(每个pod启动都要到标签app:nginx)
DNS的服务:
- coreDNS(k8s用这个)
- bind9(比较麻烦)
- dnsmsq(内外的dns用)

③、label标签资源

1
2
Label标签是K8S中非常重要的一个属性,Label标签就像身份证一样,可以用来识别K8S的对象。
传统架构中,不同的服务应用之间通讯,都是通过IP和端口,但是在K8S中很多匹配关系都是通过标签来找。

④、Namespace资源

1
2
Namespace(名称空间)是K8S中非常重要的一个概念,Namespace将集群内部的资源进行隔离划分。
在Namespace中,形成逻辑上的不同项目组或用户组。

⑤、Controller控制器资源

1
2
3
4
5
6
7
8
9
10
# Controller用来管理Pod。
## Pod控制器的种类有很多:
- RC资源:可以做的自动拉起,控制多个副本,但现在不用了
- RS RC控制器的升级版,可以自动拉起宕机的POD
- Deployment 生产中常用的控制器,功能强大,包含了RS控制器,对镜像做版本管理(比较常用)
- DaemonSet 保证所有node节点上,有且只有一个pod运行
- Staefulset 有状态的应用(如mysql的主从复制),为pod提供唯一标识


后面起pod会写资源清单起10个nginx,挂了一台就直接挂了,pod不会再起一台,而能够拉起的是controller资源,他会检测资源清单是不是10个pod都在,如果少一个,控制器会重新拉起一个再加入集群

pod RC Service 的关系

image-20240912120405666

1
2
3
自动扩缩容:
比如说现在有10台nginx,双十一流量上来了,10台不够用,怎么办?
k8s有一个资源,一开始10个nginx就够了,流量上来了会自动扩容,流量下去了会自动缩容,而且扩出来的pod和之前的pod一模一样