为了账号安全,请及时绑定邮箱和手机立即绑定

minikube中部署的第一个Kubernete应用

标签:
Kubernetes

(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.yamlapiVersion: apps/v1kind: Deploymentmetadata:  name: echo-deployment  labels:    app: echospec:  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: v1kind: Servicemetadata:  name: echo-servicespec:  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和端口



作者:Mr_Hospital
链接:https://www.jianshu.com/p/7cc5f727c225


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消