昨天介紹完前兩種, 今天要來介紹後兩種。
如果對於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,然後在下個月份的請款日跟你請款。
kind: Service
apiVersion: v1
metadata:
name: lb-nginx
namespace: default
annotations:
# by default the type is elb (classic load balancer).
service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
# this setting is to make sure the source IP address is preserved.
externalTrafficPolicy: Local
type: LoadBalancer
selector:
app: nginx1-7
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
建完之後
就可以在瀏覽器上直接輸入ELB的domain name, 即可看到結果。
![](https://i.imgur.com/7woBXLY.png =500x)
當然你也可以自己建立外部的Load balancer, 這邊是幾個常用的服務,如果你只是單純要Serve網頁,可以選用nginx,但是大部分人都會整合公有雲來管理。
ExternalName type在kubernetes 1.7 版本有提供,但是要使用的朋友要注意kube-dns version要在1.14.9以上,不然會遇到Resolve External Name issue
使用場景通常有兩個:
這時候可以apply這樣的service:
kind: Service
apiVersion: v1
metadata:
name: externalname-nginx
namespace: default
spec:
type: ExternalName
externalName: cheddar.kube-system.svc.cluster.local
(K8s預設的CName,格式為${service name}.${namespace}.svc.cluster.local)
selector:
app: cheddar
執行完之後:
用dig指令就可以看到確實指到這個cheddar service
![](https://i.imgur.com/pe34Rhy.png =500x)
直接curl 這個CName可以get該Pods的內容
![](https://i.imgur.com/qN0iFvh.png =500x)
ExternalName其實就是在Cluster的DNS Server添加一筆CName Record, 而且跟其他Service Types不一樣的是,這個網路流量不透過Kube-proxy處理,而是透過Kube-dns。
嚴格上來講這應該算是ClusterIP的外部IP版,ExternalIPs不算在四種Types裡面。
你可以指定一個外部的IP, 只要這個IP可以連到K8s cluster, 就可以透過這個IP連到
Pods。
有興趣的人可以自己參考官方文件