在kubernetes上部署Go Micro程式碼(一)

  • 2019 年 10 月 25 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 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

現在還不能訪問,因為還沒有代理任何服務。