用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自己提供的功能。
我采用的是自己编译的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
现在还不能访问,因为还没有代理任何服务。