irpas技术客

k8s平台微服务部署_mxb1234567_k8s微服务

未知 8365

涉及的微服务

涉及三个微服务的demo:

服务注册与发现:eureka-server管理服务:admin-service用户服务:user-service

管理服务和用户服务会注册到eureka上,当访问 Admin 服务的 add user api,Admin 服务会调用 User 服务的 add user api,写入到 mysql数据库上。

生成docker镜像

通过dockerfile构建maven项目。在Docker 17.05多阶段构建推出之后,我们只需要维护一个Dockerfile文件即可,具体的文件内容如下。 创建Dockerfile文件: User-service/Dockerfile:

# 第一阶段构建环境 FROM maven:3.5.0-jdk-8-alpine AS builder # 添加pom.xml和源代码 ADD ./pom.xml pom.xml ADD ./src src/ # 跳过测试 RUN mvn package -Dmaven.test.skip=true # 第二阶段,基础镜像是openjdk FROM openjdk:8u232-jre-stretch # 第一阶段的jar,copy过来 COPY --from=builder ./target/user-service.jar /app/user-service.jar ADD runboot.sh /app/ WORKDIR /app RUN chmod a+x runboot.sh # run jar CMD /app/runboot.sh

Eureka-server/Dockerfile:

FROM maven:3.5.0-jdk-8-alpine AS builder ADD ./pom.xml pom.xml ADD ./src src/ RUN mvn package -Dmaven.test.skip=true FROM openjdk:8u232-jre-stretch COPY --from=builder ./target/eureka-server.jar /app/eureka-server.jar ADD runboot.sh /app/ WORKDIR /app RUN chmod a+x runboot.sh CMD /app/runboot.sh

admin-server/Dockerfile:

FROM maven:3.5.0-jdk-8-alpine AS builder ADD ./pom.xml pom.xml ADD ./src src/ RUN mvn package -Dmaven.test.skip=true FROM openjdk:8u232-jre-stretch COPY --from=builder ./target/admin-service.jar /app/admin-service.jar ADD runboot.sh /app/ WORKDIR /app RUN chmod a+x runboot.sh CMD /app/runboot.sh

这样就完成出了三个DockerFile。 下面构建docker image,以进入Eureka-server/Dockerfile为例,先进入文件目录,执行

docker build -t eureka-server .

就开始构建docker镜像: 启动容器:

# docker run --name [容器名] -p [虚拟机端口:对外暴露端口] [镜像名] docker run --name eureka -p 8080:8080 eureka-server

在浏览器输入http://localhost:8080/,可以看到eureka控制台: 相同的步骤运行admin-service。admin-service需要提供一个运行参数EURKA_URL

# --env [变量=xx] docker run --name admin --env EUREKA_URL=http://host.docker.internal:8080/eureka -p 18000:18000 admin-service

user-service需要配置数据库,数据库信息在application.properties中是通过运行参数获得:

docker run --name user --env DB_HOST=host.docker.internal --env EUREKA_URL=http://host.docker.internal:8080/eureka -p 9090:9090 user-service

最终admin和user的服务被发现和注册: 下面是简单测试: 按照格式发送一个POST请求: 运行结果: 数据库中:

k8s环境搭建 环境准备

本地开了三台虚拟机,用来部署k8s服务,操作系统为CentOS7 192.168.80.10 node1 2核 3GB内存 192.168.80.11 node2 1核 2GB内存 192.168.80.12 node3 1核 2GB内存 物理机172.19.191.135

k8s服务安装

同步时钟

# 三台上设置时区 timedatectl set-timezone Asia/Shanghai

关闭防火墙

systemctl disable firewalld systemctl stop firewalld

配置仓库并安装docker

# 配置Docker的稳定版本仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 安装Docker CE yum -y install docker-ce-18.06.1.ce-3.el7

启动docker

# 启动docker systemctl enable docker && systemctl start docker

docker版本如下 配置docker镜像源,把docker更改驱动为systemtd:

Vim /etc/docker/daemon.json { "registry-mirrors": [ "http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com", "https://zeco842d.mirror.aliyuncs.com" ], "exec-opts": ["native.cgroupdriver=systemd"] }

安装k8s三大组件,版本是1.14的(不是最新的)。

yum install -y kubelet-1.14.3 kubeadm-1.14.3 kubectl-1.14.3

配置网络

/etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 sysctl –system 部署master节点(单机版)

将192.168.80.10(node1)作为master。 生成 kubeadm 默认初始化模板:

kubeadm config print init-defaults > kubeadm-config.yaml

修改kubeadm-config.yaml 中advertiseAddress为当前节点的ip地址: 修改阿里源 拉取源:

kubeadm config images pull --config kubeadm-config.yaml

如果master的CPU不是双核或以上此处会报错[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2。 单机版运行起来了: 输出这里给出了一串命令,在其他node上执行可以加入k8s集群:

To start using your cluster, you need to run the follr: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/c sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of https://kubernetes.io/docs/concepts/cluster-adminis Then you can join any number of worker nodes by runnich as root: kubeadm join 192.168.80.10:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:9584a0d8bcac4a4e3a14782b6bf751f31bf4e3621c65ec41d7295f979acd3ea7

查看当前节点信息

kubectl get node

可以看到状态为NotReady,再等一会才能Ready。

集群配置

按照输出的提示执行即可。 在master上:

# master上执行 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

master部署通信组件calico

# master上执行 kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml

接下来让其他node也加入,在其他node上执行

# node2,3执行 kubeadm join 192.168.80.10:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:9584a0d8bcac4a4e3a14782b6bf751f31bf4e3621c65ec41d7295f979acd3ea7

这样node2、3也加入了k8s集群:

微服务部署 部署要求

三个微服务:Admin Service 、User Service、Eruka Service 当访问 Admin 服务的 add user api,Admin 服务会调用 User 服务的 add user api,写入到 mysql数据库 Admin Service 有两个副本,一个 svc 地址 User Service 一个副本 可以用 ingress 访问 Admin Service 可以用 nodeport访问 User Service

编排文件与部署

在物理机docker上开启eruka服务和mysql。 mysql在3306端口 编写yaml文件 springboot-user.yaml:

apiVersion: v1 kind: ReplicationController metadata: name: user-service spec: replicas: 1 selector: app: user-service template: metadata: labels: app: user-service creater: mxb spec: containers: - name: user-service image: user-service imagePullPolicy: IfNotPresent env: - name: EUREKA_URL value: http://172.19.191.135:8080/eureka - name: DB_HOST value: 172.19.191.135 ports: - containerPort: 9090

运行:

kubectl create -f springboot-user.yaml

可以通过kubectl describe pod xx查看pod情况 通过kubectl logs xxx查看日志 在eureka控制台上可以看到微服务信息: 这样user服务就拉起来了,接下来配置service springboot-user-svc.yaml:

apiVersion: v1 kind: Service #对象类型,这里是service metadata: name: user-service #名称 labels: name: user #标注 spec: type: NodePort ports: - port: 9090 targetPort: 9090 nodePort: 32001 selector: app: user-service

拉起来

kubectl create -f springboot-user-svc.yaml

同理,部署admin:

apiVersion: v1 kind: ReplicationController #对象类型,这里是rc(全称ReplicationController metadata: name: admin spec: replicas: 2 selector: app: admin template: metadata: labels: app: admin creater: mxb spec: containers: - name: admin image: admin-service imagePullPolicy: IfNotPresent env: - name: EUREKA_URL value: http://192.168.0.104:8080/eureka ports: - containerPort: 18000

admin的service部署,编写 admin-svc.yaml:

apiVersion: v1 kind: Service #对象类型,这里是service metadata: name: admin-svc labels: name: admin spec: type: NodePort ports: - port: 18000 targetPort: 18000 selector: app: admin

运行:

kubectl create -f admin-svc.yaml

由于需要ingress访问,编写admin-ingress.yaml:

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: admin-http spec: rules: - host: test.mxb.com http: paths: - backend: serviceName: admin-svc servicePort: 18000

运行:

kubectl create -f admin-ingress.yaml

接下来就来进行验证: 首先是验证用 nodeport访问 User Service。 首先看一下User Service被部署在了哪个node上:

kubectl describe pods user-wgk5s

可以看到被部署在了node3/192.168.80.12上 发送POST请求,返回: 通过nodeport正常访问。 需要通过ingress 访问 Admin Service: 物理机配置hosts,然后通过POST http://test.mxb.com:32054/user调用服务: 20211207:暂时没跑出来,eureka上ip是错的,500访问不到。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #k8s微服务 #admin #服务的 #add #User #apiadmin #服务会调用