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

環境準備

用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

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


分享到:


相關文章: