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

  • 相关阅读:
    SEO简介
    30个最常用css选择器解析(转自大范甘迪)
    H5新增语义化标签footer
    H5新增语义化标签article
    H5新增语义化标签aside
    H5新增语义化标签figure
    H5新增语义化标签nav
    node 文本替换
    一键生成专题
    node命令行工具—cf-cli
  • 原文地址:https://www.cnblogs.com/demingblog/p/12905569.html
Copyright © 2020-2023  润新知