1.介绍
1.简介
- 谷歌2014年开源的c/s架构的容器化集群管理系统- 支持自动化部署、大规模可伸缩、 应用容器化管理
1.2优势
1. 自动装箱
1. 基于配置自动部署应用容器
2. 自我修复
1. 问题容器和节点的异常管理
3. 水平扩展
1. 简便的应用的扩缩容
4. 服务发现与负载均衡
1. 自带该功能
5. 滚动更新
1. 可一次性或批量更新
6. 版本回退
1. 对历史版本即时回退
7. 密码与配置管理
1. 在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
8. 存储编排
1. 自动实现存储系统挂载及应用
9. 任务与批处理
1. 任务调度功能
1.3架构
架构图
- 
Master(主控节点)
- 功能:
- k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求
- 组件:
- API server:
- 集群统一入口
- RestFul接口接收, 存储至etcd
- scheduler
- 节点调度
- controller-manager
- 与资源一一对应, 处理集群中常规的后台任务
- etcd
- 存储系统, 保存集群中相关数
Worker nodes(工作节点)
- 功能:
- 集群工作节点,运行用户业务应用容器
- 组件
- kubelet
- node节点代表, 管理本node容器
- kube-proxy
- 访问代理. 提供网络代理, 负载均衡等操作
- docker
- 具体的容器化操作
核心概念
- Pod
- 最小部署单元
- 一组容器应用的集合
- 共享网络
- 生命周期短暂
- controller
- 保证预期的pod副本数量
- 有无状态应用的部署
- 保证所有node运行同一个pod
- 一次性任务和定时任务
- service
- 定义pod的访问规则
2.集群管理
2.0集群搭建-前置的平台规划
单master集群
- 
多master集群
- 
硬件要求
- 测试环境
- master
- 2c4g-20g
- node
- 4c8g-40g
- 生产环境
- 更高要求...
集群的部署方式
- kubeadm,
- 通过 kubeadm init 和 kubeadm join , 快速部署集群
- 快速
- 二进制包
- 手动下载二进制包并部署每个组件
- 部署繁琐, 包含工作原理, 利于后期维护
2.1集群搭建-kubeadm方式
简介
- kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个 单master的 kubernetes 集群的部署:
- 创建一个 Master 节点 kubeadm init
- 将 Node 节点加入到当前集群中 $ kubeadm join <Master 节点的 IP 和端口 >
- 
目标
(1)在所有节点上安装 Docker 和 kubeadm
(2)部署 Kubernetes Master
(3)部署容器网络插件
(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
(5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
搭建步骤
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止 swap 分区
# 关闭防火墙(临时/永久)
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 根据规划设置主机名( k8s-master1; k8s-node1; k8s-node2)
hostnamectl set-hostname <hostname>
# 在master 上添加所有主从节点的hosts
cat >> /etc/hosts << EOF
<master-ip> <master-name>
<node-ip> <node-name>
EOF
# 将桥接的 IPv4 流量传递到 iptables 的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
# 同步时间
yum install ntpdate -y
ntpdate time.windows.com
# 安装Docker设置开机自启
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version
## 添加阿里云docker镜像源
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://cfzo933z.mirror.aliyuncs.com"]
}
EOF
# 设置yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安装 kubeadm,kubelet 和 kubectl;
# 方式一(不推荐): 该命令会默认下载最新高版本的组件, 可能造成版本不适配, 需要卸载并适配版本
# yum install -y kubelet kubeadm kubectl
# 方式二(推荐): 安装指定版本
yum install -y kubelet-1.18.0
yum install -y kubeadm-1.18.0
yum install -y kubectl-1.18.0
systemctl enable kubelet
# master主机操作: init
## 参数说明: 1.master-ip, 2.镜像源, 3.指定版本, 4.配置一个不冲突的ip提供网络访问
kubeadm init \
--apiserver-advertise-address=<master-ip> \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# init出现版本过低问题解决: https://blog.csdn.net/curry10086/article/details/107579113
- 部署成功后: 生成集群配置信息(主机开启集群, 从机加入集群)
- 
# 查看当前集群状态
kubectl get nodes
# master: 开启集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# nodes: 加入集群
kubeadm join 192.168.86.129:6443 --token h36iz5.hs405vyliq4r49xs \
--discovery-token-ca-cert-hash sha256:c95fc4d5b4bbd095d90ca867649f0f096cba4b937c1be32d7c165c257b8b267c
# 开启插件前, kubectl get nodes 返回的node.status = NotReady; 开启后为Ready
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 创建nginx pod
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看状态
kubectl get pod,svc
# 多节点ip地址访问
2.2集群搭建-二进制方式
2.3集群命令行工具kubectl
- [kubectl 命令语法](https://kubernetes.io/zh-cn/docs/reference/kubectl/)
- kubectl --help
- kubectl [commond] [type] [name] [flag]
- commond: 对资源的操作
- get
- create
- delete
- type: 目标资源类型
- pod
- pods
- name: 资源名称
- flag: 可选参数
- -s / -server: 指定api Server 的ip/port
- ...
2.4使用yaml文件操作kubectl
- 获取kubectl yaml 的方式
- 通过kubuctl create 添加参数, 获取执行中的yaml
- kubectl create deployment testYaml --image=[imageName]-o yaml --dry-run > out.yaml
- 通过已部署的应用, get导出其yaml
- kubectl get deploy [deployName] -o=yaml > out.yaml
3.核心技术
3.1-Pod
- 特点:
- 最小部署单元(k8s不直接处理container, 只处理pod)
- 是一组container的集合
- pod中container 共享网络命名空间
- 是短暂的(重启后ip即变动)
- 存在意义:
- 简化亲密性应用(关联关系非常密切)之间的调度. 成组调度
- pod下一组container共享存储/网络/命名空间
- 抽象出容器层, 不依赖于具体的比如Docker
- **实现机制**
- 共享网络
- ( docker-container 实现共享网络是通过 linux 的 同归属namespace)
- 通过将pod下的业务容器群加入到pod的默认根容器(pause | info 容器), 以存在于同一个namespace . 类似 Docker 中的 cotnainer 网络模式
- 
- 共享存储
- 数据卷volumn 持久化共享存储
- **镜像拉取策略**
spec:
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: <策略枚举>
# ifNotPresent: 默认值, 本地不存在则拉取
# Always: 总是拉取
# Never: 永不主动拉取
- **调度资源限制**
spec:
containers:
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- **重启策略**
spec:
restartPolicy: <策略枚举>
# Always: 默认值, (终止后)自动重启. 场景: 长期服务
# OnFailure: 异常退出(exitCode != 0)时, 重启. 场景: 批量任务
# Never: 不自动重启
- **健康检查**
- kubectl get node 获取的 STATUS 属性只表明目标进程是否存活, 不能作为目标应用的对外服务可用性检查. 如 Java程序的OOM场景
- 两种分类
- livenessProbe 存活检查
- 返回失败, 杀死容器, 执行pod的restartPolicy
- readinessProbe 就绪检查
- 返回失败, 将pod从 service endpoints 剔除
- 三种方式
- httpGet: 状态码
- exec: shell命令判断命令状态码
- tcpSocket: 连接情况
- 检查周期
- initialDelaySeconds: 初次时间
- periodSeconds: 周期间隔
- 示例
- 
- **pod创建流程**
- 
- **pod调度策略**
- 资源限制:
- pod的resources 标签自动选择合适资源的节点
- 节点选择器
- nodeSelector.<tagKey>: <tagValue>
- 指定节点标签组
- 为节点标记标签
- kubectl label node <nodeName> <tagKey>=<tagValue>
- 节点亲和性
- 通过pod的软硬要求进行节点选择
- nodeAffinity标签
- 硬亲和性
- 软亲和性
- 示例
- 
- 节点污点 taint
- 通过对节点设置污点值, 让pod选择node时自动处理该node
- node 污点值 来决定node 是否可调度
- pod 污点容忍 确定对应污点节点是否可调度
- 示例
- 
3.2-Label
- Label 附加到 Kubernetes 集群中各种资源对象上,目的就是对这些资源对象进行分组管理, 而分组管理的核心就 是 Label Selector。Label 与 Label Selector 都是不能单独定义, 必须附加在一些资源对象的定义文件上,一般附加 在 RC 和 Service 的资源定义文件中
3.3-Controller
- 概述
- 在集群上管理和运行容器的对象
- 和pod的关系
- pod是通过controller实现应用的运维
- 扩缩容
- 滚动升级
- 如何与pod建立关系
- 通过 label+selector
- 常见控制器
- deployment
- 部署无状态应用
- web
- 微服务
- 管理pod 和 ReplicaSet
- 部署, 滚动升级
- 使用 deployment 部署应用
# 1.1 生成pod的yaml
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
# 1.2 执行yaml
kubectl apply -f web.yaml
# 2. 对外发布
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -0 yaml > web1.yaml
kubectl apply -f web1.yaml
- 升级回滚与弹性伸缩demo
- 
- 部署有状态pod demo
- 
- 
- 部署守护进程
- 
- job 和 cronJob
- 
3.4-Volume
3.5-PVC和PV
3.6-Secret
- 将数据加密(存储到etcd), pod中以env/volume 形式访问使用
# map格式, 要求value使用base64后的格式
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
- 使用
- env
- 
- volume
- 
3.7-configMap
- 数据不加密存储到etcd, pod访问同secret.
- 可存储单个属性 / 整个配置文件 / JSON / 二进制对象
- 场景
- 配置文件
3.8-Namespace
3.9-Service
- 存在意义
- 防止pod失联 (服务发现)
- 通过 service 服务发现 目标pod的最新ip进行访问
- 定义pod的访问策略(负载均衡)
- 和service的关系
- 通过pod的label 和 service的selector 建立练习
- 常用的service
- ClusterIp
- 默认值, 集群内访问使用
- NodePort
- 对外暴露
- LoadBalancer
- 对外访问/公有云
