一、 准备
本篇的要求是在前三篇的基础上已经搭建好的本地k8s以及部署了Traefik,我们将会使用Traefik Ingress来访问.net core api,比较简单,做个记录,如果还没有搭建k8s或者还没有部署Traefik的同学可以先去看下Kubernetes 系列的前三篇。
二、k8s部署.net core api
首先我们要新建一个.net core api,默认配置即可,然后打包镜像上传到仓库,这一步就省略了,之前专门写过一篇,大家可以看下哈。
准备.net core api部署到k8s的部署文件 k8s-api.yaml:
kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: k8s-api name: k8s-api namespace: netcore spec: replicas: 2 selector: matchLabels: k8s-app: k8s-api template: metadata: labels: k8s-app: k8s-api spec: containers: - name: k8s-api image: ****** --这里是你的.net core api镜像名称 ports: - containerPort: 80
运行以下命令部署.net core api:
kubectl apply -f k8s-api.yaml
通过以下命令查看Pod状态:
[root@localhost k8s-netcore]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-779fcd779f-6nzd5 1/1 Running 2 12d nginx-deploy-779fcd779f-8nkdp 1/1 Running 2 12d
然后我们为其运行一个Service,准备部署Service的文件k8s-api-service.yaml:
apiVersion: v1 kind: Service metadata: name: k8s-api namespace: netcore spec: selector: k8s-app: k8s-api ports: - name: http port: 80 targetPort: 80
运行该Service部署文件:
kubectl apply -f k8s-api-service.yaml
通过以下命令查看Service状态:
[root@localhost k8s-netcore]# kubectl get svc -n netcore NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE k8s-api ClusterIP 10.96.173.2 <none> 80/TCP 12s k8s-demo NodePort 10.109.237.67 <none> 80:30335/TCP 3d17h
可以看到k8s-api已经成功运行了,它的Cluster-ip是10.96.173.2,这个时候我们已经可以在集群内部访问服务了:
[root@localhost k8s-netcore]# curl http://10.96.173.2/api/values ["value1","value2"]
因为我用的是虚拟机,所以我需要映射下Service和虚拟机的IP,直接使用物理机安装的同学可以跳过这一步(我的情况现在是虚拟机和物理机默认是ping通的,但是Service以及Pod与物理机是不通的):
首先查看VMnet8网卡的编号:
C:UsersAdministrator>route print =========================================================================== 接口列表 13...00 ff 7a e5 a0 e9 ......TAP-Windows Adapter V9 #2 9...54 ab 3a 47 1c e8 ......Realtek PCIe GBE Family Controller 27...4a 15 73 1e 60 f7 ......Hyper-V Virtual Ethernet Adapter 5...00 15 5d 01 6d 83 ......Hyper-V Virtual Ethernet Adapter #2 24...00 15 5d 67 6f af ......Hyper-V Virtual Ethernet Adapter #3 19...ca ff 28 04 ba 1f ......Microsoft Wi-Fi Direct Virtual Adapter 25...da ff 28 04 ba 1f ......Microsoft Wi-Fi Direct Virtual Adapter #2 11...00 ff 6b a3 f7 80 ......TAP-Windows Adapter V9 22...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1 16...00 50 56 c0 00 08 ......VMware Virtual Ethernet Adapter for VMnet8 23...c8 ff 28 04 ba 20 ......Bluetooth Device (Personal Area Network) 1...........................Software Loopback Interface 1 14...c8 ff 28 04 ba 1f ......Qualcomm Atheros QCA61x4A Wireless Network Adapter
我这里是编号是16,然后映射Service的IP到虚拟机IP:
C:UsersAdministrator>route add 10.96.0.0 MASK 255.255.0.0 192.168.3.131 IF 16 操作完成!
完成后我们可以直接使用 http://10.96.173.2/api/values 这个地址在浏览器里访问了:
我们现在可以通过Service的IP来进行访问,但是这不是我们想要的,实际项目里我们不想要去关心某个Api服务的具体IP,并且这个IP还是会变的,我们希望IP的获取是自动的,即IP的变化对调用方是无感知的,其实就是我们常说的服务注册和发现,我们只需要通过一个服务的标识名就可以访问到服务,并且自动负载均衡,而Traefik则可以帮我们实现这些。
三、Traefik路由.net core api
因为我们之前已经部署过Traefik了,所以在这里我们只需要写一个.net core api的ingress文件就可以,k8s-api-ingress.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: k8s-api namespace: netcore spec: rules: - host: k8s.api.com http: paths: - path: / backend: serviceName: k8s-api servicePort: http
运行该文件:
kubectl apply -f k8s-api-ingress.yaml
查看对应的ingress状态:
[root@localhost k8s-netcore]# kubectl get ingress -n netcore NAME HOSTS ADDRESS PORTS AGE k8s-api k8s.api.com 80 45m
这个时候Traefik的UI界面已经有了我们的k8s-api-ingress了:
然后配置下host文件就可以访问了:
这个时候我们在使用时已经不需要关心服务的具体IP,使用的是k8s.api.com这个host地址,就算IP变化了,Traefik也会实时感知,调用方无需做任何改变。