minikube中部署的第一个Kubernete应用

(Proudly powered by QKQ)

上一篇文章安装好了minikube,那么接下来就试试kubernetes的hello world。

Q: 将应用部署到kubernetes需要几个步骤?

A: 在kubernetes中部署应用,首先需要将应用做成镜像,然后才能部署在kubernetes中。所以:

  • 创建一个镜像
  • 需要一个镜像仓库用来存放镜像
  • 编写kubernetes的deployment文件,将镜像部署成为pod
  • 编写kubernetes的service文件,创建pod的服务,并对外暴露端口

这里,我们先跳过创建镜像这一步,直接使用网络上的echo镜像。即:
kennship/http-echo,这是一个简单的nodejs代码,它接收一个请求,返回请求信息。其主要代码为:

var express = require('express')
var bodyParser = require('body-parser') 

var app = express()
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.all('*', (req, res) => {
  res.json({
    service: process.env.SERVICE_NAME || undefined, // Keys with value `undefined` are omitted during JSON serialization
    path: req.path,
    headers: req.headers,
    method: req.method,
    body: req.body,
    cookies: req.cookies,
    fresh: req.fresh,
    hostname: req.hostname,
    ip: req.ip,
    ips: req.ips,
    protocol: req.protocol,
    query: req.query,
    subdomains: req.subdomains,
    xhr: req.xhr,
  })
})

app.listen(process.env.PORT || 3000)

Q: 如何建立一个私有镜像仓库?

A: 镜像从docker hub中拉取,然后在本地建立一个镜像仓库。建立镜像仓库很简单:
docker run -d -p 5000:5000 --name registry registry:2

该命令会从docker hub上拉取registry镜像,并启动成为容器,该端口为5000。

然后我们从docker hub拉取echo镜像:
docker pull kennship/http-echo

再将镜像打一个tag,然后push到本地镜像仓库:

docker tag kennship/http-echo 192.168.99.1:5000/echo:v1.0
docker push 192.168.99.1:5000/echo:v1.0

注意,192.168.99.1是minikube创建的虚拟机的网络,由于我们需要在虚拟机中使用这个docker registry,所以为该地址。
如果在tag的时候不加v1.0这个标签,在进行pull的时候会报类似于manifest not found之类的错误。

创建镜像之后使用docker pull 192.168.99.1:5000/echo:v1.0,发现拉取不下来。由于这是一个私有仓库,所以在docker daemon中需要添加这个insecure registry(不安全的仓库)。在macos上的docker daemon里的preferences里的daemon页,insecure registries里加上192.168.99.1:5000,然后重启daemon,即可成功拉取镜像。

在minikube start的时候,需要使用命令--insecure-registries=192.168.99.1:5000来设置虚拟机里面的docker daemon的private registry。

最终的minikube start指令为:

minikube start --docker-env http_proxy=[http://192.168.99.1:1087](http://192.168.99.1:1087/) --docker-env https_proxy=[http://192.168.99.1:1087](http://192.168.99.1:1087/) --docker-env no_proxy=localhost,127.0.0.1,192.168.99.0/24 --log_dir=tmp --cpus 4 --memory 8192 --insecure-registry=192.168.99.1:5000

Q: kubernetes的deployment指令?

A: 此时,我们要创建一个pod。pod是什么?就是一个或者多个容器,pod是kubernetes调度的基本单元。
我们有了镜像,镜像的运行时是容器,所以我们需要容器,k8s里面容器以pod的形式运行。deployment是用来创建pod的。
echo的deployment(文件名为deploy.yaml):

# deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deployment
  labels:
    app: echo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: echo
  template:
    metadata:
      labels:
        app: echo
    spec:
      containers:
      - name: koly-echo
        image: 192.168.99.1:5000/echo:v1.0
        ports:
        - containerPort: 3000

使用kubectl apply -f deploy.yaml来告诉k8s运行一个基于echo镜像的pod。
然后我们可以使用kubectl get pods来查看我们的pod是否运行成功。

Q: echo服务的service?

A: service是用来干什么的?k8s里面的service是用来访问pod的,由于pod可能被重启,重启之后ip就变了,而service具有名字,可以通过名字来访问service代表的pod。
echo服务的Service(文件名service.yaml):

apiVersion: v1
kind: Service
metadata:
  name: echo-service
spec:
  selector:
    app: echo
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
    nodePort: 30080

注意,其中的targetPort跟deployment里面的containerPort一致。nodePort表示我们将minikube创建的机器的端口跟service的port映射了起来,而service的port又跟pod的port映射了起来。
此时,我们可以通过minikube ip来获取机器的ip地址,然后使用:
curl -v http://$(minikube ip):30080/hello来访问echoserver了。
返回结果:

*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 1087 (#0)
> GET http://192.168.99.101:30080/hello HTTP/1.1
> Host: 192.168.99.101:30080
> User-Agent: curl/7.54.0
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: application/json; charset=utf-8
< Content-Length: 259
< ETag: W/"103-vpP+vLOLEtvy++USO5/H0ZHELDg"
< Date: Sun, 06 Jan 2019 12:11:21 GMT
< Connection: keep-alive
< Proxy-Connection: keep-alive
<
* Connection #0 to host 127.0.0.1 left intact
{"path":"/hello","headers":{"host":"192.168.99.101:30080","user-agent":"curl/7.54.0","accept":"*/*"},"method":"GET","body":{},"fresh":false,"hostname":"192.168.99.101","ip":"::ffff:172.17.0.1","ips":[],"protocol":"http","query":{},"subdomains":[],"xhr":false}

总结一下,要运行app,我们需要:

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

推荐阅读更多精彩内容