Docker & Kubenetes 系列三:在k8s中部署单个服务实例
本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例。
在上面的篇幅中,我们了解了docker,并制作、运行了docker镜像,然后将镜像发布至中央仓库了。然后又搭建了本机的k8s环境。本篇将演示如何将单个服务实例部署到k8s。
Pod的含义
k8s的最小部署单元是pod,pod这个单词的意思是“豆荚”,我们可以想象一下豆荚里边包含了一颗颗小豆子。与豆荚相似,k8s中包含了一个个pod,pod中运行着我们的程序,如下图:
在K8s中部署服务
在k8s中部署一个Pod,需要先编写一个Pod的配置文件,配置文件的格式为yml。配置文件描述了api版本信息,pod类型,名称,镜像,端口等信息。本篇要演示的pod.yml内容如下:
在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,使用如下命令:
$ kubectl create -f pod.yml
pod/my-first-demo created
可以看到,pod created,然后执行kubectl get pods
命令查看一下是否启动成功:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo 1/1 Running 0 5m55s
可以看到是Running
的状态,说明启动没问题。但事情有时候并不是那么顺利,所以这里给出一个错误的案例:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo 0/1 ImagePullBackOff 0 4m46s
这个status为ImagePullBackOff
,这样的错误还有好几个就不一一列举了,我当时确实碰到了,是镜像拉取错误。如果你也碰到了,自行解决即可(比如镜像名称写错了,网络问题等)。
访问K8s内的应用
回归主题,上面我们通过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 系列四:集群,扩容,升级,回滚