1. 程式人生 > >Kubernetes 系列(四):使用Traefik訪問.net core api

Kubernetes 系列(四):使用Traefik訪問.net core api

deploy localhost nbsp 鏡像 img 列表 *** 改變 span

一、 準備

本篇的要求是在前三篇的基礎上已經搭建好的本地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也會實時感知,調用方無需做任何改變。

Kubernetes 系列(四):使用Traefik訪問.net core api