1. k8s简介和安装
  2. k8s核心概念:Pod、控制器、Services、网络通信
  3. k8s 资源清单及编写、Pod生命周期
  4. k8s 存储类型
  5. k8s 调度器及HELM
  6. k8s 集群安全机制

k8s简介和安装

1、k8s简介

IaaS:Infrastructure as a Service

PaaS:Platform as a Service(类似:阿里云、腾讯云)

SaaS:Software as a Service(类似:腾讯文档、有道云笔记等产品)

软件部署演进路线

3、基础知识

4、安装配置

系统要求:

  1. 64位操作系统 lInux 内核3.10以上,建立4.4以上内核 (Ubuntu/Centos7+),3台
  2. cpu至少2核,最好4核
  3. 内存最少2G,推荐8G
  4. etcd 3.0版本
  5. docker 18.03 版本及以上
  6. Flannel
  7. Kubernetes 1.18.5

内核升级

1
2
cat /etc/redhat-release
uname -r

k8s核心概念:Pod、控制器、Services、网络通信

kubernetes 对象

基本对象

Pod

网络
存储

高级对象

扩容缩容

1
kubectl scale deployment nginx-deploy  --replicas=5

image-20200717203447927

查看节点分布

1
kubectl get po -o wide

image-20200717203632940

自动扩容缩容

1
kubectl autoscale deployment nginx-deploy --min=3 --max=7 --cpu-percent=60

滚动升级

1
2
docker pull nginx:1.18.0
docker pull nginx:1.19.1

image-20200717204501134

1
2
3
4
5
kubectl delete deployment nginx-deploy
kubectl get deployment
kubectl get pod
kubectl create -f nginx-deploy.yaml
kubectl describe deployment nginx-deploy
1
2
kubectl set image deployment/nginx-deploy nginx=docker.io/nginx:1.19.1
kubectl get rs

image-20200717204919912

回滚

1
2
3
kubectl rollout undo deployment/nginx-depoly
# 回滚到某个版本
kubectl rollout undo deployment/nginx-depoly --to-reversion=2

image-20200717210134304

AB测试

image-20200717210458496

DaemonSet

确保集群中的每个pod有且只有一个副本

image-20200717211904111

Filebeat、Logstash、Flume (agent)

Promethues node Exporter 监控每台机器的CPU、内存指标

k8s 资源清单及编写、Pod生命周期

image-20200717202457991

1
2
kubectl api-versions
kubectl api-resouces

image-20200717212821456

查看label

image-20200717212914661

修改label(修改后,又重新创建了一个新pod,补齐3个nginx)

image-20200717213303026

image-20200717214100302

查看每个对象有哪些属性

1
2
3
4
5
6
kubectl explain deployment
kubectl explain deployment.status
kubectl explain pod
kubectl explain kind
kubectl explain apiVersion
kubectl explain metadata

编写yaml文件 nginx-daemon.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: nginx-daemon
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

Job

1
2
3
4
5
6
7
8
9
10
11
12
13
14
kind: Job
apiVersion: batch/v1
metadata:
name: job-demo
spec:
template:
metadata:
name: job-demo
spec:
containers:
- name: job-demo
image: docker.io/busybox:latest
command: ["echo", "'scale=10; 4*a(1)'", "|", "bc", "-l"]
restartPolicy: Never

image-20200717220235870

image-20200721200932996

  • Pause 是根容器

CronJob

Pod的生命周期

image-20200721201359564

image-20200721201619270

image-20200721202029004

image-20200721202126748

ImagePullBackOff , 镜像拉取失败,采用退避算法重新拉取镜像

  • pending
  • running
  • succeeded
  • failed
  • unknown

Init Container 按顺序执行

Main Container

image-20200721204046028

image-20200721205000220

image-20200721205616483

image-20200721205339221

image-20200721205018680

image-20200721205700360

image-20200721205745887

image-20200721205852363

探针:存活检测

image-20200721210254286

image-20200721210529407

启动延迟5秒,检测周期3秒

nginx 一般都是80端口,去检测8008端口,是不存在的,会认为容器启动失败,会再启动一个容器

第二个例子:

image-20200721212430275

启动后先休眠60秒,移除a文件,再休眠

检测a文件是否存在,不存在则删除pod,再创建新的Pod

postStart

preStop

探针:读取检测

image-20200721211359742

读取检测,如果能读取到,则代表容器达到了ready状态,可以供外界访问,否则就被认为不可访问

image-20200721211733546

Service

代理模式

暴露固定的ip,端口,供外界访问

image-20200721214042284

1
2
3
kubectl create -f nginx-deploy.yaml
kubectl get deploy
kubectl expose deploy nginx-deploy --port=8000 --target-port=80

image-20200721214352533

删除暴露

1
kubectl delete

域名格式

image-20200721215346837

image-20200721215430586

k8s 转发模式

linux 内核态,用户态

image-20200724201832504

userspace

k8s 1.4 之前 使用 iptables

ipvs(ipv server) 虚拟ip地址服务 VIP 在1.8-beta版本里加入使用,在1.14版本里成为正式的转发协议

image-20200721220829050

image-20200724203048934

image-20200724203345123

iptables 协助维护内核netfilter中的各种路由

image-20200724203804993

Namespace

做资源隔离

6种命名空间

  1. 挂载文件系统:mount
  2. 进程:pid
  3. 网络Network:不同namespace之间的网络是不通的
  4. IPC 进程间通信
  5. UTS: 隔离主机名 和 NIS域名
  6. User:

Cgroup

cgroup:linux 2.6以后出现的,google工程师导入linux内核的

基于 cpuset 开发

作用:做资源管控

cpuset

linux操作系统启动以后,会mount一个cpu的子系统,我们可以对cpu的子系统做各种各样的操作和定制。这样我们就可以管控每个应用程序使用资源的多少了

1
2
3
4
5
# 安装工具管理 cgroup
yum install -y libcgroup-tools
cgcreate -g cpu:/test
cgget
cgset

image-20200724205038988

image-20200724205105451

image-20200724211455990

image-20200724211519041

虚拟设备对 就相当于 虚拟网卡之间的桥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 列出所有网络命名空间
ip netns list
ip netns add test1
ip a
# 定义虚拟设备对
ip link add veth0 type veth peer name veth1
# 将veth1转给test1
ip link set veth1 netns test1
# 指定test1 的网段
ip netns exec test1 ip addr add 10.0.5.5/24 dev veth1
ip netns exec test1 ip link set veth1 up
ip netns exec test1 ip link set lo up
ip netns exec test1 ip addr show
#
ip addr add 10.0.5.6/24 dev veth0
ip link set veth0 up

image-20200724212031275

image-20200724213155070

k8s 各个节点之所以能互相访问是因为每个节点上都部署了 kube-proxy

image-20200724213252839

上图中的架构,kube-proxy 太繁忙了,所以可以优化成iptables转发

image-20200724213404820

但iptables转发规则太多的时候又不利于维护,所以又引入了ipvs (VIP server)

1
2
3
4
yum search ipvs
yum install -y ipvsadm.x86_64
ipvsadm -Ln
ipvsadm --clear

image-20200724214332452

cm - ConfigMap 配置中心,涉及k8s的很多配置,都是用configMap来做的

通过配置 可以 选择使用 iptables 还是 ipvs

image-20200724214418390

image-20200724215025073

服务类型

image-20200724215456247

image-20200724215522003

image-20200724215717140

image-20200724215704461

image-20200724215821221

32659 是宿主机ip,指向容器的8000端口

image-20200724215926221

image-20200724215944494

在yaml文件中可指定端口

image-20200724220348401

DNS

ingress

k8s 存储类型

configMap

image-20200728203419455

pv/pvc

pv:Persistence Volume

pvc:Persistence Volume Claim(声明)

pv 支持 filesystem 和 blockDevice

1
kubectl get pv -n devops

image-20200728221059607

如果pvc没有指定pv,则按照最小匹配原则 匹配PV

image-20200728221135855

访问模式

  • 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:回收失败

image-20200731203239975

image-20200728220139919

k8s 生命周期

  • Pending
  • ContainerCreating
  • Running

k8s 调度器及HELM

亲和力

节点亲和力

硬亲和:requiredDuringSchedulingIgnoredDuringExecution。如果节点label改了,服务会被驱逐

image-20200731211448916

软亲和:perferredDuringSchedulingIgnoredDuringExecution。如果节点label改了,服务还能迁移到其他节点

image-20200731212040097

image-20200731212408234

pod 亲和力

image-20200731212542351

驱逐(排除)

污点节点taint

让pod部署不到这个节点上

  • NoSchedule:Pod 不会被分配到该节点

  • PerferNoSchedule:尝试不要将pod分配到该节点

  • NoExecute:Pod肯定不会被分配到该节点,部署在该节点的pod会被驱逐

image-20200731214656698

加污点

image-20200731213938727

去除污点

image-20200731214208090

容忍tolerations

容忍是对于pod来说的

image-20200731214531002

image-20200731214738005

k8s 集群安全机制

configMap 配置k8s 程序配置 非加密

secret

image-20200731220718131

ServiceAccount token

opaque passwork 密钥