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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐