(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