- k8s简介和安装
- k8s核心概念:Pod、控制器、Services、网络通信
- k8s 资源清单及编写、Pod生命周期
- k8s 存储类型
- k8s 调度器及HELM
- k8s 集群安全机制
k8s简介和安装
1、k8s简介
IaaS:Infrastructure as a Service
PaaS:Platform as a Service(类似:阿里云、腾讯云)
SaaS:Software as a Service(类似:腾讯文档、有道云笔记等产品)
软件部署演进路线
3、基础知识
4、安装配置
系统要求:
- 64位操作系统 lInux 内核3.10以上,建立4.4以上内核 (Ubuntu/Centos7+),3台
- cpu至少2核,最好4核
- 内存最少2G,推荐8G
- etcd 3.0版本
- docker 18.03 版本及以上
- Flannel
- Kubernetes 1.18.5
内核升级
1 | cat /etc/redhat-release |
k8s核心概念:Pod、控制器、Services、网络通信
kubernetes 对象
基本对象
Pod
网络
存储
高级对象
扩容缩容
1 | kubectl scale deployment nginx-deploy --replicas=5 |
查看节点分布
1 | kubectl get po -o wide |
自动扩容缩容
1 | kubectl autoscale deployment nginx-deploy --min=3 --max=7 --cpu-percent=60 |
滚动升级
1 | docker pull nginx:1.18.0 |
1 | kubectl delete deployment nginx-deploy |
1 | kubectl set image deployment/nginx-deploy nginx=docker.io/nginx:1.19.1 |
回滚
1 | kubectl rollout undo deployment/nginx-depoly |
AB测试
DaemonSet
确保集群中的每个pod有且只有一个副本
Filebeat、Logstash、Flume (agent)
Promethues node Exporter 监控每台机器的CPU、内存指标
k8s 资源清单及编写、Pod生命周期
1 | kubectl api-versions |
查看label
修改label(修改后,又重新创建了一个新pod,补齐3个nginx)
查看每个对象有哪些属性
1 | kubectl explain deployment |
编写yaml文件 nginx-daemon.yaml
1 | kind: DaemonSet |
Job
1 | kind: Job |
- Pause 是根容器
CronJob
Pod的生命周期
ImagePullBackOff , 镜像拉取失败,采用退避算法重新拉取镜像
- pending
- running
- succeeded
- failed
- unknown
Init Container 按顺序执行
Main Container
探针:存活检测
启动延迟5秒,检测周期3秒
nginx 一般都是80端口,去检测8008端口,是不存在的,会认为容器启动失败,会再启动一个容器
第二个例子:
启动后先休眠60秒,移除a文件,再休眠
检测a文件是否存在,不存在则删除pod,再创建新的Pod
postStart
preStop
探针:读取检测
读取检测,如果能读取到,则代表容器达到了ready状态,可以供外界访问,否则就被认为不可访问
Service
代理模式
暴露固定的ip,端口,供外界访问
1 | kubectl create -f nginx-deploy.yaml |
删除暴露
1 | kubectl delete |
域名格式
k8s 转发模式
linux 内核态,用户态
userspace
k8s 1.4 之前 使用 iptables
ipvs(ipv server) 虚拟ip地址服务 VIP 在1.8-beta版本里加入使用,在1.14版本里成为正式的转发协议
iptables 协助维护内核netfilter中的各种路由
Namespace
做资源隔离
6种命名空间
- 挂载文件系统:mount
- 进程:pid
- 网络Network:不同namespace之间的网络是不通的
- IPC 进程间通信
- UTS: 隔离主机名 和 NIS域名
- User:
Cgroup
cgroup:linux 2.6以后出现的,google工程师导入linux内核的
基于 cpuset 开发
作用:做资源管控
cpuset
linux操作系统启动以后,会mount一个cpu的子系统,我们可以对cpu的子系统做各种各样的操作和定制。这样我们就可以管控每个应用程序使用资源的多少了
1 | 安装工具管理 cgroup |
虚拟设备对 就相当于 虚拟网卡之间的桥
1 | 列出所有网络命名空间 |
k8s 各个节点之所以能互相访问是因为每个节点上都部署了 kube-proxy
上图中的架构,kube-proxy 太繁忙了,所以可以优化成iptables转发
但iptables转发规则太多的时候又不利于维护,所以又引入了ipvs (VIP server)
1 | yum search ipvs |
cm - ConfigMap 配置中心,涉及k8s的很多配置,都是用configMap来做的
通过配置 可以 选择使用 iptables 还是 ipvs
服务类型
32659 是宿主机ip,指向容器的8000端口
在yaml文件中可指定端口
DNS
ingress
k8s 存储类型
configMap
pv/pvc
pv:Persistence Volume
pvc:Persistence Volume Claim(声明)
pv 支持 filesystem 和 blockDevice
1 | kubectl get pv -n devops |
如果pvc没有指定pv,则按照最小匹配原则 匹配PV
访问模式
- NFS:以linux方式搭建
- RWO (Read-Write-Once):单个节点读写
- ROX (Read-Only-Many):多个节点只读
- RWX(Read-Write-Many):多个节点读写
回收策略
- Retain:手动回收
- Recycle:基本擦除(rm -rf /somevolume/*)
- Delete: 和 会提供商有关
PV生命周期
- Avaliable:空闲没有被绑定
- Bound:已经被绑定
- Release:已经被释放,但没有重新声明
- Failed:回收失败
k8s 生命周期
- Pending
- ContainerCreating
- Running
k8s 调度器及HELM
亲和力
节点亲和力
硬亲和:requiredDuringSchedulingIgnoredDuringExecution。如果节点label改了,服务会被驱逐
软亲和:perferredDuringSchedulingIgnoredDuringExecution。如果节点label改了,服务还能迁移到其他节点
pod 亲和力
驱逐(排除)
污点节点taint
让pod部署不到这个节点上
NoSchedule:Pod 不会被分配到该节点
PerferNoSchedule:尝试不要将pod分配到该节点
NoExecute:Pod肯定不会被分配到该节点,部署在该节点的pod会被驱逐
加污点
去除污点
容忍tolerations
容忍是对于pod来说的
k8s 集群安全机制
configMap 配置k8s 程序配置 非加密
secret
ServiceAccount token
opaque passwork 密钥