Docker高级操作(重要)
kubernets概述
Brog
google 2014年开源
kubernets的优势
- 水平扩展
- 自我修复
- 自动发布和回滚(默认滚动发布)
kubernets快速入门
pod和pod控制器
- pod(pod是k8s最小单元,也称为原子单元;一个pod里面运行多个容器,又叫“边车”模式)
pod控制器 (pod可以直接启动在k8s里面,但是我们强烈推荐使用pod控制器,它能保证pod按照人们预期运行)
Name 在k8s内部用“资源”来定义每一种逻辑概念,所以每种“资源”都有自己的Name
- apiVersion
- kind(类别)
- metadata
- spec(定义清单)
- status(状态)
Namespace
一种隔离k8s内部资源的方法(也可以理解为分组,如各个研发部)
默认的名称空间 查询相应名称空间资源需要加上namespace- default
- kube-system
- kube-public
Label和Label选择器
Label
k8s中一种特色的管理方式,便于分类资源;
一个标签可以对应多个资源,一个资源也可以对应多个标签;
标签的组成 key=value,与之相似的还有annotation(注解)
注解和标签的区别是:标签值要求更严格Label选择器
给资源打上标签后,可以使用标签选择器过滤指定的标签
基于等值关系和基于集合关系
许多资源还支持内嵌选择器字段:matchLabels matchExpressions
Service和Ingress
Service
虽然每个pod都会被分配一个单独的ip地址,但这个ip会随pod销毁而消失。service解决了这个问题,为pod访问提供了稳定的入口。
service怎么通过集群网络找到pod网络呢——kube-proxyIngress
Service只能在第四层调度流量,表现形式是ip + port。早些年也用nodeport型service,凑合用。
Ingress是在OSI网络模型的第七层对外暴露接口。Ingress可以调度不同域名(业务域)、不同URL访问路径的业务流量。k8s中的三种网络
node网络
- service网络(Cluster ip)
- pod网络
k8s的组件
- 存储 etcd
- 主控节点
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- 运算(node)节点
- kubelet
- kube-proxy
- CLI客户端
- 核心附件
- CNI网络插件 flannel/calico
- 服务发现 coredns 比kube-dns安装方便,解析效率高
- 服务暴露 traefik
- GUI图形管理 Dashboard
apiserver的作用(大脑)
- 提供集群管理的REST api接口
- 复杂其他模块之间的数据交互,通信枢纽
-
controller-manager
管理控制器的控制器,通过apiserver监控整个集群的状态,保证集群处于预期的工作状态。
scheduler
接收调度pod到适合的运算节点上。
适合?调度算法有: 预选策略
-
kubelet(工蜂,真正干活的)
定时从某个地方(apiserver)获取节点上pod的期望状态,并调用容器平台接口达到这个状态。
- 定时汇报当前节点的状态给apiserver,以供调度使用
-
kube-proxy
service资源的载体,建立了pod网络和集群网络的关系(cluster ip —> pod ip)。
负责建立、删除和更新调度规则,通知apiserver更新,或者从apiserver获取其他节点的更新。
三种流量调度模式 Userspace(1.2版本,要用到内核态到用户态的转换)
- iptables
- ipvs
对k8s的管理,其实就是在管理k8s里面的各种资源
- 陈述式管理 - 主要依赖命令行CLI工具进行管理
- 声明式管理 - 依赖统一资源配置清单(manifest)进行管理
- GUI式管理 - 主要依赖图形化操作界面(web界面)进行管理
陈述式声明管理
```shell kubectl get namespace kubectl get ns # 简称
kubectl get all -n default kubectl get all # 资源处于default名称空间可以省
kubectl create ns app kubectl delete ns app
kubectl create deployment nginx-dp —image=harbor.od.com/public/nginx:v1.7.9 -n kube-public deployment.apps/nginx-dp created kubectl get deploy -n kube-public kubectl get pod -n kube-public -o wide # 扩展的方式显示 kubectl describe deployment nginx-dp -n kube-public
<a name="eZiMB"></a>
### 四种发布
- 蓝绿发布(k8s也可调整为蓝绿发布)
- 滚动发布
- 灰度发布
- 金丝雀发布
<a name="HIuQV"></a>
### 声明式声明管理
依赖于资源配置清单(yaml/json)
```shell
kubectl get pods nginx-dp-xxxaasd -n kube-system
** kubectl get svc nginx-dp -o yaml -n kube-system
** kubectl explain 点读机 学习yaml最重要的语句
kubectl create -f nginx-ds-svc -n default
apply 修改的时候
修改资源配置清单
- 离线修改 先修改文件再apply
- 在线修改 kube edit
删除
kubectl delete svc nginx-ds
kubectl delete -f nginx-ds-svc.yaml
改用声明式比较好,增删查用陈述式比较好。
k8s设计了网络模型,但却将它的实现交给了网络插件,CNI网络插件最主要的功能是实现POD资源能够跨主机进行通信。
flannel网络插件
常见的网络插件
- Flannel 38%
- Calico 35%
- Canal(结合了flannel和calico) 5%
- contiv
- opencontrail
- nsx-t
- kube-router
从github上下载flannel软件
https://github.com/coreos/flannel/releases
解压软件包到指定目录
mkdir /opt/flannel-v0.11.0
tar xf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel-v0.11.0/
flannnel工作原理
flannel就是在主机上添加了静态路由
这种模式添加了一个虚拟网络设备 flannel1.1直接路由模型(混合模式,tcpdump抓包)
在同一个二层网络中时使用直接路由模型,不在时使用VxLAN
使用Ingress资源暴露服务
用来暴露 http和https服务
##################
kubernets 管理容器化的服务
traefik ingress安装
watch 命令
部署(deployment)和服务(services)
用Nginx ingress-controller实现灰度发布
先了解一下部署
- 传统部署 停止老版本,启动新版本
- 蓝绿部署 需要两倍平时的硬件
- 滚动升级 不再需要两倍的硬件,启动一个新版本之后立即停止一个版本
- 金丝雀发布(灰度发布)在进行滚动升级的基础上,当启动新应用时,先对新应用做充分的测试再接入外部流量,按比率给应用接入外部流量,可以将具有某些特征的新用户导入至新应用。如http头,省份
Ingress
Counter
APISIX
traefik(未测试)
应该都可以实现灰度发布
怎么做?
需要定义另外一个canary字段:
表明这个ingress实际上是另一个ingress的灰度环境(基于http头)
基于HTTP头
nginx-ingress支持以下灰度策略:
- 权重
- HTTP头
- canary always 灰度
- canary never 不灰度
- HTTP头
- canary custom-value
- cookie 具有特定cookie值
curl —resolve
创建一个灰度环境的流量入口
ingress用于实现域名方式的k8s访问,流量从Internet到Ingress再到Services最后到Pod上
- 负载均衡
- SSL终止
- 基于名称的虚拟主机
Ingress部署在所有的Node节点上
helm
helm version
helm repo list
helm repo add ingress-nginx URL
节点上的组件包括 kubelet、 容器运行时以及 kube-proxy
要标记一个节点为不可调度,执行以下命令:
kubectl cordon $NODENAME