专栏首页学习日记在kubernetes上部署Go Micro代码(一)

在kubernetes上部署Go Micro代码(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/anakinsun/article/details/98392884

环境准备

用kubeadm安装好kubernetes环境,我用的测试环境是单节点的,master node和worker node部署在同一台机器上。具体的安装过程就不详述了,坑还是有一些的。 首先,init的时候需要制定pod的网络环境:

kubeadm init --pod-network-cidr 10.244.0.0/16

其次,由于是单节点,因此需要设置允许master作为worker node

kubectl taint nodes --all node-role.kubernetes.io/master-

同时,由于需要采用ingress作为保留http服务的工具,还需要在k8s上提前安装好ingress。 使用官方提供的mandatory.yaml文件即可:

kubectl apply mandatory.yaml

然后安装ingress service 绑定服务器的公网IP地址,yaml如下:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  externalIPs:
  - server ip here~~~
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  - name: https
    port: 443
    targetPort: 443
    protocol: TCP
  selector:
    app: ingress-nginx

部署代码

首先,基于go-micro的代码是在docker-compose环境下测试通过的,整体的架构是micro作为api gateway,然后后面是api层,再然后是service层。service层会请求具体的资源。在dokcer-compose方式部署的情况下,服务发现使用的是consul,部署到k8s的过程中,为了避免部署consul集群的复杂性,服务发现采用了k8s自己提供的功能。

  1. 部署gateway

我采用的是自己编译的micro,没有用官方的image,因此在go build完成之后,需要先用docker打包镜像,Dockerfile如下:

FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY micro /micro
EXPOSE 8080 81

然后build docker镜像:

docker build . -t micro:latest

docker build 之后,采用docker save的方式上传到服务器,当然这只是临时的解决方案,正式生产环境部署的时候,需要结合CI/CD的工具以及私有镜像仓库来完成这个部分的功能。先在本地save:

docker save micro:latest|gzip > micro.tar.gz

把生成的tar包上传到服务器,然后在服务器执行:

docker load -i micro.tar.gz

这样,镜像就算是加入到服务器环境的docker本地镜像库了。

可以看到,并没有在Dockerfile中指定micro服务需要的环境变量,也没有设置ENTRYPOINT,由于这些和环境相关,因此更倾向于写在k8s的yaml文件中。也可以根据自己情况选择。

接下来编写部署到k8s需要用到的yaml文件,首先是deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kube-apps
  name: micro-gateway
spec:
  replicas: 2
  selector:
   matchLabels:
     name: micro-gateway
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        name: micro-gateway
    spec:
      containers:
        - name: api
          image: micro:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              name: gateway-port
          command: [
                    "/micro",
                    "--registry=kubernetes",
                    "--api_handler=http",
                    "--api_namespace=go.micro.api",
                    "--enable_stats",
                    "api",
          ]

然后是service:

apiVersion: v1
kind: Service
metadata:
  name: micro-gateway
  namespace: kube-apps
  labels:
    app: micro
spec:
  ports:
    - port: 8080
      protocol: TCP
      name: gateway-port
  selector:
    name: micro-gateway

由于gateway需要暴露http服务,因此还需要ingress文件:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: gateway-ingress
  namespace: kube-apps
spec:
  rules:
    - host: k8s.anakinsun.com
      http:
        paths:
          - path: /
            backend:
              serviceName: micro-gateway
              servicePort: gateway-port

这里需要注意一下,不同版本的k8s,ingress对应的api版本不一样,具体可以查阅一下官方的文档。这里是最新的版本,整合到了networking.k8s.io/v1beta1中。

依次运行k8s的apply或者create命令,不出意外的话,gateway应该已经部署完成了。可以通过命令查看一下pod和service的情况:

kubectl get pod -n kube-apps
kubectl get svc -n kube-apps
kubectl get ingress -n kube-apps

现在还不能访问,因为还没有代理任何服务。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux-3.14.12内存管理笔记【构建内存管理框架(3)】

    此处接前文,分析free_area_init_nodes()函数最后部分,分析其末尾的循环:

    233333
  • Linux-3.14.12内存管理笔记【构建内存管理框架(1)】

    传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的。这种内存结构被称之为UMA(Uniform Memory Arch...

    233333
  • 除了Web和Node,JavaScript还能做什么

    提起JavaScript,我们也许经常会想到的是,可以用来写Web页面嘛,又或者,会想起Node.js 这个服务端环境,搞前后端同构。

    外婆的彭湖湾
  • Linux-3.14.12内存管理笔记【构建内存管理框架(5)】

    前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充。

    233333
  • SOFAJRaft—初次使用

    SOFAJRaft 是基于 Raft 算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP。应用场景有 Leader 选举、分布式锁服务、...

    luozhiyun
  • vue项目小点(二)

    1.解决使用vue-awesome-swiper组件分页器pagination样式设置失效问题

    生南星
  • Linux-3.14.12内存管理笔记【构建内存管理框架(2)】

    前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建。此处代码实现主要在于setup_arch()下的一处钩子:x86_i...

    233333
  • 干货 | Node.js 在转转的微服务实践(二)

    如今,Node.js 已经成为国际上许多科技公司的首选方案。特别对于在服务器端需要费阻塞特性的场景,Node.js 俨然成了最好的选择。

    五月君
  • Linux-3.14.12内存管理笔记【伙伴管理算法(1)】

    前面分析了memblock算法、内核页表的建立、内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征...

    233333
  • AOP框架Dora.Interception 3.0 [1]: 编程体验

    .NET Core正式发布之后,我为.NET Core度身定制的AOP框架Dora.Interception也升级到3.0。这个版本除了升级底层类库(.NET ...

    蒋金楠

扫码关注云+社区

领取腾讯云代金券