Docker入门Kubernetes入门


还是 官方文档好啊,跟着做一遍肯定就能搞明白,这边文章基本就是官方入门的翻译,外加我自己的一些理解,解决实践过程中碰到的一些问题。

docker的三个元素

镜像,容器,仓库

docker和虚拟机有什么区别?

如果不知道docker是什么,可以先把他想象成一个虚拟机,下面会介绍docker和虚拟机的区别,从而理解docker。
docker比虚拟机更加轻量级,docker有独立的文件系统,但是会和Linux宿主机共享内核,docker是操作系统虚拟化;而VM则是一个完整的操作系统通过设备虚拟化运行在宿主机上,VM是硬件资源虚拟化。
要知道系统内核在运行时是要常驻内存的,每运行一个虚拟机就要往内存载入一个内核。官方的一个对比图就很能说明问题。
docker VS VM

Kubernetes是什么?

简而言之,Kubernetes在可伸缩,网络,安全,维护方面为容器化的应用提供了许多工具。那么问题来了,我们为什么要使用这些工具呢?
官网把Kubernetes(还有Docker Swarm)称作"Orchestration",通过这个词我大概理解了一下,比如现在有一个很大的互联网公司,他向市场提供一个产品,这个产品是由很多容器化的服务构成的。假如该产品很成功,各项功能日趋完善,其内部服务变得越来越多,已经达到了即使容器化也很难管理的程度。这个时候就需要一个协调者负责容器的统一管理,使这个产品背后的众多服务能够更好的互相配合。
正如"Orchestration"这个词的含义。两个吉他手能够很好地配合完成一个曲子,但是100多号人的大型交响乐团如果没有一个指挥,能演奏的好才怪呢。
但是如果想真正理解光听别人说是没用的,还是要实践啊,下面进入实践环节。

安装Docker Desktop

如何下载参见官方文档。
Docker Desktop安装好之后可以在系统托盘找到,右键docker图标打开Settings -> Kubernetes,勾选 Enable Kubernetes,然后点击Apply。之后Kubernetes的配置会自动进行,比较耗时,成功之后Setting页的左下角如下显示。
这里有个问题。国内无法下载到Kubernete的文件,所以就会一直卡在Kubernete is starting
我们可以使用阿里提供的解决方案
最后应该是这个样子
在这里插入图片描述

测试Kubernetes是否安装成功

1.创建一个文件命名 pod.yaml,内容为

 apiVersion: v1
 kind: Pod
 metadata:
   name: demo
 spec:
   containers:
   - name: testpod
     image: alpine:3.5
     command: ["ping", "8.8.8.8"]

这个脚本创建一个容器,执行ping 8.8.8.8命令。
2.打开windows的powershell,进入pod.yaml所在目录,执行

kubectl apply -f pod.yaml

创建pod。
3.检查pod的运行状态

kubectl get pods

你应该会看到如下信息

 NAME      READY     STATUS    RESTARTS   AGE
 demo      1/1       Running   0          4s

代表成功启动。
4.查看pod的日志信息。

kubectl logs demo

你应该会看到如下信息

 PING 8.8.8.8 (8.8.8.8): 56 data bytes
 64 bytes from 8.8.8.8: seq=0 ttl=37 time=21.393 ms
 64 bytes from 8.8.8.8: seq=1 ttl=37 time=15.320 ms
 64 bytes from 8.8.8.8: seq=2 ttl=37 time=11.111 ms
 ...

5.最后,卸载测试pod

kubectl delete -f pod.yaml

使用镜像封装应用

定义一个镜像

1.拉取docker官方的一个示例项目

git clone -b v1 https://github.com/docker-training/node-bulletin-board
cd node-bulletin-board/bulletin-board-app

2.在查看Dockerfile之前我们其实可以先回想一下过往,在不使用docker的时候我们部署项目都有哪些步骤呢?

  1. 环境准备:安装操作系统,安装软件运行环境
  2. 部署项目:将项目代码“拷贝”到服务器工作目录,如果有外部依赖还需要下载依赖包(当然使用包管理器部署可以自动下载依赖)
  3. 启动项目
    那接下来我们打开Dockerfile看看它都干了些什么。
FROM node:6.11.5    

WORKDIR /usr/src/app
COPY package.json .
RUN npm install    
COPY . .

CMD [ "npm", "start" ]    
  • FROM 命令:它始终在脚本最开始,声明镜像的基本环境,FROM node:6.11.5声明镜像的基本环境是官方node镜像的6.11.5版本。
  • WORKDIR命令:后面跟一个目录,在这条命令之后,镜像内部会把这个目录作为当前目录
  • COPY命令:复制,把宿主机的文件复制到镜像内
  • RUN 命令:在镜像创建时执行命令
  • CMD 命令:该命令定义了我们启动虚拟机的时候需要执行的命令
    观察Dockerfile里的内容,我们可以发现,他做的工作也无非时环境准备,部署,启动。但很赞的是通过脚本定义,再配合docker镜像仓库,我们可以实现全自动项目部署与启动。

启动并测试

1.创建镜像
node-bulletin-board/bulletin-board-app目录下执行

docker image build -t bulletinboard:1.0 .

如果创建成功最后会显示Successfully tagged bulletinboard:1.0.
2.基于镜像启动一个容器

docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
  • --publish参数:把宿主机8000端口号映射到镜像8080端口
  • --detach参数:容器后台启动
  • --name参数:为容器起一个名字
    3.如果没出现问题的话,访问本地localhost:8000即可看到应用页面

4.测试通过可以把容器删除了,这是我们就可以使用我们之前给容器起的名字来指定我们想要删除的容器,我们想要删除"bb"

docker container rm --force bb

使用Kubernetes 部署应用

Kubernetes 三要素

  • Kubernetes Pods
  • Kubernetes Deployments
  • Kubernetes Services

使用Kubernetes定义一个应用

创建一个bb.yaml文件,内容为

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bb-demo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      bb: web
  template:
    metadata:
      labels:
        bb: web
    spec:
      containers:
      - name: bb-site
        image: bulletinboard:1.0
---
apiVersion: v1
kind: Service
metadata:
  name: bb-entrypoint
  namespace: default
spec:
  type: NodePort
  selector:
    bb: web
  ports:
 - port: 8080
    targetPort: 8080
    nodePort: 30001

在这个Kubernetes配置文件中有两个对象,用---分割:

  • Deployment:描述一组pods,在以上的配置中只有一个pod集群replica,这个pod里边只有一个容器,这个容器基于之前我们创建的bulletinboard:1.0镜像。简而言之就是描述从镜像->容器->pod->pods的生成规则
  • NodePort service:pods的网络服务的映射通过这一项是单独描述的,从宿主机的30001端口映射到pods的8080端口
    以上配置文件乍一看可能比较复杂,但是他始终遵循相同的结构:
  • apiVersion:指定解析配置文件的Kubernetes API版本
  • kind:指定是哪种对象
  • metadata:对象元数据,比如对象名
  • spec:指定对象的所有参数和配置

部署应用

部署应用很简单,命令如下:

kubectl apply -f bb.yaml

部署成功会回显

deployment.apps/bb-demo created
service/bb-entrypoint created

查看部署状态

kubectl get deployments

如果一切正常,将返回

NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
bb-demo   1         1         1            1           48s

查看服务状态

kubectl get services

NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
bb-entrypoint   NodePort    10.106.145.116   <none>        8080:30001/TCP   53s
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          138d

本地访问localhost:30001可以看到bulletin board后台页面。
完成以上实践之后可以把卸载应用:

kubectl delete -f bb.yaml

使用Swarm 部署应用

什么是Swarm?
与Kubernetes一样,都是"orchestrator"。他们是可以互相替代的框架。和Kubernetes一样Swarm在可伸缩,网络,安全,维护方面为容器化的应用提供了许多工具。

初始化Swarm环境

运行命令

docker system info

如果看到Swarm: active则说明环境已经准备好,否则使用docker swarm init初始化环境

使用stack文件定义应用

1.创建bb-stack.yaml:

version: '3.7'    

services:
  bb-app:
    image: bulletinboard:1.0
    ports:
      - "8000:8080"  

与Kubernetes不同的是Swarm的services包含容器组和网络定义。

部署应用

1.部署命令

docker stack deploy -c bb-stack.yaml demo

如果一切正常将输出

Creating network demo_default
Creating service demo_bb-app

2.列出我们部署的service,查看状态

docker service ls

你可能看到的返回

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
il7elwunymbs        demo_bb-app         replicated          1/1                 bulletinboard:1.0   *:8000->8080/tcp

3.目前为止一切正常的话打开localhost:8000会看到bulletin board显示。
4.实验完成,卸载我们的应用

docker stack rm demo

总结

到这里,我们已经完成了将一个应用部署到Kubernetes 环境和Swarm环境的过程。虽未深入,但作为初步的入门体验已经足够了。

猜你喜欢

转载自blog.csdn.net/litterfrog/article/details/103984901