masker 节点: vm1:192.168.160.100+centos7+docker 19.03.13+kubelet v1.16.0
node 节点: vm2:192.168.160.130+centos7+docke 19.03.13+kubelet v1.16.0
node 节点: vm3:192.168.160.140+centos7+docker 19.03.13+kubelet v1.16.0
已有springcloud 项目,详见前几篇文章,开发环境测试通过~
git地址 [email protected]:chenlu4ever/springcloud_demo.git
目录
环境
一、eureka注册中心部署步骤
1、application-stg.yml
2、pom.xml
3、打包上传服务器
4、生成镜像文件,并上传docker hub库
5、k8s部署文件 cloud_discovery.yaml
1)查看k8s的apiVersion
2)、创建cloud_discovery.yaml文件,内容如下:
3)、执行
3)、查看pod和service信息
大致操作如下:开发环境(win10)用idea打包,上传测试master服务器(centos7),用docker生成images ,并上传至docker hub 。
PS:具体一些细节可以参考之前的文章
springcloud搭建实战<七>【kubernet集群环境安装】
springcloud搭建实战<六>【Docker部署-远程镜像】
springcloud搭建实战<五>【Docker部署-本地镜像】
我以eureka注册中心项目:cloud_discovery, 部署单个节点 (实际为了注册中心高可用性,应当互相注册,部署多个节点,这个之后再优化)
spring:
application:
name: eureka-server #服务名称,自定义
security:
user:
name: user #配置BASIC认证登录的账号
password: 123456 #配置BASIC认证登录的密码
server:
port: 8080 #指定该Eureka实例的端口
eureka:
server:
renewal-percent-threshold: 0.49 #设置心跳正常的阀值,默认为1,测试时可以调低
client:
register-with-eureka: false #禁止注册自身 (集群配置才为true)
fetch-registry: false #因为该服务没有注册到其他注册中心,所以关闭从注册中心拉取服务列表。 (集群配置才为true)
#如果是服务注册中心集群,需要开启,开启就是去掉该配置,采用默认配置即可
service-url:
defaultZone: http://user:123456@localhost:8080/eureka/ #服务注册中心地址,http://账号:密码@主机名称:端口/Eureka/
4.0.0
com.cloud
springcloud_demo
1.0-SNAPSHOT
com.cloud
cloud_discovery
0.0.1-SNAPSHOT
cloud_discovery
jar
Demo project for Spring Boot
UTF-8
UTF-8
1.8
Hoxton.SR8
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
com.spotify
dockerfile-maven-plugin
1.4.13
${project.artifactId}
target/${project.build.finalName}.jar
我直接用idea的maven插件打包,上传masker 节点: vm1:192.168.160.100
并在同级文件夹下创建Dockerfile文件
FROM java:8
ARG JAR_FILE
ADD cloud_discovery-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
# 生成image
docker build -t chenlu4ever/cloud_discovery-0.0.1-snapshot .
#上传
docker push chenlu4ever/cloud_discovery-0.0.1-snapshot
可以参考:springcloud搭建实战<六>【Docker部署-远程镜像】
kubectl api-versions
---
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源的类型/角色,deployment为控制器
metadata: #定义资源的元数据信息
name: cloud-discovery-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
labels: #定义资源标签
app: cloud-discovery
spec:
replicas: 1 #定义副本数量
selector: #定义选择器
matchLabels: #匹配上面的标签
app: cloud-discovery
template:
metadata:
labels:
app: cloud-discovery
spec:
containers: #定义容器信息
- name: cloud-discovery #容器名,与标签名要相同
image: chenlu4ever/cloud_discovery-0.0.1-snapshot:latest #容器使用的镜像以及版本
ports:
- containerPort: 8080 #定义容器的对外端口
---
apiVersion: v1
kind: Service
metadata:
name: cloud-discovery-service
labels:
app: cloud-discovery
spec:
type: NodePort
selector:
app: cloud-discovery
ports:
- port: 8080
targetPort: 8080
nodePort: 31071 #外部访问端口
kubectl create -f cloud_discovery.yaml
PS:记录下,第一次我cloud_discovery.yaml文件中的项目名称出现了下划线,于是报了如下异常
kubectl get pods -o wide
kubectl get svc -o wide
看下服务是否正常启动
#查看pod日志
kubectl logs -f cloud-discovery-deployment-76b7c74744-nh6nq
注意:有两个IP端口,一个用于内部,一个用于外部。
K8S集群内部是使用clusterIp+port进行通讯,如上图所示,使用kubectl get svc命令查询到服务的cluster-ip:10.107.119.189,端口port:8080,
需要修改provider和consumer的application文件
外部访问:http://192.168.160.100:30191/
注意端口号,为service的端口
我以eureka生成项目:cloud_provider, 部署指定2个节点 ,
apllication.yml文件
server:
port: 8090
spring:
application:
name: cloud-provider
eureka:
client:
service-url:
defaultZone: http://10.107.119.189:8080/eureka/
instance:
prefer-ip-address: true
FROM java:8
ARG JAR_FILE
ADD cloud_provider-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
EXPOSE 8090
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
我希望provider部署到指定节点 vm1 和 vm3上。
注意:遇到一个巨坑,我的注册中心部署在vm2上,我把provider部署到 vm2 和 vm3上,按照下面步骤执行,最终发现,vm2上的provider报错,连接不上注册中心的IP。。。。
猜猜原因是同一个node上,好像是不能通过service访问的。将部署节点换过就好了。疑问未解决~只能遗留,后续看看能补充不!
采用nodeSelector标签配置。
# 查看当前集群节点标签信息
kubectl get nodes --show-labels
# 添加标签语法
kubectl label nodes =
# 修改标签语法: 需要加上--overwrite参数:
kubectl label nodes = --overwrite
# 删除标签语法
kubectl label nodes -
将vm2/vm3 添加type=provider标签
记得将部署nodeSelector配置上:nodeSelector
---
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源的类型/角色,deployment为控制器
metadata: #定义资源的元数据信息
name: cloud-provider-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
labels: #定义资源标签
app: cloud-provider
spec:
replicas: 2 #定义副本数量
selector: #定义选择器
matchLabels: #匹配上面的标签
app: cloud-provider
template:
metadata:
labels:
app: cloud-provider
spec:
containers: #定义容器信息
- name: cloud-provider #容器名,与标签名要相同
image: chenlu4ever/cloud_provider-0.0.1-snapshot:latest #容器使用的镜像以及版本
ports:
- containerPort: 8090 #定义容器的对外端口
nodeSelector:
type: provider #调度到拥有 label 为 type=provider 的节点
---
apiVersion: v1
kind: Service
metadata:
name: cloud-provider-service
labels:
app: cloud-provider
spec:
type: NodePort
selector:
app: cloud-provider
ports:
- port: 8090
targetPort: 8090
nodePort: 31072 #外部访问端口
PS:部署多个节点,镜像地址写的是本地镜像,所以要在其他节点上pull镜像。
kubectl create -f cloud_provider.yaml
查看注册中心:http://192.168.160.100:31071/
访问provider接口:http://192.168.160.100:31072/sayHi
customer部署三台机子
部署步骤一样,customer配置文件apllication需要和provider一样改下。
修改下yaml文件
---
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源的类型/角色,deployment为控制器
metadata: #定义资源的元数据信息
name: cloud-consumer-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
labels: #定义资源标签
app: cloud-consumer
spec:
replicas: 3 #定义副本数量
selector: #定义选择器
matchLabels: #匹配上面的标签
app: cloud-consumer
template:
metadata:
labels:
app: cloud-consumer
spec:
containers: #定义容器信息
- name: cloud-consumer #容器名,与标签名要相同
image: chenlu4ever/cloud_provider-0.0.1-snapshot:latest #容器使用的镜像以及版本
ports:
- containerPort: 8091 #定义容器的对外端口
---
apiVersion: v1
kind: Service
metadata:
name: cloud-consumer-service
labels:
app: cloud-consumer
spec:
type: NodePort
selector:
app: cloud-consumer
ports:
- port: 8091
targetPort: 8091
nodePort: 31073 #外部访问端口
最终pod和service如下
参考:k8s之Services:创建nodeport clusterip services
service主要有三种类型:一种叫clusterIP,一种叫nodePort,一种叫外部的LoadBalancer
2、CrashLoopBackOff
参考:https://www.jianshu.com/p/bcc05427990d
全网最详细的 K8s Service 不能访问排查流程
3、