在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自己提供的功能。
- 部署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
現在還不能訪問,因為還沒有代理任何服務。