Docker高级操作(重要)

截屏2021-12-05 22.03.14.png

kubernets概述

Brog
google 2014年开源

kubernets的优势

  • 水平扩展
  • 自我修复
  • 自动发布和回滚(默认滚动发布)

kubernets快速入门

pod和pod控制器

  • pod(pod是k8s最小单元,也称为原子单元;一个pod里面运行多个容器,又叫“边车”模式)
  • pod控制器 (pod可以直接启动在k8s里面,但是我们强烈推荐使用pod控制器,它能保证pod按照人们预期运行)

    • Deployment
    • DaemonSet 每个Node节点起一份
    • ReplicaSet
    • StatefulSet 管理有状态pod
    • Job
    • Cronjob

      Name和Namespace

  • 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-proxy

  • Ingress

    Service只能在第四层调度流量,表现形式是ip + port。早些年也用nodeport型service,凑合用。
    Ingress是在OSI网络模型的第七层对外暴露接口。Ingress可以调度不同域名(业务域)、不同URL访问路径的业务流量。

    k8s中的三种网络

  • node网络

  • service网络(Cluster ip)
  • pod网络

截屏2021-12-05 23.17.49.png

k8s的组件

  • 存储 etcd
  • 主控节点
    • kube-apiserver
    • kube-controller-manager
    • kube-scheduler
  • 运算(node)节点
    • kubelet
    • kube-proxy
  • CLI客户端
  • 核心附件
    • CNI网络插件 flannel/calico
    • 服务发现 coredns 比kube-dns安装方便,解析效率高
    • 服务暴露 traefik
    • GUI图形管理 Dashboard

截屏2021-12-05 23.21.50.png

apiserver的作用(大脑)

  • 提供集群管理的REST api接口
  • 复杂其他模块之间的数据交互,通信枢纽
  • 提供完备的RBAC安全控制机制

    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

  1. <a name="eZiMB"></a>
  2. ### 四种发布
  3. - 蓝绿发布(k8s也可调整为蓝绿发布)
  4. - 滚动发布
  5. - 灰度发布
  6. - 金丝雀发布
  7. <a name="HIuQV"></a>
  8. ### 声明式声明管理
  9. 依赖于资源配置清单(yaml/json)
  10. ```shell
  11. kubectl get pods nginx-dp-xxxaasd -n kube-system
  12. ** kubectl get svc nginx-dp -o yaml -n kube-system
  13. ** kubectl explain 点读机 学习yaml最重要的语句
  14. kubectl create -f nginx-ds-svc -n default
  15. apply 修改的时候

image.png
修改资源配置清单

  • 离线修改 先修改文件再apply
  • 在线修改 kube edit

删除

  1. kubectl delete svc nginx-ds
  2. 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
  1. 从github上下载flannel软件

    1. https://github.com/coreos/flannel/releases
  2. 解压软件包到指定目录

    1. mkdir /opt/flannel-v0.11.0
    2. tar xf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel-v0.11.0/

    flannnel工作原理

    flannel就是在主机上添加了静态路由
    截屏2021-12-06 01.01.11.png
    截屏2021-12-06 01.03.52.png
    这种模式添加了一个虚拟网络设备 flannel1.1

    直接路由模型(混合模式,tcpdump抓包)

    在同一个二层网络中时使用直接路由模型,不在时使用VxLAN

使用Ingress资源暴露服务
用来暴露 http和https服务

##################
kubernets 管理容器化的服务

traefik ingress安装
watch 命令
部署(deployment)和服务(services)

用Nginx ingress-controller实现灰度发布

先了解一下部署

  1. 传统部署 停止老版本,启动新版本
  2. 蓝绿部署 需要两倍平时的硬件
  3. 滚动升级 不再需要两倍的硬件,启动一个新版本之后立即停止一个版本
  4. 金丝雀发布(灰度发布)在进行滚动升级的基础上,当启动新应用时,先对新应用做充分的测试再接入外部流量,按比率给应用接入外部流量,可以将具有某些特征的新用户导入至新应用。如http头,省份

Ingress
Counter
APISIX
traefik(未测试)
应该都可以实现灰度发布

怎么做?

需要定义另外一个canary字段:
1.PNG
表明这个ingress实际上是另一个ingress的灰度环境(基于http头)

基于HTTP头
1.PNG

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