Kubernetes--第一个微服务部署

一. 前言

从零开始开发一个微服务,将该微服务打包成docker镜像,利用yaml文件部署到kube集群中
具体思路:在开发环境,创建一个docker-project的微服务,对外暴露一个接口;使用dockerfile打包成docker镜像,再将他push到docker伺服中;接着使用yaml文件将此镜像部署到kube集群。

一. 镜像环境准备

  1. Docker之镜像制作
  2. Docker之私有镜像仓库搭建
  3. 按照以上两步操作即可,我们直接查看docker伺服上的镜像
    Kubernetes--第一个微服务部署_第1张图片

二. 使用yaml文件创建Deployment

1. 创建一个my-docker-project.yaml的yaml文件,内容如下

apiVersion:  apps/v1            #当前格式的版本
kind:  Deployment               #当前创建资源的类型, 当前类型是Deployment
metadata:                       #当前资源的元数据
  name:  docker-project         #当前资源的名字 是元数据必须的项
spec:
  selector:                     #新版本要求必须有selector
    matchLabels:
      app:  web_server           #是当前Deployment的规格说明
  replicas:  2                      #指当前创建的副本数量 默认不填 默认值就为‘1’
  template:                      #定义pod的模板
    metadata:                    #当前pod的元数据
      labels:                    #至少顶一个labels标签,可任意创建一个 key:value
        app:  web_server         #必须和selector.matchLabels中的app名称一致
    spec:                        #当前pod的规格说明
      containers:                #容器
      -  name: my-docker-project              #是容器的名字容器名字是必须填写的
         image: IP:5000/docker-project:latested      #镜像 镜像的名字和版本
         ports:
         - containerPort: 8080  

2.执行:kubectl create -f my-docker-project.yaml,创建deployment

在这里插入图片描述

3. 查看pod状态为ErrImagePull(不正常)

在这里插入图片描述

4. 查看具体的pod日志

kubectl describe pod docker-project-f598fbb9-b8p6n

日志分析:无法拉取镜像
Kubernetes--第一个微服务部署_第2张图片

5. 解决办法

1)在vi /etc/docker/daemon.json中配置私有镜像源,否则从docker官网拉取镜像

{
   "insecure-registries": ["IP:5000"],
   "exec-opts": ["native.cgroupdriver=systemd"]
}

2)重启docker

systemctl daemon-reload
systemctl restart docker
systemctl enable docker 

3)删掉刚才失败的pod, 再次创建

强制删除pod:
a. 查看pod:kubectl get pods -o wide
b. 删除pod: kubectl delete pod <podname>
c. 再次查看发现又生成了一个
d. 因为deployment.yaml文件中定义了副本数量,所以还需要删除副本
e. 查看deployment:kubectl get deployment <name>
f. 删除:kubectl delete deployment <name>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三. 执行如下命令来验证程序是否好用(pod内部的ip访问应用程序)

在这里插入图片描述

四. 创建service,提供外部访问

Pod是有生命周期的,使用凡人皆有一死来描述pod很贴切,当一个工作节点(node)销毁时,节点上运行的pods也会被销毁, ReplicationController会动态地在其他节点上创建Pod来保持应用程序的运行,每一个Pod都有一个独立的IP地址,甚至是同一个节点上的Pod,可以看出Pod的IP是动态的,它随Pod的创建而创建,随Pod的销毁而消失,这就引出一个问题:如果由一组Pods组合而成的集群来提供服务,那如何访问这些Pods呢?

Kubenetes的Service就是用来解决这个问题的。一个Service可以看作一组提供相同服务的Pods的对外访问接口,Service作用于哪些Pods是通过label selector来定义的,这些Pods能被Service访问,Pod之间的发现和路由(如应用中的前端和后端组件)由Kubernetes Service处理

1. 使用yaml文件创建service(在my-docker-project.yaml基础上添加service)

apiVersion:  apps/v1  #当前格式的版本
kind:  Deployment                 #当前创建资源的类型, 当前类型是Deployment
metadata:                        #当前资源的元数据
  name:  docker-project              #当前资源的名字 是元数据必须的项
spec:
  selector:
    matchLabels:
      app:  web_server                          #是当前Deployment的规格说明
  replicas:  2                      #指当前创建的副本数量 默认不填 默认值就为‘1’
  template:                      #定义pod的模板
    metadata:                    #当前pod的元数据
      labels:                    #至少顶一个labels标签,可任意创建一个 key:value
        app:  web_server
    spec:                        #当前pod的规格说明
      containers:                #容器
      -  name: my-docker-project              #是容器的名字容器名字是必须填写的
         image: 172.16.129.52:5000/docker-project:latested      #镜像 镜像的名字和版本
         ports:
         - containerPort: 8080

---

kind: Service
apiVersion: v1
metadata:
  name: my-docker-project-service  
spec:
  type: NodePort 
  ports:
    - port: 8080              #service暴露在cluster ip上的端口,提供给集群内部客户访问service的入口
      targetPort: 8080        #容器的端口,与制作容器时暴露的端口一致
      nodePort: 31000         #外部机器可访问的端口
  selector:
    app: web_server

2. 执行kubectl apply -f my-docker-project.yaml

在这里插入图片描述

3. 查看服务

kubectl get services -o wide;

在这里插入图片描述

kubectl get pods -o wide

在这里插入图片描述
访问内部端口
在这里插入图片描述
页面访问:
Kubernetes--第一个微服务部署_第3张图片
查看某个服务的日志

kubectl logs -f  my-docker-project-5686b57f96-qbp24

Kubernetes--第一个微服务部署_第4张图片

你可能感兴趣的:(kubernates,kubernetes)