本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例。html
在上面的篇幅中,咱们了解了docker,并制做、运行了docker镜像,而后将镜像发布至中央仓库了。而后又搭建了本机的k8s环境。本篇将演示如何将单个服务实例部署到k8s。node
k8s的最小部署单元是pod,pod这个单词的意思是“豆荚”,咱们能够想象一下豆荚里边包含了一颗颗小豆子。与豆荚类似,k8s中包含了一个个pod,pod中运行着咱们的程序,以下图:docker
在k8s中部署一个Pod,须要先编写一个Pod的配置文件,配置文件的格式为yml。配置文件描述了api版本信息,pod类型,名称,镜像,端口等信息。本篇要演示的pod.yml内容以下:api
在k8s中部署一个Pod,须要先编写一个Pod的配置文件,配置文件的格式为yml
。配置文件描述了api版本信息,pod类型,名称,镜像,端口等信息。本篇要演示的pod.yml内容以下:网络
apiVersion: v1 kind: Pod metadata: name: my-first-demo labels: app: my-first-demo spec: containers: - name: my-first-demo image: hellodm/my-first-demo:v1.0 ports: - containerPort: 80
这里的镜像正是咱们第一篇文章中建立并发布至中央仓库的那个镜像。你也能够替换成其余镜像,或者本身制做的镜像。并发
下面咱们将应用部署到k8s,使用以下命令:app
$ kubectl create -f pod.yml pod/my-first-demo created
能够看到,pod created,而后执行kubectl get pods
命令查看一下是否启动成功:curl
$ kubectl get pods NAME READY STATUS RESTARTS AGE my-first-demo 1/1 Running 0 5m55s
能够看到是Running
的状态,说明启动没问题。但事情有时候并非那么顺利,因此这里给出一个错误的案例:url
$ kubectl get pods NAME READY STATUS RESTARTS AGE my-first-demo 0/1 ImagePullBackOff 0 4m46s
这个status为ImagePullBackOff
,这样的错误还有好几个就不一一列举了,我当时确实碰到了,是镜像拉取错误。若是你也碰到了,自行解决便可(好比镜像名称写错了,网络问题等)。3d
回归主题,上面咱们经过kubectl create -f pod.yml
命令,向k8s中部署了一个应用,检查其状态是“Running”状态,那么如今是否是能够直接访问了呢?不能!由于这个pod是运行在k8s内部,能够理解为他是在一个内网中运行的,因此咱们访问不了。
为了访问这个应用,咱们须要在部署一个相似“反向代理”角色的Pod来帮咱们访问应用。这个Pod是Service类型的,其定义以下:
apiVersion: v1 kind: Service metadata: name: my-first-demo-svc labels: app: my-first-demo spec: type: NodePort ports: - port: 80 nodePort: 30000 selector: app: my-first-demo
咱们能够逐行看一下这个配置文件,其Kind为Service类型,端口信息中nodePort: 30000
是说这个 service 会把容器的 80 端口从 node 的 30050 端口暴露出来。selector 部分的配置决定了请求会被发送给集群里的哪些 pod,这里是经过app:my-first-demo
来找的,对应的是咱们第一个Pod文件中的labels。下面咱们来启动这个Pod,执行以下命令:
$ kubectl create -f svc.yml service/my-first-demo-svc created
查看这个Pod的启动状态:
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 33d my-first-demo-svc NodePort 10.108.28.171 <none> 80:30000/TCP 27h
能够看到my-first-demo-svc
启动成功,那么咱们访问一下看看:
$ curl 'http://localhost:30000/' <h1>Hello world! <h1>
本篇咱们一步步完成了一个简单应用的部署,这是一个单体应用。而实际中,咱们的项目大多很是复杂且庞大。一单服务的用户多了起来,咱们的可用性的要求就高了,单个节点出问题了就等于整个服务不可用,这是不可接受的。怎么作高可用呢?k8s说:我能够的!这个问题后面在写。
Docker & k8s 系列一:快速上手docker
Docker & k8s 系列二:本机k8s环境搭建
Docker & k8s 系列三:在k8s中部署单个服务实例
Docker & Kubenetes 系列四:集群,扩容,升级,回滚