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也會實時感知,調用方無需做任何改變。
Kubernetes 系列(四):使用Traefik訪問.net core api