# K8s 服務對外的四種方式


# 前言

剛開始學習 K8s 的時候,你通常會開始寫第一個 Pod 的 YAML 檔案,然而 Pod 裡面的 Service 即便描述了 Port Number 外界還是無法存取 Pod 內的 Service,通常在學習初期會使用 port-forward 的指令來暫時性的將服務對外,那在其他環境中不會用 port-forward,那我們來看看還有哪些方式可以將服務對外出去!


# HostNetwork

與 Docker Network 的 Host mode 相同,直接掛載機器上的網路與 Port

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
hostNetwork: true
containers:
- name: nginx
image: nginx

Get Pod 會看到部屬機器網路的 Pod 端口
當部屬主機 IP 變更 Pod 也需要重啟


# NodePort

指定 Port 對外但是 IP 是根據節點所定
等同使用 Cluster IP,不管 Service 是在哪一個 Node 啟動都不會受到影響,基本上 K8s 都是使用 Cluster IP 進行存取,若想要對外需要額外設定 NodePort

1
2
3
4
5
6
7
8
9
10
11
kind: Service
apiVersion: v1
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 8086
nodePort: 30000
selector:
name: nginx

# LoadBalancer

僅能設定在 Service

1
2
3
4
5
6
7
8
9
10
kind: Service
apiVersion: v1
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- port: 8086
selector:
name: nginx

Service 部屬完成就可以透過 對外 IP + port 進行訪問


# Ingress

Ingress 是由 K8s 所管理的負載平衡器,當重啟會自動套用新的網路設定

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
spec:
rules:
- host: nginx.a.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 8086

# 參考資料

  • kubernetes 的暴露 pod 对外访问的方式
更新於