(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和端口
网友评论