一. 前言
从零开始开发一个微服务,将该微服务打包成docker镜像,利用yaml文件部署到kube集群中
具体思路:在开发环境,创建一个docker-project的微服务,对外暴露一个接口;使用dockerfile打包成docker镜像,再将他push到docker伺服中;接着使用yaml文件将此镜像部署到kube集群。
一. 镜像环境准备
- Docker之镜像制作
- Docker之私有镜像仓库搭建
- 按照以上两步操作即可,我们直接查看docker伺服上的镜像
二. 使用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
日志分析:无法拉取镜像
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是有生命周期的,使用凡人皆有一死来描述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
访问内部端口
页面访问:
查看某个服务的日志
kubectl logs -f my-docker-project-5686b57f96-qbp24