1.k8s的作用优势
自我修复
滚动更新
服务发现和负载均衡
存储编排
水平扩展
2.核心组件
2.1 k8smaster节点组件
- kube-apiserver
负责接收客户端操作请求、认证授权
负责与etcd数据库交互
负责接收工作节点的注册请求
- kuber-scheduler 调度器
选择一个合适的工作节点来运行容器
- kube-controller-manager 控制器管理器
负责管理k8s集群内部中所有的控制器的(有状态、无状态等)
2.2 k8snode节点组件
- 容器管理引擎
可以是docker, containerd
k8s从1.25版后弃用docker,改用containerd,性能效率考虑
- kubelet
负责调用工作节点的容器引擎进行容器的整个生命周期管理
向api server发送注册请求
- kube-proxy
负责服务发布、负载均衡(调用lvs)
3.创建容器的流程
- 用户通过客户端工具向api server组件发送创建pod的请求
- api server接收到该请求后,会将请求信息(pod名称、镜像、卷、网络等信息)记录到etcd数据库
- scheduler组件会周期性的请求api server,以询问是否有操作请求; api server组件查询etcd数据库响应scheduler组件,scheduler组件会得知存在创建pod的请求
- scheduler按一定的算法选择一个合适的node节点计划创建Pod, 并将选定的节点信息返回给api server;api server会将该node节点要与创建的pod对应关系写入etcd数据库
- kublet组件启动后,会先api server注册自己,以让api server得知有运行起kublet服务的node节点的存在,并将node节点信息记录到etcd数据库;这样scheduler组件才可以根据数据库的记录选择合适的节点创建pod
- kubelet组件也会周期性的请求api server, 以询问是否有自己要做的操作,api server查询数据库响应kubelet, kubelet获知到要创建的pod的信息后,调用container engine创建容器
- 容器创建完成后,为便于访问,由kube-proxy提供负载均衡
4.部署流程
时间同步、关闭防火墙、主机免密、主机名解析、所有主机关闭swap、修改主机内核参数
安装依赖、docker-ce、containerd、kubeadm、kubectl、kubelet
配置crictl客户端工具
在Master节点创建集群初始化文件
containerd导入的镜像在k8s.io命名空间
定义KUBECONFIG环境变量
部署calico打通容器网络通信
5.kubernetes-pod
- k8s集群所能管理的最小单元
- 一个pod只放一个容器,pod相当于装容器的箱子
- 支持一个pod放多个容器,不建议实际使用
- 底层设计:k8s会使用pause镜像自动创建一个管理容器,用于容器的管理操作(IP,持久化等)
pause:k8s在吧容器建立在pod的时候还会自动建立一个容器,用的镜像就是pause这个镜像,有这个容器k8s才能做持 久化,ip等
5.1 pod命令
kubectl create -f xxx.yaml
创建容器
kubectl get pod -n (命名空间) -o wide
查看pod详细信息
kubectl get pod -A
查看所有pod
crictl ps -a
查看创建的容器信息
kubectl describe pod xx -n xx
查看pod创建过程,排错
kubectl logs xx -n xx
查看日志
kubectl exec -ti xx -n xx bash
连接登录
kubectl cp (物理机文件) xx:/(容器下路径) -n xx
物理机、pod间拷贝文件
5.2 pod常用选项
apiVersion: v1 指定api server版本,目前是v1
kind: Pod 类型
metadata: 指定Pod的元数据信息
name: web_db 容器名称
namespace: web 命名空间
spec: 定义pod中运行的容器的具体信息
containers:
- name: mysql
image: mysql:8.0 指定镜像名称
imagePullPolicy: IfNotPresent 指定镜像下载策略[Always|IfNotPresent|Never]
resources: 资源限制
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "1"
memory: "2Gi"
readinessProbe:
exec:
command: 指定容器自动执行的命令
- mysqladmin
- ping
initialDelaySeconds: 5
periodSeconds: 2
# command:
# - sleep
# args: 指定命令参数
# - "3600"
# ports: 指定容器服务端口
# - containerPort: 80
# env: 传递环境变量
# - name: 变量名称
# value: 值
# restartPolicy [ Always | Never | OnFailure ] 容器重启策略:无状态可用
5.3 pod健康状态检测机制
livenessprobe
检测pod是否正常启动
readnessprobe
检测pod是否能正常接收请求
httpGet
发送http请求,检测状态码200-400间,说明服务健康,否则不健康
readinessProbe:
httpGet:
path: /test
port: 80
scheme: HTTP
initialDelaySeconds: 10 // 延迟时间
periodSeconds: 10 // 周期,频率
successThreshold: 3 // 故障后恢复的检测次数
timeoutSeconds: 1 // 超时时间
tcpSocket
针对所有tcp服务
livenessProbe:
tcpSocket:
port: 6379
initialDelaySeconds: 10 // 延迟时间
periodSeconds: 10 // 周期,频率
successThreshold: 3 // 故障后恢复的检测次数
timeoutSeconds: 1 // 超时时间
exec
执行shell命令,判断命令的状态码
readinessProbe:
exec:
- rpm
- -q
- httpd
initialDelaySeconds: 10 // 延迟时间
periodSeconds: 10 // 周期,频率
successThreshold: 3 // 故障后恢复的检测次数
timeoutSeconds: 1 // 超时时间
6.kubernetes-deployment无状态负载
一种特殊的pod
优势:
1、支持副本自动维护
2、支持滚动更新
应用场景: 频繁更新的业务
deployment创建流程:
deployment -----> RS(副本集) -----> POD
- 标签选择器(K8s所有资源建立关系的时候都是用标签来联系)
- 每种资源都会有对应的标签,标签的实际体现是键值对的数据
- 利用标签在RS副本集、POD之间映射关系
标签选择器:
标签,就是个key:value对的数据
通过标签在RS和POD间建立对应关系
6.1 创建deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: test1-deploy ###给无状态负载本身起名称
spec:
replicas: 6 ##指定pod副本数
selector: ###给副本集指定标签
matchLabels: ###给副本集指定标签
app: centos7 ###给副本集指定标签
template: ###给pod指定标签的
metadata: ###给pod指定标签的
labels: ###给pod指定标签的
app: centos7 标签名
spec: ###下面写真正的容器信息
containers:
- name: test1
image: centos:7
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
kubectl get deploy 查看无状态负载
kubectl get rs 查看rs副本集
kubectl get nodes --show-labels 查看pod标签
kubectl describe deploy nginx 查看无状态本身的描述信息
添加滚动更新的参数
apiVersion: apps/v1
kind: Deployment
metadata:
name: test2-nginx
spec:
replicas: 6
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate //更新类型
rollingUpdate:
maxSurge: 2 //一次更新几个,用来定义每次更新的比例,可以是数字也可以是百分比
maxUnavailable: 3 //最大不活跃数量,如果超过3个pod更新失败,则整个更新失败,自动回滚
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: test2-nginx
image: nginx:1.16
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80