「14.The Ecosystem」

  CREATED BY JENKINSBOT

本章中,我们将介绍更广泛的 Kubernetes 生态系统。 Kubernetes incubator的软件以及相关的项目,例如,Helm和 kompose

14.1. Installing Helm, the Kubernetes Package Manager

如果不想手写所有的 Kubernetes清单文件,如何通过命令行从仓库中查找一个包,然后下载并安装?

可以使用Helm。Helm是 Kubernetes 的包管理器,他将Kubernetes包定义为一系列清单文件和一些元数据。这些清单文件其实就是模板。Helm实例化包的时候,会给模板中的字段赋值。Helm包被称Chart。

Helm包括客户端命令行界面he1m和服务器端tiller。可以使用he1m与Chart交互,而tiller可以作为普通的Kubernetes部署在 Kubernetes集群内运行。你可以从源代码编译 Helm,或者从 GitHub的发行页面下载(地址是 Bithub.com/kubernetes/helm releases),
解压归档文件,并将he1m可执行文件放入$PATH目录。例如,在 MacOS上可以通过如下步骤安装Hemlv2.7.2:

# wget https: //storage.googleapis. com/kubernetes-helm/i

# helm-v2.7.2-darwin-amd64.tar.gz

# tar -xvf helm-v2.7.2-darwin-amd64.tar.gz

# mv darwin-amd64/64/usr/local/bin

# helm version

现在he1m命令已经加入了$PATH,可以利用它在 Kubernetes集群上启动服务端组件tiller。 Minikube为例:

# kubectl get nodes

# helm init

# kubectl get pods –all-namespaces | grep tiller

现在都设置好了,你可以开始从100多个包中挑选需要的进行安装。

14.2. Using Helm to Install Applications

如果已经安装了he1m命令(请参阅14.1),如何查找并部署图表呢?

默认情况下,Helm自带一些配置好的图表仓库这些仓库是由社区维护的,详情请参阅 github (https: //github.com/kubernetes/charts)。其上有100多个可利用的图表。

例如,假设你想部署 Redis。那么可以再Helm中查找redis并安装。Helm会获取该图表并创建一个实例,该实例称为发行。

首先,确认 tiller处于运行状态,且默认的仓库配置完成:

# kubectl get pods–all-namespaces greptiller

# helm repo list

现在查找 Redis 包:

# helm search redis

Helm将创建该图表中定义的所有 Kubernetes对象,例如,一个secret(请参阅8.2节),一个PVC(请参阅8.5节),一个服务(请参阅5.1节),以及一个部署。所有这些对象组成了一个Helm发行,可以作为一个单元管理。

最终将得到一个能够正常运行的 redis pod:

# helm 1s

# kubectl get pods

更多关于Helm图表,以及如何创建自己的图表,请参阅14.3节

14.3. Creating Your Own Chart to Package Your Application with Helm

现有一个包含多AKubernetes个清单文件的应用程序,如何将它打包成Helm图表?

可以使用 helm create 和 helm package命令。

通过 helm create,可以生成图表的骨架。在终端窗口中执行该命令,指定图表的名称。例如,创建一个名为 oreilly的图表:

# helm create oreilly

如果你已经写好了所有的清单文件,那么可以将它们复制到/templates目录下,并删除骨架中生成的清单文件。如果想把你的清单文件变成模板,那么可以将清单文件中需要替换的部分写入 values.yaml文件中。接下来编辑Chart.yaml中的元数据,并将所有独立的图表放入/charts目录中。

你可以通过以下命令在本地测试图表:

# helm install./oreilly

最后使用 helm package oreilly 该命令讲生成Chart的tarball。将它复制到本地的图表代码库中,并为本地代码库生成一个新的 index.yaml文件。查看~/.helm,应该能看到如下类似的内容:

ls -l ~/.helm/repository/local/

KuberntsBiadm《(lrpsw的Bitnami文档中关于“如何创建第一个Helm
hps: docs.bitnami. com/kubernetes/how-to/ create-your-first-helm-chart/)

Helm文档关于“图表最佳实践 helm x#*T"B&k*RH "
https://docs. helm.sh/chart_best_ practices/)。

14.4. Converting Your Docker Compose Files to Kubernetes Manifests

假设你通过Docker访问容器,并编写了Docker compose文件来定义多个容器的应用程序。现在如何使用 Kubernetes ,以及重用Docker compose文件?

可以使用 kompose 工具将Docker compose文件转换成 Kubernetest清单文件。

首先,从 GitHub 上下载kompose,为了方便起见加入到$PATH中。例如,在 Macos上可以运行如下命令:

# wget https: //github. com/kubernetes-incubator/k/releases/download/v1.6.0/kompose-darwin-amd64

# mv kompose-darwin-amd64/usr/local/bin/kompose

# chmod +x /usr/local/bin/kompose

# kompose version

如果有下列用于启动 redis 容器 Docker compose文件:(略过)

那么可以通过如下命令,将它自动转换成 Kubernetes清单文件:

# kompose convert –stdout

清单文件将显示在 stdout,其中是 Kubernetes服务和一个部署。想要自动创建这些对象,可以使用up命令,如下所示:

# kompose up

一些 Docker compose 指令不会被转化为 Kubernetes。这种情况下, compose将输出警告信息,通知你转换未成功。

一般来说不会有大问题,但是转换生成的清单文件可能无法在Kubernetes正常工作。这类的转换一般都不会太完美。然而,这些转换可以帮助你创建基本的 Kubernetes清单文件。最值得注意的是卷和网络隔离的处理一般都需要手动定制。

kompose convert、up、down。请在命令行界面内使用–help参数查看每个命令的具体帮助信息。
默认情况下,kompose会将Docker服务转化成Kubernetes部署和相关的。你也可以指定使用 DaemonSet OpenShift的专用对象,例如DeploymentConfiguration

14.5. Creating a Kubernetes Cluster with kubicorn

如何在AWS上创建 Kubernetes集群?

可以使用 kubicorn Kubernetes集群。目前 kubicorn没有可以执行文件的形式发布,所以下面的操作需要先安装Go才能进行。

首先,安装 kubicorn,并确认安装了Go(.8或更高版本)。在这里,我们使用 Centos环境。

# go version

# go version go1. 8 linux/amd64

# yum group install”Development Tools”

# yum install ncurses-devel

# go get github. com/kris-nova/kubicorn

安装了kubicorn profile创建集群资源,并确认正确地定义了资源:

# kubicorn create –name k8scb–profile aws

# cat state/k8scb/cluster.yaml

!!!默认的资源 profile 假设在~/.ssh中有一对名叫id_rsa的私钥和和id_rsa.pub的公钥。如果公钥和私钥不在~/.ssh下,那么可能需要做些改动。请注意以上我们使用的区域是Oregon,us-west-2,

接下来,你需要准备一个AWS身份和访问管理用户(Identity and Access Management,并拥有以下权限Amazon C2FullAccess 、AutoScalingFullAccess、AmazonVPCFullAccess如果你没有这样的iaM用户,现在就创建一个吧

kubicorn的最后一项准备工作是将IAM的认证设置到环境变量中,如下所示:

export AWS_ACCESS_KEY_ID=*******

export AWS_SECRET_ACCESS_KEY=******

现在根据上述资源的定义以及提供的AWS访问权限创建集群:

kubicorn apply –name k8scb

实际上成功的是绿色的,告诉你一切设置成功。你也可以在浏览器中访问亚马逊的EC2控制台来进行确认

现在,按照 kubicorn apply命令最后一行输出的指示,在集群中运行:

# ssh: ssh-i”/.ssh/id_rsa
ubuntu@34.213.102.27

# kubectl get all -n kube-system

完成上述工作之后,别忘了销毁 Kubernetes集群了(请注意可能需要花费几分钟的时间):

# kubicorn delete–name k8scb

尽管 kubicorn还是一个很新的项目,但是它已经发展健全,你还可以在 Azure u Digital Ocean上使用它创建集群。
因为kubicorn kubicorn在配置方面非常灵活,操作非常直观,尤其是如果你有管理员的背景。

kubicornx文档“在AWS中设置Kubernetes”
http/kubicorn.io documentation/aws-walkthrough html

Lachlan Evensond在 Digital Ocean上建立 kubernetes 集群
https://www.youtube.com/watch?v=XpxgSz3dspE

14.6. Storing Encrypted Secrets in Version Control

如何将所有 Kubernetes的清单文件都保存在版本控制中,并安全地分享(甚至公开),包括 secret?

可以使用 sealed-secrets Sealed-secrets是Kubernete一个的控制器,它可以解密单向加密的 secret Secret对象(请参阅8.2节)。敏感的信息可以在 SealedSecret对象中加密编码, SealedSecret对象是一个自定义的CRD资源(请参阅13.4节)。 SealedSecret可以安全地保存到版本控制中,并可以公开分享。一旦在 Kubernetes的API服务器上创建 SealedSecret Secret对象(该对象仅进base64编码)。
首先,下载最新版本的 kubeseal secret:

# GOOS=$(go env GOOS)

# GOARCH=$(go env GOARCH)

# wget https: //github. com/bitnami/sealed-secrets/releases/download/vo.5.1/kubeseal-$GO0S-sGOARCH

# install -m 755 kubeseal-sGooS-$GOARCH /usr/local/bin/kubeseal

然后创建 SealedSecret CRD,并启动该控制器:

# kubectl create -f https: //github. com/bitnami/se/releases/download/v0.5.1/sealedsecret-crdyaml

# kubectl create -f https: //github.com/bitnami/se/releases/download/v0.5.1/controller.yaml

然后,你就可以得到一个新的自定义资源和一个运行在kube-system-命名空间中的新pod:

# kubectl get customresourcedefinitions

# kubectl get pods -n kube-system | grep sealed

现在可以使用 sealed-secretsle 。首先,创建一个通用的secret清单文件:

# kubectl create secret generic oreilly=password=root-0json –dry-run>secret.json

# cat secret.json

!!!创建清单文件的时候,可以使用–dry-run数以避免在API服务器上创建对象。上述命令可以将清单文件输出到 stdout如果想创建YAML格式的文件,可以使-o yaml参数;如果想创建JSON格式的文件,则可以使用 -o json.

接下来使用 kubeseal 命令创建新的SealedSecret对象:

# kubeseal <secret.json > sealedsecret json

# cat sealedsecretjson

现在可以安全地将 sealedsecret.json保存到版本控制中。只有保存再 sealed-secret控制中的私钥才可以解密。 在创建SealedSecret对象的时候,控制器会检测、解密并创建相应的加密信息:

# kubectl create-f sealedsecretjson

# kubectl get sealedsecret

sealed-secret 代码库
https: //github. com/bitnami-labs/sealed-secrets)

angus lees 的文章“sealedsecrets:保护ubernetes的码
hps: engineering.bitnami. com/articles/sealed-secrets, html).

14.7. Deploying Functions with kubeless

如何在不建立 Docker Python、Node.js、Ruby或PowerShell的函数部署到Kubernetes以及如何通过HTTP或向消息总线发送事件的方式调用这些函数?

可以使用 Kubernetes 的本地无服务器解决方案 kubeless

kubeless使用CRD来定义FunctionX对象,以及一个在 Kubernetes集群内的pod中部署这些函数的控制器。

尽管此应用的范围非常广,但在本节中我们仅介绍部署一个Python函数(该函数可以返回发送的JSON格式数据)的基本例子。

首先,创建一个 kubeless 命名空间并启动控制器。 GitHub页面上获取 kubeless 每个发行的清单文件。还可以下载kubeless的可执行文件:

# kubectl create ns tubeless

# curl -sl
https://github. com/kubeless/kube/releases/download/v0.3.1/kubeless-rbac-vo.3.1. yaml | kubectl create -f-

# wget https: //github. com/kubeless/kubeless/relea/download/vo.3.1/kubeless_darwin-amd64.zip

# cp bundles/kubeless_darwin-amd64/kubeless /usr/local/bin

kubeless这个命名空间有三个Pod:负责监视Function这个自定义访问点的控制器、 Kafka pod 和 Zookeeper pod

那些由事件触发的函数需要后两个pod。对于由HTTP触发的函数,只需要让控制器处于运行状态:

# kubectl get pods -n kubeless

为了使用 kubeless ,需要在 post.py的文中编写下列 Python函数:

def handler(context):
print context.json

return context.json

然后使用 kubeless 在Kubernetes中部署该函数。function deploy命令接受的可选参数包括–runtime参数用于指定编写函数的语言; –http-trigger 参数用于指定该函数可以被http(s)调用触发;–handler参数用于指定函数的名字,函数名的前缀则是存储该函数的文件名(去掉扩展名后的部分);–from-file参数指定了该函数所在的文件:

# kubeless function deploy post-python –trigger-http \
–runtime python2.7 \

–handler post handler \

–from-file post.py
# ktubeless function ls

# kubectl get pods

kubeless 控制器检测到新的Function对象,并创建了一个部署。函数的代码保存在配置映射中(请参阅8.3节),并在运行时添加到了运行中的pod中然后就可以通过HTTP调用该函数了。如下是几个这类的对象:

# kubectl get functions

# kubectl get cm

# kubectl get deployments

可以使用 kubeless function cal1命令调用该函数,如下所示:

# kubeless function call post-python –data ‘{“oreilly”:”function”}’

kubeless 的使用远远不止基本的由HTTP触发的函数。请通过–help参数在命令行界面内查看详情: kubeless–help

相关链接

. kubeless代码库( https://github.com/kubeless/kueless )。

. kubeless *il (https: //github. com/kubeless/kubeless/tree/master/example

在azure容器服务上使用kubeles
(htps:gitubcom/kbeles/kubesblob/master/docs/kubeless-on-azure-container-services.md)