Kubernetes 系列(四):使用Traefik访问.net core api

一、 准备

本篇的要求是在前三篇的基础上已经搭建好的本地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:\Users\Administrator>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:\Users\Administrator>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也会实时感知,调用方无需做任何改变。

posted @ 2019-03-24 17:41  名字都被注册了  阅读(858)  评论(0编辑  收藏  举报