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