Docker & Kubenetes 系列三:在k8s中部署单个服务实例

本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例。html

在上面的篇幅中,咱们了解了docker,并制做、运行了docker镜像,而后将镜像发布至中央仓库了。而后又搭建了本机的k8s环境。本篇将演示如何将单个服务实例部署到k8s。node

Pod的含义

k8s的最小部署单元是pod,pod这个单词的意思是“豆荚”,咱们能够想象一下豆荚里边包含了一颗颗小豆子。与豆荚类似,k8s中包含了一个个pod,pod中运行着咱们的程序,以下图:docker

在K8s中部署服务

在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

访问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 系列四:集群,扩容,升级,回滚
alt 逃离沙漠公众号

相关文章
相关标签/搜索