本章将会讲解: 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 系列四:集群,扩容,升级,回滚

Docker & k8s 系列三:在k8s中部署单个服务实例的更多相关文章

  1. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  2. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  3. centos6.10中部署percona-mysql双实例的方法

    centos6.10中部署percona-mysql双实例的方法 数据库的同步关系:192.168.11.53(master) --> slave(192.168.10.189) --> ...

  4. log4net保存到数据库系列三、代码中xml配置log4net

    园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志一.WebConfig中配置log4net 一.WebConfig中配置log4ne ...

  5. 从零开始一步一步搭建Ubuntu Server服务器、修改数据源、安装Docker、配置镜像加速器、Compose部署Gitlab服务

    场景 最终目的是使用Docker Compose部署一个Gitlab服务. 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序 ...

  6. zookeeper系列之:独立模式部署zookeeper服务

    一.简述 独立模式是部署zookeeper服务的三种模式中最简单和最基础的模式,只需一台机器即可,独立模式仅适用于学习,开发和生产都不建议使用独立模式.本文介绍以独立模式部署zookeeper服务器的 ...

  7. tomcat 部署 RESTful 服务实例

    1.建立简单restfule服务 参考:java 利用JAX-RS快速开发RESTful 服务实例 简单代码: package com.example; import javax.ws.rs.GET; ...

  8. rpm,docker,k8s三种方式安装部署GitLab服务

    rpm方式 源地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ wget https://mirrors.tuna.tsinghua ...

  9. K8s 系列(三) - 如何配置 etcd https 证书?

    在 K8s 中,kube-apiserver 使用 etcd 对 REST object 资源进行持久化存储,本文介绍如何配置生成自签 https 证书,搭建 etcd 集群给 apiserver 使 ...

随机推荐

  1. python-Django收集主机信息json格式

    Control: from django.conf.urls import patterns, include, url from django.contrib import admin admin. ...

  2. Java封装 概述

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式.好处:隐藏实现细节,提供公共的访问方式提高了代码的复用性提高安全性 封装原则:将不需要对外提供的内容都隐藏起来把属性隐藏,提供公共方法对其访 ...

  3. Mysql数据操作指令

    -----多数据插入-----只要写一次insert指令,但是可以直接插入多条记录insert into table values(),(),(); 主键冲突我们插入值的时候,主键中已经存在某个值,插 ...

  4. Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed

    Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but ...

  5. Django中MySQL事务的使用

    Django中事物的使用 from django.db import transaction @transaction.atomic通过transaction的@transaction.atomic装 ...

  6. Spark RDD----pyspark第四次作业

    1.pyspark交互式编程 查看群里发的“data01.txt”数据集,该数据集包含了某大学计算机系的成绩,数据格式如下所示: Tom,DataBase,80 Tom,Algorithm,50 To ...

  7. php中垃圾回收机制

    php中垃圾回收机制 我们可能在开发中经常会听到gc,是的gc就是垃圾回收容器,全称Garbage Collection. 此篇文章中“垃圾”的概念:如果一个变量容器能被减少到0,说明他就已经没有被引 ...

  8. CountDownLatch/CyclicBarrier/Semaphore

    CountDownLatch 概念 让一些线程阻塞直到另一些线程完成一系列操作才被唤醒 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程就会被阻塞.其它线程调 ...

  9. Task Scheduler Error Message: 80041318

    Using the error lookup tool that comes with VC++ (errlook.exe, or "Error Lookup" on the To ...

  10. 设定程序随windows启动

    Boot Trigger Example (C++) /******************************************************************** Thi ...