Kubernetes
·
一. 资源清单
1. 集群的资源
命名空间级别: 指定命名空间下可以看到
集群级别: 整个集群可以看到
元数据型: 通过指标操作
2. 常用字段
k8s的yaml文件中常用的字段
apiVersion: k8s api的版本,使用kubectl api-version查询
kind: yaml文件定义的资源类型和角色,比如Pod
metadata: 元数据对象 固定值就写metadata
metadata.name: 元数据对象的名字,比如Pod的名字
metadata.namespace: 元数据对象的命名空间
Spec: 详细定义对象,固定值就写Spec
spec.containers[]: spec对象的容器列表定义,是个列表
spec.containers[].name: 定义容器的名字
spec.containers[].image: 定义镜像的名字
spec.containers[].imagePullPolicy: 定义镜像拉取的策略 Always、Nerver、IfNitPrese
spec.containers[].command[]: 指定容器启动命令
spec.containers[].args[]: 指定容器启动命令参数
spec.containers[].workingDir: 指定容器工作目录
spec.containers[]ports[]: 指定容器用到的端口列表
spec.containers[].ports[].name: 指定容器端口名称
spec.containers[].ports[].containersPort: 指定容器监听的端口号
spec.containers[]ports[].hostPort: 指定容器所在主机需要监听的端口号
spec.containers[].ports[].portocol: 指定端口协议 tcp udp
spec.containers[].env[]: 指定容器运行前需要设置的环境变量列表
spec.containers[].env[].name: 指定环境变量名称
spec.containers[]env[].value: 指定环境变量的值
spec.restartPolicy: 定义容器重启的策略 Always、OnFailure
spec.nodeSelector: 定义node的label过滤标签
spec.imagePillSecrets: 定义pull镜像时secret名称
spec.hostNetwork: 定义是否使用主机网络模式
......
3. 容器的生命周期
3.1 探针:是kubelet对容器执行的定期诊断,由node上的kubelet调用
ExecAction: 在容器内执行指定命令,退出码为0则诊断成功
TcpSocketAction:对指定 端口 上的容器的 IP 进行检查,端口开通则诊断成功
HTTPGetAction: 对指定 端口和路径 上的容器的 IP 执行http get请求,返回状态码大于等于200小于400则诊断成功
livenessProbe: 指示容器是否正常运行,如果探测失败,kubelet会杀死容器根据重启策略进行重启
readinessProbe: 指示容器是否准备好服务请求
3.2 Pod的status状态
pending: Pod已被k8s结束,但有容器尚未创建,等待中
running: Pod已经被绑定在node上 所有容器都已经创建,至少一个容器正在运行
succeeded:Pod中所有容器都被成功终止,并且不会重启
failed: Pod中所有容器都终止,指示有一个容器因为失败终止
unkonw: 某些原因无法获取Pod状态,一般是与node节点通信失败
二. 控制器
1. 控制器的类型
- ReplicaSet:RS 确保容器的副本数,自动创建容器和自动回收容器
- Deployment:管理ReplicaSet,支持滚动更新和滚动回滚。deployment创建RS,RS创建Pod
滚动更新时deployment会创建新的RS,但不删除旧的RS,在新的RS中使用新镜像创建pod
滚动回滚时deployment使用旧的RS创建旧的pod
- HPA:平滑扩展,控制RS和deployment。
- StatefulSet:为了解决有状态服务的问题 (RS和deployment是为了解决无状态服务)
- 稳定的持久化存储:pod重新调度之后还能访问到持久化数据,基于PVC实现
- 稳定的网络标志:pod重新调度之后,podname和hostname不变,基于headless service实现
- 有序部署:pod启动是有顺序的,例如先启动mysql--apache--nginx
- 有序产出:pod删除是有顺序的,例如先删除nginx--apache--mysql
- DaemonSet:守护进程。确保全部或者一些Node上运行一个pod的副本,当有node加入集群时,也会为它们新增一个pod
- Job:执行一次的任务,保证批处理任务的的一个或多个pod成功介绍
- CronJob:周期性的执行任务
2. 控制器实例
Deployment部署nginx
vim deployment.yaml # 创建deployment.yaml
apiVersion: apps/v1 # 声明api版本
kind: Deployment # 定义资源类型
metadata: # 资源的元数据,用于标识描述这个资源
name: deployment-nginx # 定义资源的name
spec: # deployment的spec
replicas: 3 # 期望运行Pod数量
selector: # 选择器,定义标签
matchLabels: # 匹配标签
app: nginx # 定义标签为 app,值为 nginx
template: # Pod模板
metadata: # Pod的元数据
labels: # 标签
app: nginx # Pod的标签,用于被svc deployment 的selector选中
spec: # template的spec,可以写多个containers
containers: # 容器列表
- name: nginx # 容器的名称
image: nginx:v1 # 使用的镜像
ports: # 容器暴露的端口列表
- containerPort: 80 # 容器监听的端口
kubectl apply -f deployment.yaml # 以deployment.yaml文件创建资源
kubectl get deployment # 查看deployment.yaml创建的deployment,name为定义的deployment-nginx
kubectl get rs # 查看由deployment创建的rs,name为deployment-nginx开头
kubectl get pod # 查看有rs创建的Pod,name为rs的name开头
3. 更新与回滚
3.1. 更新Pod版本
更新Pod版本
方法1.
将deployment.yaml中的image: nginx:v1 改为 image: nginx:v2
kubectl apply -f deployment.yaml # 重新应用yaml文件
方法2.
使用命令行更新指定命名空间下的Pod版本
kubectl set image deployment/deployment-nginx nginx=nginx:v2 -n default
查看更新状态
kubectl rollout status deployment/deployment-nginx
3.2. 回滚Pod版本
回滚Pod版本
方法1.
回滚到上一个版本
kubectl rollout undo deployment deployment-nginx
方法2.
回滚到指定版本
kubectl rollout history deployment deployment-nginx # 查看历史版本号
kubectl rollout undo deployment deployment-nginx --to-revision=1 # 回滚到revision=1的版本
kubectl rollout status deployment deployment-nginx # 查看回滚状态
3.3. 确认当前Pod镜像版本
方法1:查看 Pod 使用的镜像
kubectl get pods -l app=nginx -o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\n"}{end}'
# 方法2:查看 Deployment 详情
kubectl describe deployment deployment-nginx | grep Image
Kubernetes
基本概念: Pod、控制器类型、网络通讯模式
kubernetes: 安装
资源清单: 资源 资源清单的语法 编写pod pod生命周期
pod控制器: 各种控制器的特点 使用定义方式
服务发现: syc原理 构建方式
存储: 多种存储类型的特点 不同环境中选择合适的存储方案
调度器: 调度过程 自定义调度器
集群安全机制: 集群认证、鉴权、访问控制的原理流程
HELM: 原理 模板 插件
运维: 源码修改 高可用构建
无状态服务:随时可以加入集群工作 DBMS
有状态服务:需要实时进行数据更新存储,抽离集群之后无法工作 LVS
kubectl、web ui、etcd、internet、firewalld
master节点:scheduler、apiserver、replication contller
node节点:kubelet、kube-proxy、docker
apiserver: 所有服务访问的统一入口,相当与消息转发中心
CrontrollerManager(控制器): 选择合适的节点进行分配任务
etcd: 分布式键值存储服务,键值对数据库,为整个分布式集群存储一些构建数据,协助分布式集群的正常运行和恢复,存储k8s的主要参数谢谢(持久化)
kuberlet: 直接与容器交互,实现容器的生命周期管理,将k8s的指令转化为容器能听懂的命令
kube-proxy: 负责写入规制至 iptables、lvs实现映射
coredns: 可以为集群中的svc创建一个域名ip的对应关系解析
dashboard: 给k8s提供一个B/S结构访问体系
ingress: 实现七层代理
federation: 提供一个可以跨集群中心的k8s统一管理功能
prometheus: 提供k8s集群的监控能力
elk: 提供k8s集群日志同意分析接入平台
------kubernetes基本概念------
Pod概念
k8s中最小的控制单元
pod中网络是共享的,存储是共享的
自主式Pod: 没人控制的pod
控制器管理的Pod:k8s控制的pod,有k8s拉起
Pod控制器:
ReplicationController:RC 确保容器的副本数,自动创建容器和自动回收容器(不使用)
ReplicaSet:RS 确保容器的副本数,自动创建容器和自动回收容器
Deployment:管理ReplicaSet,支持滚动更新和滚动回滚。deployment创建RS,RS创建Pod
滚动更新时deployment会创建新的RS,但不删除旧的RS,在新的RS中使用新镜像创建pod
滚动回滚时deployment使用旧的RS创建旧的pod
HPA:平滑扩展,仅适用于RS和deployment。根据RS定义
StatefulSet:为了解决有状态服务的问题 (RS和deployment是为了解决无状态服务)
1.稳定的持久化存储:pod重新调度之后还能访问到持久化数据,基于PVC实现
2.稳定的网络标志:pod重新调度之后,podname和hostname不变,基于headless service实现
3.有序部署:pod启动是有顺序的,例如先启动mysql--apache--nginx
4.有序产出:pod删除是有顺序的,例如先删除nginx--apache--mysql
DaemonSet:守护进程。确保全部或者一些Node上运行一个pod的副本,当有node加入集群时,也会为它们新增一个pod
Job:执行一次的任务,保证批处理任务的的一个或多个pod成功介绍
cron job:周期性的执行任务
服务发现:service
负载pod的ip地址,通过pod的标签进行代理绑定
网络通讯方式:
同一个pod之间的docker:使用localhost访问
同一台服务器上的pod: 使用Docker0网桥直接转发,不经过flannel
不同服务器上的pod:使用flannel转发
pod和service:使用lvs转发
------kubernetes安装------
1.
2.docker安装
3.kubeadm安装
4.主节点初始化
5.从节点加入集群
6.flannel网络部署
7.harbor仓库安装
8.kubernetes命令
kubectl get svc
kubectl run
kubectl get pod -o wide
kubectl delect pod xxxx
------资源清单------
1.集群的资源
命名空间级别: 指定命名空间下可以看到
集群级别: 整个集群可以看到
元数据型: 通过指标操作
2.资源清单 yaml格式
3.常用字段
apiVersion: k8s api的版本,使用kubectl api-version查询
kind: yaml文件定义的资源类型和角色,比如Pod
metadata: 元数据对象 固定值就写metadata
metadata.name: 元数据对象的名字,比如Pod的名字
metadata.namespace: 元数据对象的命名空间
Spec: 详细定义对象,固定值就写Spec
spec.containers[]: spec对象的容器列表定义,是个列表
spec.containers[].name: 定义容器的名字
spec.containers[].image: 定义镜像的名字
spec.containers[].imagePullPolicy: 定义镜像拉取的策略 Always、Nerver、IfNitPrese
spec.containers[].command[]: 指定容器启动命令
spec.containers[].args[]: 指定容器启动命令参数
spec.containers[].workingDir: 指定容器工作目录
spec.containers[]ports[]: 指定容器用到的端口列表
spec.containers[].ports[].name: 指定容器端口名称
spec.containers[].ports[].containersPort: 指定容器监听的端口号
spec.containers[]ports[].hostPort: 指定容器所在主机需要监听的端口号
spec.containers[].ports[].portocol: 指定端口协议 tcp udp
spec.containers[].env[]: 指定容器运行前需要设置的环境变量列表
spec.containers[].env[].name: 指定环境变量名称
spec.containers[]env[].value: 指定环境变量的值
spec.restartPolicy: 定义容器重启的策略 Always、OnFailure
spec.nodeSelector: 定义node的label过滤标签
spec.imagePillSecrets: 定义pull镜像时secret名称
spec.hostNetwork: 定义是否使用主机网络模式
......
4.容器生命周期
探针:时kubelet对容器执行的定期诊断,由node上的kubelet调用
ExecAction: 在容器内执行指定命令,退出码为0则诊断成功
TcpSocketAction:对指定 端口 上的容器的 IP 进行检查,端口开通则诊断成功
HTTPGetAction: 对指定 端口和路径 上的容器的 IP 执行http get请求,返回状态码大于等于200小于400则诊断成功
livenessProbe: 指示容器是否正常运行,如果探测失败,kubelet会杀死容器根据重启策略进行重启
readinessProbe: 指示容器是否准备好服务请求
Pod的status状态
pending: Pod已被k8s结束,但有容器尚未创建,等待中
running: Pod已经被绑定在node上 所有容器都已经创建,至少一个容器正在运行
succeeded:Pod中所有容器都被成功终止,并且不会重启
failed: Pod中所有容器都终止,指示有一个容器因为失败终止
unkonw: 某些原因无法获取Pod状态,一般是与node节点通信失败
------控制器------
ReplicaSet:RS 确保容器的副本数,自动创建容器和自动回收容器
Deployment:管理ReplicaSet,支持滚动更新和滚动回滚。deployment创建RS,RS创建Pod
滚动更新时deployment会创建新的RS,但不删除旧的RS,在新的RS中使用新镜像创建pod
滚动回滚时deployment使用旧的RS创建旧的pod
HPA:平滑扩展,控制RS和deployment。
StatefulSet:为了解决有状态服务的问题 (RS和deployment是为了解决无状态服务)
1.稳定的持久化存储:pod重新调度之后还能访问到持久化数据,基于PVC实现
2.稳定的网络标志:pod重新调度之后,podname和hostname不变,基于headless service实现
3.有序部署:pod启动是有顺序的,例如先启动mysql--apache--nginx
4.有序产出:pod删除是有顺序的,例如先删除nginx--apache--mysql
DaemonSet:守护进程。确保全部或者一些Node上运行一个pod的副本,当有node加入集群时,也会为它们新增一个pod
Job:执行一次的任务,保证批处理任务的的一个或多个pod成功介绍
cron job:周期性的执行任务
Deployment部署nginx:
vim deployment.yaml # 创建deployment.yaml
apiVersion: apps/v1 # 声明api版本
kind: Deployment # 定义资源类型
metadata: # 资源的元数据,用于标识描述这个资源
name: deployment-nginx # 定义资源的name
spec: # deployment的spec
replicas: 3 # 期望运行Pod数量
selector: # 选择器,定义标签
matchLabels: # 匹配标签
app: nginx # 定义标签为 app,值为 nginx
template: # Pod模板
metadata: # Pod的元数据
labels: # 标签
app: nginx # Pod的标签,用于被svc deployment 的selector选中
spec: # template的spec,可以写多个containers
containers: # 容器列表
- name: nginx # 容器的名称
image: nginx:v1 # 使用的镜像
ports: # 容器暴露的端口列表
- containerPort: 80 # 容器监听的端口
kubectl apply -f deployment.yaml # 以deployment.yaml文件创建资源
kubectl get deployment # 查看deployment.yaml创建的deployment,name为定义的deployment-nginx
kubectl get rs # 查看由deployment创建的rs,name为deployment-nginx开头
kubectl get pod # 查看有rs创建的Pod,name为rs的name开头
更新Pod版本
方法1.
将deployment.yaml中的image: nginx:v1 改为 image: nginx:v2
kubectl apply -f deployment.yaml # 重新应用yaml文件
方法2.
使用命令行更新指定命名空间下的Pod版本
kubectl set image deployment/deployment-nginx nginx=nginx:v2 -n default
查看更新状态
kubectl rollout status deployment/deployment-nginx
回滚Pod版本
方法1.
回滚到上一个版本
kubectl rollout undo deployment deployment-nginx
方法2.
回滚到指定版本
kubectl rollout history deployment deployment-nginx # 查看历史版本号
kubectl rollout undo deployment deployment-nginx --to-revision=1 # 回滚到revision=1的版本
kubectl rollout status deployment deployment-nginx # 查看回滚状态
确认当前Pod镜像版本
方法1:查看 Pod 使用的镜像
kubectl get pods -l app=nginx -o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\n"}{end}'
# 方法2:查看 Deployment 详情
kubectl describe deployment deployment-nginx | grep Image
Service(SVC)服务发现:
负责监控Pod的信息,根据标签匹配Pod,用作负载均衡和流量转发(RR轮询)到Pod上。当有Pod重启时,读取Pod的信息并记录SVC的负载队列中,相当与F5
SVC只提供4层负载均衡能力,只能通过IP和端口的方式进行转发,不能通过域名的方式进行转发
ClusterIP:自动分配一个集群内部的IP,集群内的Pod通过访问这个SVC的ip来访问SVC后面的Pod
NodePort: 在ClusterIP的基础上,为SVC在每台机器上绑定一个端口(端口映射),运行外部需求访问Pod内部
为什么不使用DNS进行负载均衡,而是使用SVC
DNS会在客户端进行缓存,当Pod重启时无法更新信息
SVC使用的代理模式:通过防火墙规则进行转发
iptables反向代理模式
ipvs反向代理模式
Ingress-nginx:代替了nginx,需要nginx-ingress-controller镜像
通过ServiceName参数绑定SVC的IP端口来分发到SVC
http访问
第三方访问域名 ---> ingress域名+端口。域名绑定IP,通过标签绑定SVC,将流量转发到指定的SVC ---> SVC通过iptables/ipvs规则将流量转发到指定的Pod上,通过标签绑定Pod ---> Pod由deployment创建
更多推荐



所有评论(0)