Oh My Iron man post - day night
Oh my K8s service ! 談談如何暴露你的服務 - 3
- 目錄
- Introduce K8s service - Kube-proxy
- Introduce K8s service - 4 ways to apply service(1)
- 💎 Introduce K8s service - 4 ways to apply service(2) 💎
- Service Comparison & Introduce Ingress
- Service Debugging
- How to install Traefik
- Nginx-ingress vs Traefik
昨天介紹完前兩種, 今天要來介紹後兩種。
Load Balancer
如果對於Load Balance(負載平衡)還沒有了解的朋友們可以先看看這篇。
Load Balancer分為L4, L7 Load Balancer, 本篇提到的ELB(Elastic Load Balancer)是AWS提供的L4 Load Balancer, 有興趣的朋友可以直接參照官方文件以及這篇 Medium。裡面提到的ALB即是L7 Load Balancer
承上篇, 我們繼續為nginx1-7這個deployment加上Service, 這次我把Type設定成LoadBalancer。 我並沒有像官方文件一樣給出Loadbalancer IP,由於這個cluster是用Kops建在AWS instances上面的, 在這個Service建立伊始, AWS就會很貼心的幫你設定好一個新的ELB,然後在下個月份的請款日跟你請款。
1 | kind: Service |
建完之後
就可以在瀏覽器上直接輸入ELB的domain name, 即可看到結果。

當然你也可以自己建立外部的Load balancer, 這邊是幾個常用的服務,如果你只是單純要Serve網頁,可以選用nginx,但是大部分人都會整合公有雲來管理。
ExternalName
ExternalName type在kubernetes 1.7 版本有提供,但是要使用的朋友要注意kube-dns version要在1.14.9以上,不然會遇到Resolve External Name issue
使用場景通常有兩個:
- 你想要直接連到外部服務, 可以直接將externalName設置為外部服務的CName
- 你想要namespace A的service可以指到namespace B, 可以參考這篇
假使在namespace=kube-system有一個deployment叫做cheddar
同時也有一條Service
這時候可以apply這樣的service:
1 | kind: Service |
執行完之後:
用dig指令就可以看到確實指到這個cheddar service

直接curl 這個CName可以get該Pods的內容

ExternalName其實就是在Cluster的DNS Server添加一筆CName Record, 而且跟其他Service Types不一樣的是,這個網路流量不透過Kube-proxy處理,而是透過Kube-dns。
ExternalIPs
嚴格上來講這應該算是ClusterIP的外部IP版,ExternalIPs不算在四種Types裡面。
你可以指定一個外部的IP, 只要這個IP可以連到K8s cluster, 就可以透過這個IP連到
Pods。
有興趣的人可以自己參考官方文件
Reference
- 對比NodePort, LoadBalancerm and Ingress: https://imroc.io/posts/kubernetes/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what/
- AWS Load Balancer: https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html
- ALB & ELB: https://medium.com/@chihsuan/aws-load-balance-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E4%BB%8B%E7%B4%B9-33c30a59b596
- 小信豬k8s-Service-Overview: https://godleon.github.io/blog/Kubernetes/k8s-Service-Overview/
- 官方文件 ExternalName :https://kubernetes.io/docs/concepts/services-networking/service/#externalname
- Namespace A connect to Namespace B with ExternalName: https://akomljen.com/kubernetes-tips-part-1/
- ExternalIps: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips