docker+k8s部署微服务
docker+k8s部署微服务(一)配置微服务项目,用dockerfile直接打包1 所有服务 服务注册中心项目中创建src/main/docker/DockerfileFROM java:8VOLUME /tmpADD micro-aidianmao-eureka-server-0.0.1-SNAPSHOT.jar app.jarENTRYPOINT ["java","-Djava....
·
docker+k8s部署微服务
(一)配置微服务项目,用dockerfile直接打包
1 所有服务 服务注册中心项目中创建src/main/docker/Dockerfile
FROM java:8
VOLUME /tmp
ADD micro-aidianmao-eureka-server-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
#上面第三行ADD 后面必须是pom.xml中的artifactId+version+.jar
2 所有服务pom.xml添加
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<configuration>
<imageName>dingka/${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
3 服务注册中心eureka,application.properties
server.port=8761
spring.application.name=dingka-eureka-server
#注册到eurekaip地址(注册中心IP)
eureka.instance.hostname=dingka-eureka-server
#是否注册自己
eureka.client.register-with-eureka=false
#Erueka是为注册中心,不需要检索服务信息;(表示是否从Eureka Server获取注册信息,默认为true。 如果这是一个单点的 Eureka Server,不需要同步其他节点的数据,可以设为false)
eureka.client.fetch-registry=false
#服务实体向eureka注册时,注册名默认是“IP名:应用名:应用端口名
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
#默认情况下,Eureka 使用 hostname 进行服务注册,以及服务信息的显示,那如果我们使用 IP 地址的方式
eureka.instance.prefer-ip-address=true
4 其他服务,配置文件application.properties
server.port=8880
spring.application.name=micro-aidianmao-back-sso-server
eureka.instance.hostname=dingka-eureka-server
#注册中心
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8761/eureka/
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
(二)项目上传到服务器,打包成镜像并推送至远程仓库
1 项目打包
mvn package docker:build
2 登录远程仓库,这里是阿里
docker login --username=dingkawang@1925841380829066 registry.cn-hangzhou.aliyuncs.com
3 查询镜像
docker images
4 镜像修改名称(前面是上面查到的名称+版本,后面是要推送的远程仓库的名称+版本)
docker tag dingka/micro-aidianmao-eureka-server:latest registry.cn-hangzhou.aliyuncs.com/dingka/dingka-eureka:latest
5 推送镜像至远程仓库
docker push registry.cn-hangzhou.aliyuncs.com/dingka/dingka-eureka:latest
6 删除原镜像
docker rmi -f dingka/micro-aidianmao-eureka-server:latest
7 拉取远程仓库镜像,此步可以证实是否能成远程仓库拉取镜像,为后面部署项目做准备
docker pull registry.cn-hangzhou.aliyuncs.com/dingka/dingka-eureka:latest
8 如果想删除远程仓库镜像,需要手动去远程仓库删除,然后再删除本地镜像
docker rmi -f registry.cn-hangzhou.aliyuncs.com/dingka/dingka-eureka:latest
(三)生成秘钥自动拉取私服镜像
1 查看当前登录远程仓库信息
cat ~/.docker/config.json
{
"auths": {
"registry.cn-hangzhou.aliyuncs.com": {
"auth": "ZGluZ2thd2FuZ0AxOTI1ODQxMzgwODI5MDY2OkRpbmdrYXdhbmdAMTIz"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.7 (linux)"
}
}
#此时表示已经登录到远程仓库
#该命令会将你的认证信息通过base64编码,生成一个编码之后的字符串。
cat /root/.docker/config.json | base64 -w 0
ewoJImF1dGhzIjogewoJCSJyZWdpc3RyeS5jbi1oYW5nemhvdS5hbGl5dW5jcy5jb20iOiB7CgkJCSJhdXRoIjogIlpHbHVaMnRoZDJGdVowQXhPVEkxT0RReE16Z3dPREk1TURZMk9rUnBibWRyWVhkaGJtZEFNVEl6IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOC4wOS43IChsaW51eCkiCgl9Cn0=
#创建 registry-key.yaml
apiVersion: v1
kind: Secret
metadata:
#自定义名称,后面会用上
name: myregistrykey
namespace:
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZWdpc3RyeS5jbi1oYW5nemhvdS5hbGl5dW5jcy5jb20iOiB7CgkJCSJhdXRoIjogIlpHbHVaMnRoZDJGdVowQXhPVEkxT0RReE16Z3dPREk1TURZMk9rUnBibWRyWVhkaGJtZEFNVEl6IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOC4wOS43IChsaW51eCkiCgl9Cn0=
type: kubernetes.io/dockerconfigjson
#生成secret
kubectl create -f registry-key.yaml
#查看secret
kubectl get secrets
(四)编写微服务对应的deployment.yaml,service.yaml
#创建并编写
vim dingka-eureka-deployment.yaml
#1.16.0版本已经弃用extensions/v1beta1 ,改为apps/v1,版本号
apiVersion: apps/v1
#一种定义
kind: Deployment
#资源对象的定义,元数据
metadata:
#名称
name: dingka-eureka-server-deployment
#容器的详细定义
spec:
#标签匹配
selector:
matchLabels:
app: dingka-eureka-server
#pods的副本数量
replicas: 1
template:
metadata:
labels:
app: dingka-eureka-server
spec:
imagePullSecrets:
#拉取镜像秘钥名称
- name: myregistrykey
containers:
#容器名称
- name: dingka-eureka-server
#镜像地址
image: registry.cn-hangzhou.aliyuncs.com/dingka/dingka-eureka:latest
imagePullPolicy: Always
ports:
#容器监听端口
- containerPort: 8761
vim dingka-eureka-service.yaml
apiVersion: v1
kind: Service
metadata:
name: dingka-eureka-server
spec:
ports:
#容器暴露的端口
- port: 8761
#端口协议 支持tcp和udp,默认为tcp
protocol: TCP
#需要转发到后端Pod的端口号
targetPort: 8761
#指定映射到物理机的端口号,也就是外部可以访问
nodePort: 31761
#当spec.type=NodePort时,同上,除了eureka和zuul,其他服务暂不开放
type: NodePort
selector:
app: dingka-eureka-server
#依次启动
kubectl apply -f dingka-eureka-deployment.yaml
kubectl apply -f dingka-eureka-service.yaml
#查看状态
watch kubectl get pods -o wide
#服务成功的话,显示是running ready 1/1
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dingka-admin-service-deployment-6859d6f4d5-9kqkm 1/1 Running 0 18h 10.100.141.72 bigdata-senior01.home.com <none> <none>
dingka-back-sso-service-deployment-7b557dc5b7-shvzm 1/1 Running 0 92m 10.100.141.73 bigdata-senior01.home.com <none> <none>
dingka-eureka-server-deployment-f8677665-knxmb 1/1 Running 0 19h 10.100.141.70 bigdata-senior01.home.com <none> <none>
dingka-front-sso-service-deployment-5f65c78f94-rbldb 1/1 Running 0 19h 10.100.141.71 bigdata-senior01.home.com <none> <none>
dingka-user-service-deployment-57f67cb478-8ffnh 1/1 Running 0 19h 10.100.141.69 bigdata-senior01.home.com <none> <none>
dingka-zuul-deployment-757f95c69f-jbz9n 1/1 Running 0 19h 10.100.141.68 bigdata-senior01.home.com <none> <none>
#查看eureka
访问任意节点ip:8761,同时也可以查看其余微服务启动结果,通过zuul网关对外开放端口进行访问接口
#如果只有两台服务器,一主一从,有时候部署项目会提示没有可用节点,这时候可以将master设置成node使用
kubectl taint node localhost.localdomain node-role.kubernetes.io/master-
#禁止启动
kubectl taint node localhost.localdomain node-role.kubernetes.io/master="":NoSchedule
(五)滚动升级
#顾名思义,我们的微服务项目众多,每次发布上线的时候,就会出现要暂停服务,然后升级的情况,k8s滚动升级可以解决这种情况,这里以user服务做测试
1 打包新的镜像,并上传至远程仓库
2 当前user服务已经是启动的,直接修改user对应的deployment,修改镜像为最新镜像
kubectl edit deployment/dingka-user-service-deployment
3 保存退出
:wq
#一旦镜像名或者pod定义发生了修改,则出发系统完成Deployment所有运行Pod的滚动升级,可查看滚动升级进程
kubectl rollout status deployment/dingka-user-service-deployment
Waiting for deployment "dingka-user-service-deployment" rollout to finish: 2 of 3 updated replicas are available...
deployment "dingka-user-service-deployment" successfully rolled out
#在这个滚动升级过程,接口依旧可以访问,可以保证不停服务更新
#Deployment的 spec.strategy可以指定pod更新策略
1)Recreate(重建):更新同时先杀掉所有运行pod,再创建Pod
2)RollingUpdate(滚动更新):滚动方式逐个更新
(六)回滚
#有时候新版本出现问题,需要回退到旧版本,默认情况下,所有Deployment的发布历史都保存在系统中
kubectl apply -f dingka-user-service-deployment.yaml --record
kubectl rollout history deployment/dingka-user-service-deployment
deployment.apps/dingka-user-service-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=dingka-user-service-deployment.yaml --record=true
#可以检查这个Deployment部署的历史记录,查看某个版本的部署详情
kubectl rollout history deployment/dingka-user-service-deployment --revision=1
deployment.apps/dingka-user-service-deployment with revision #1
Pod Template:
Labels: app=dingka-user-service
pod-template-hash=57f67cb478
Annotations: kubernetes.io/change-cause: kubectl apply --filename=dingka-user-service-deployment.yaml --record=true
Containers:
liushu-user-service:
Image: registry.cn-hangzhou.aliyuncs.com/dingka/dingka-user:latest
Port: 8085/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
#撤销并回滚到上个部署版本
kubectl rollout undo deployment/dingka-user-service-deployment
#回滚到指定版本
kubectl rollout undo deployment/dingka-user-service-deployment --to-revision=1
#查看描述
kubectl describe deployment/dingka-user-service-deployment
#暂停和回复deployment
kubectl rollout pause deployment/dingka-user-service-deployment
kubectl rollout resume deployment/dingka-user-service-deployment
(七)扩容和缩容
1 手动,手动扩容副本数量为5个,如果当前设置副本数量比原先小,则杀掉一些pod,进行缩容
kubectl scale deployment dingka-user-service-deployment --replicas 5
更多推荐
已为社区贡献2条内容
所有评论(0)