# 1. k8s集群架构组件
# master节点
* apiservice
集群统一入口,以restful方式,交给etcd存储
* scheduler
节点调度,选择node节点进行部署
* controller-manager
处理集群中常规的后台任务,一个资源(部署任务)对应一个控制器
* etcd
存储系统,用于保存集群相关的数据
# worker节点
* kubelet
master派到node节点代表(worker中master的客户端节点),管理本机容器
* kube-proxy
提供网络代理,负载均衡等操作
# 2. k8s的核心概念
# pod
* 最小的部署单元
* 一组容器的集合
* 内部容器之间共享网络
* 生命周期是短暂的
# controller (用来控制pod)
* 确保预期的pod副本数量
* 无状态应用部署
* 有状态应用部署
* 确保所有的node运行同一个pod
* 支持一次性任务和定时任务
# service (用来对外提供访问pod的能力)
* 定义一组pod的访问规则
# 3. 环境搭建
3.1. kubeadmin方式搭建 (简便)
3.2. 二进制方式搭建
# 4. kube命令行工具 kubectl
4.1. 语法
kubectl [command] [type] [name] [flag]
例如:kubectl get pods
kubectl get nodes
# 5. 资源编排yaml
5.1. yaml文件组成部分
控制器
被控制对象
5.2. 字段说明
apiVersion api版本
kind 资源类型
metadata pod元数据
spec pod规格
replicas 副本数量
selector 标签选择器
template pod模板
containers 容器配置
5.3. yaml文件生成
5.3.1. create命令生成
kubectl create deployment web --image=nginx -o yaml --dry-run > test.yaml
5.3.2. get命令生成 (新版本没有--export命令,直接去掉即可)
kubectl get deploy nginx -o yaml --export > test/yaml
# 6. pod
6.1. 概念
k8s中可以创建和管理的最小单元
pod由一个或多个容器组成
pod中容器是共享网络
6.2. pod存在的意义
1. 一个docker容器只能对应一个单进程应用
2. pod是多进程设计,一个pod可以有多个容器,同样对应多个应用程序
3. pod为了亲密行存在,也就是多个容器之间的网络交互
6.3. pod实现机制
共享网络、共享存储
6.4. 镜像拉去策略
imagePullPolicy:
ifNotPresent: 默认值,镜像在宿主机不存在的时候才拉取
always: 每次创建pod都会重新拉取一次经此昂
never: 永远不会主动拉取这个镜像 (需要手动)
6.5. pod资源限制
resources:
requests:
memory: "64Mi"
cpu:"250m"
limits:
memory: "128Mi"
cpu:"500m"
6.6. pod重启策略
restartPolicy:
always:默认,当容器退出后总是重启容器
onFailure:当容器异常退出(状态码非0),才重启容器
never:当容器终止退出,从不重启容器,适用一次性任务
6.7. pod健康检查
1. 存活检查 (livenessProbe)
如果检查失败,将杀死容器进程,根据pod的重启策略进行下一步操作
2. 就绪检查 (readnessprobe)
如果检查失败,k8s会将pod从service endpoint中剔除
6.8. pod健康检查方式
1. httpGet
发送http请求,返回200-400即为成功
2. exec
执行shell命令,返回状态码为0即成功
3. tcpsocket
发起tcpsocket成功建立连接
6.9. pod调度策略
6.10. 影响pod调度的因素
1. pod的yaml文件中的资源设置
2. nodeSlector节点选择器会影响具体分配到哪个节点中去 (节点创建标签方式:kubectl label node env_role:prod)
3. nodeAffinity节点亲和性 (硬亲和性、软亲和性)
硬亲和性:条件必须满足,不满足等待ing
软亲和性:尝试满足,不保证
4. taint污点和污点选择器 (针对于节点设置,而不是pod属性)
查看节点污点情况
kubectl describe node k8smaster | grep Taint
污点属性值
NoSchedule: 一定不会被调用
preferNoSchdule: 尽量不被调度
NoExecute: 不会调度,且还会驱逐node已有Pod
为节点添加污点
kubectl taint node [node] key=value:污点值
为节点删除污点
kubectl taint node [node] key=value:污点值-
污点容忍:就是通过添加pod属性值,对设置过污点的机器,使得可能被调度
# 7. controller
7.1. 什么是controller
在集群中管理和运行容器的对象
7.2. pod和controller的关系
注:相当于master和slave的关系,一个负责管理,一个负责干活
pod是通过controller实现应用的运维 (比如:弹性伸缩/滚动升级)
通过label标签建立关系
7.3. deployment应用场景
部署无状态应用
管理pod和replicaset
部署、滚动升级等
7.4. deployment部署应用
7.4.1. 创建nginx.yaml
kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml
7.4.2. 根据yaml创建pod
kubectl apply -f nginx.yaml
7.4.3. 查看创建的pod
kubectl get pods
7.4.4. 对外发布
kubectl expose deployment nginx --port=80 --type=NodePort -target-port=80 --name=nginx-publish -o yaml > nginx-publish.yaml
kubectl apply -f nginx-publish.yaml
7.4.5. 查看部署信息
kubectl get pods,service
7.5. 应用的升级回滚和弹性伸缩 (以下均以无状态应用nginx为例演示)
7.5.1. 应用升级
添加nginx.yaml中nginx:1.14版本号之后
kubectl apply -f nginx.yaml
kubectl get pods
kubectl set image deployment nginx nginx=nginx:1.15
kubectl get pods
7.5.2. 查看应用升级状态
kubectl rollout status deployment nginx
7.5.3. 查看历史升级版本
kubectl rollout history deployment nginx
7.5.4. 回滚上一版本
kubectl rollout undo deployment nginx
7.5.5. 回滚到指定版本
kubectl rollout undo deplyment nginx --to-revision=2
7.5.6. 弹性伸缩
kubectl scale deployment nginx --replicas=10
7.5.7. 查看常见的弹性副本
kubectl get pods
# 8. service标签:kubectl,咻咻咻,Kubernetes,yaml,容器,nginx,--,pod,k8s From: https://blog.51cto.com/u_16021118/6140746
# 8.1. 定义
定义一组pod的访问规则
#