使用Skaffold一键将项目发布到Kubernetes

  当前skaffold版本为v0.4,还未发布正式版本,不建议在生产环境中使用;
  skaffold用于开发人员快速部署程序到Kubernetes中;skaffold提供了dev、run两种模式;使用skaffold需先编写skaffold配置文件,该文件为定义skaffold的工作流;
  Skaffold工作流定义了三个主要阶段Build、Push、Deploy

enter image description here

一、Build
  在构建阶段,Skaffold通过Dockerfile使用源码生成Artifacts,Skaffold中目前Docker镜像、bazel这两种Artifacts,这里使用的是Docker镜像所以也可以成称为Docker镜像,该镜像用于应用程序的运行,Build阶段的输出就是Artifacts;
二、Push
  在推送阶段,Skaffold将把构建阶段生成的Docker镜像推送到Docker镜像仓库中,并使用所配置的镜像名称;在运行Skaffold时需确保镜像能够推送到镜像仓库中;
  但如果使用的是Minikube或 Docker for Desktop本地Kubernetes集群时默认是不推送到镜像仓库的,跳过推送阶段,因为本地已经存在了该镜像所以是可以正常运行的;
三、Deploy
  部署阶段,将最新的Docker镜像部署到k8s中,该阶段可以使用不同的部署工具如kubectl或helm,每个工具都有不一样的参数用于定义如何安装与更新应用程序;

概念介绍

Artifacts
  在Build阶段通过运行一系列步骤来创建Artifacts,在Skaffold中Artifacts分为bazel与Docker镜像,可以定义Skaffold生成多个Docker镜像,Skaffold在开发模式运行时,Skaffold只会重新生成源码已经更改的Docker镜像,通过在Skaffold配置中指定Dockerfile来生成Docker镜像,并指定其名称;

标签策略
  标签策略在Build阶段进行配置,用于配置Skaffold在推送Docker镜像时如果对镜像进行打标签,目前Skaffold支持三种标签策略:sha256标签生成器、git标签生成器、自定义标签生成器策略
  在开发过程中,推荐使用基于内容的标签策略sha256,方便在源代码变更时Skaffold会使Kubernetes重新部署新Docker镜像;

运行模式

  Skaffold有dev、run两种运行模式,也就是开发模式与发布模式,在dev模式下Skaffold会监控项目的源码随着代码的变更会实时的重新生产镜像并将变更更新部署到Kubernetes中;还可在CI/CD管道中运行Skaffold;

  dev模式默认使用sha256标签生成器
  run模式默认使用git标签生成器

  所以注意如果使用run模式又没配置git则Skaffold是无法跑下去的,需配置标签策略(TagPolicy),或配置git即可;

使用流程:

  开发环境使用skaffold部署项目到远程k8s中;
  1、下载skaffold
https://github.com/GoogleCloudPlatform/skaffold/releases/download/v0.4.0/skaffold-windows-amd64.exe
  2、下载kubectl、服务端开放Docker远程连接
在服务端Docker配置中加上: -H tcp://0.0.0.0:2375
  在开发端在创建C:\Users\xin.docker\config.json文件,内容如下:

 {
    "auths" : {
    }
 }

  3、开发端kubectl 配置
  创建C:\Users\xin.kube\config.json文件,配置k8s的连接与密钥,文件内容如下:

 apiVersion: v1
 clusters:
 - cluster:
     server: http://182.61.xx.xxx:8001
   name: minikube
 contexts:
 - context:
     cluster: minikube
     user: minikube
   name: minikube
 current-context: minikube
 kind: Config
 preferences: {}
 users:
 - name: minikube
   user:
 as-user-extra: {}

  4、服务端kubectl使用开启代理
  kubectl proxy –address 0.0.0.0 –accept-hosts ‘.*’
  5、环境变量配置
  需要在环境变量中配置Docker的链接信息:

 DOCKER_HOST = tcp://xxx.xxx.xxx.xxx:2375
 DOCKER_TLS_VERIFY = 0

  下载Demo并使用Skaffold将其部署到Kubernetes中;

  git clone https://github.com/GoogleCloudPlatform/skaffold
  cd examples/getting-started

运行:skaffold dev

enter image description here
enter image description here

  可以看到由于使用的是Minikube所以只有Build、Deploy两个阶段跳过了Push阶段,与我们上面的说法是一致的;
修改main.go的内容即可看到Skaffold检测到了变化,并重新把项目更新到Kubernetes中;

enter image description here
enter image description here

  常见异常信息:

 WARN[0005] run: build: build step: running build: read auth configs: docker config: opening docker config: 
 open C:\Users\xin\.docker\config.json: no such file or directory   

不存在.docker\confog.json文件,在用户目录下添加上即可;

 open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on 
 Windows, the docker client must be run elevated to connect. This error may also indicate that the docker 
 daemon is not running.  

  未配置Docker环境变量,加上DOCKER_HOST、DOCKER_TLS_VERIFY环境变量即可;

本文使用的环境为:minikube、skaffold v0.4、windows

参考资料: https://github.com/GoogleCloudPlatform/skaffold/blob/master/docs/concepts.md

线性代数回头看——线性方程组

1、线性方程组概述

线性方程组:包含未知数x1,x2,x3….xn的线性方程

enter image description here

  其中b与系数a1,a2,a3…an是实数或复数,通常是已知的;下标n可以为任意数;线程方程组为由一个或几个包含相同变量x1,x2,x3….xn的线性方程组组成;
线性方程组的解分为相容、与不相容两种情况;
  相容: 1、唯一解;2、无穷解
  不相容: 无解

线性方程组矩阵表示
  可以使用矩阵来表示线性方程组:
  系数矩阵:只包含方程组系数的矩阵
  增广矩阵:在系数矩阵的基础上加上线性方程组右边的常数组成的矩阵

2、解线性方程组

  通过使用矩阵表示线性方程组,对矩阵使用行初等变换,把矩阵行化简为:行阶梯形矩阵或简化行阶梯形矩阵;

初等行变换:
  1、倍加变换——把某行换成它本身与另一行的倍数和
  2、对换变换——两行对换
  3、倍乘变换——某一行的所有元素乘以同一个非零数
行阶梯形矩阵:
  1、每一非零行在每一零行之上
  2、某一行的最左边非零元素所在列在上面一行非零元素的右边
  3、某一最左边非零元素所在列下方都是零
  简化阶梯形为在行阶梯形矩阵的基础上进一步简化:
  1、每一非零行最左边非零元素为1
  2、每一最左边非零元素1是该元素所在列的唯一非零元素
同一个矩阵使用不同的方法化简,存在不同的行阶梯形,但简化阶梯形只存在一个;

行阶梯形相关概念:

  主元位置:最左边非零元素位置
  主元列:主元所在列
  主元:主元位置的非零元素

  线性方程组行简化后不一定每个方程组都存在解,若存在解则称该线性方程组相容,线性方程组相容,当且仅当:化简后的增广矩阵最右列不是主元列;
  根据行简化得到行阶梯形矩阵或简化行阶梯形矩阵,我们可以把线性方程组中的变量称为:基本变量、自由变量;

  基本变量:主元列所在的变量
  自由变量:非主元列的变量

3、线性组合

  A为m*n矩阵,矩阵各列为:a1、a2、a3…、an,x为Rn中的向量,则A与x的乘积为Ax,为A的各列以x对应元素为权的线性组合;

enter image description here

线性方程Ax=b,有解当且仅当b为矩阵A各列的线性组合;

齐次线性方程组:

若线性方程组可以写成Ax=0的形式,则该线性方程组为齐次的;

  平凡解:若Ax=0仅有x=0一个解,也称为平凡解
  非平凡解:若Ax=0存在一个非x=0的解,即x为非零向量

Ax=0有非平凡解,当且仅当线性方程至少存在一个自由变量

4、线性无关

线性无关:矩阵的各列线性无关,仅当Ax=0仅存在平凡解时成立
线性相关: Ax=0存在非平凡解

一个或两个向量集合:
  存在其中一个向量是另一个向量的倍数时线性相关,否则线性无关;
两个或更多向量集合:
  1、向量集合中至少有一个向量是其他的线性组合
  2、向量组的个数超过每个向量元素的个数
  A为n*p矩阵,Ax=0方程有p个未知量,n个方程,若p>n,必定存在自由变量,Ax=0必存在非平凡解,所以A的各列线性相关;
  3、向量组包含零向量
满足这三个条件则线性相关;

参考资料:
线性代数及应用