部署APP-使用kubectl创建一个部署

原文地址:https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-intro/

目标

  • 学习应用部署
  • 使用kubectl在kubernetes上部署第一个应用

Kubernetes部署

一旦有了一个运行中Kubernetes集群,你可以在上面部署你的容器化后的应用。为此,你需要创建一个k8s Deployment配置项。Deployment指明Kubernetes如何去创建和升级应用的实例。一旦创建了一个Deployment,kuberneters主线程调度涉及到的应用实例到集群中的独立Nodes。

一旦应用实例创建了,一个Kubernetes Deployment Controller会持续管理这些实例。如果Node托管的实例挂掉了或者被被删除了,Deployment controller会取代它。这是k8s的一个自我修复机制来解决机器故障或者维护问题。

在一个前-编排(orchestration)世界,安装脚本经常用来启动应用,但是他们不允许从故障的机器中恢复回来,也就是没有自我恢复机制。通过既创建应用实例又让它们跨节点运行,Kubernetes部署提供了一个完全不同的应用部署的方式。

总结:

  • Deployments
  • Kubectl

一个Deployment负责创建和升级应用实例。

在Kubernetes上部署你的第一个app


image

你可以通过使用命令行接口Kubectl创建和管理一个Deployment.Kubectl使用Kubernetes API与集群进行交互。在这个单元里,你将学习最常用的Kubectl用来创建Deployments从而在Kubernetes集群上运行你的应用的命令行。

当你创建了一个Deployment,你需要为应用程序指定容器图像和你想运行的副本的个数。通过升级Deployment你能够改变那个信息;集训的单元5和6将讨论如何scale和升级你的Deployments.

为了部署应用到Kubernetes上,应用需要被打包成一种被支持的容器格式。

对于我们的第一次部署,我们将部署Node.js应用到Docker容器上。源代码和Dockerfile在Kubernetes集训的Github respository上。

现在你知道Deployments是什么了,让我们进入在线教程并且部署你的第一个app吧!

kubectl basics基础

kubectl命名的格式是:kubectl + 动作 + 资源
动作包括create,describe等,资源则包括node,container。可以在命令后加上--help查看额外的信息。例如,kubectl get nodes --help。

检查kubectl版本:kubectl version

Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

查看集群中的节点数:kubectl get nodes

NAME      STATUS    ROLES     AGE       VERSION
host01    Ready     <none>    5m        v1.9.0

k8s将基于可用的节点资源来选择应用的部署位置。

部署我们的app

让我们使用kubectl run命令来运行我们第一个应用。run命令创建了一个新的部署。我们需要提供:部署名字和应用的图像位置(包括在Docker hub外的完整的的repository网址)。我们想在某个特定端口运行应用的话,需要加上--port参数。

kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080

deployment "kubernetes-bootcamp" created
太棒了,你通过创建了一个部署成功部署了我们的第一个应用程序。

上面的命令包含了以下的事情:

  • 搜索一个可用节点,这个节点可以运行应用实例
  • 调度应用到那个节点
  • 配置集群在必要时重新调度实例到新的节点

列举Deployments:kubectl get deployments

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            1           5m

应用实例运行在你的节点Docker容器中。

查看我们的应用

在Kubernetes内部运行的Pods运行在一个私有的,独立的网络。默认情况下,同一个k8s集群下的其他pod和service之间是可见的,但是在网络外是不可见的。当我们使用kubectl,我们通过API端点与我们的应用程序进行通信。
我们将在第四单元涵盖在k8s集群外如何暴露应用的其他选项。
kubectl命名能创建一个代理,这个代理可以在我们的集群范围内的,私有的网络空间内转发通信。代理可以通过CTRL+C的方式终止,而且在运行时不会有任何输出。
我们将开启第二个终端窗口去运行代理。
kubectl proxy
我们现在有了一个主机与k8s集群之间的连接。代理可以直接从这些终端获取到API的权限。

通过代理端口,你能看到所有的主机API,从http://localhost:8001可以看到所有。例如,我们能直接通过curl命令通过API查询版本。
curl http://localhost:8001/version
stdout:

{
  "major": "",
  "minor": "",
  "gitVersion": "v1.9.0",
  "gitCommit": "925c127ec6b946659ad0fd596fa959be43f0cc05",
  "gitTreeState": "clean",
  "buildDate": "2018-01-26T19:04:38Z",
  "goVersion": "go1.9.1",
  "compiler": "gc",
  "platform": "linux/amd64"
}

API服务器可以自动为每个pod创建一个尾端点,基于pod名字,这通过代理同样是可行的。
首先我们需要获取到Pod的名字,然后将其存储到环境变量POD_NAME中。

export  POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME

stdout:
Name of the Pod: kubernetes-bootcamp-5dbf48f7d4-s5xwx

现在我们可以通过运行在那个POD的应用程序创建一个HTTP请求了。
curl http://localhost:8001/api/v1/proxy/namespace/default/pods/$POD_NAME
stdout:
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-s5xwx | v=1
这个url是Pod的API的路由。

注意:检查终端的顶部。代理运行在一个新的tab上,而且最近的命令还在源tab上执行。代理仍然运行在第二个tab,而且这也允许我们的curl命令能够运行在localhost:8001.

期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:

努力成为优秀前端工程师!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,444评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,867评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,157评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,312评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,673评论 3 289
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,802评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,470评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,696评论 2 250
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,187评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,538评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,188评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,127评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,889评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,741评论 2 274

推荐阅读更多精彩内容