Kubernetes 驗(yàn)證IPv4/IPv6雙協(xié)議棧

2022-06-20 10:04 更新

驗(yàn)證 IPv4/IPv6 雙協(xié)議棧

本文分享了如何驗(yàn)證 IPv4/IPv6 雙協(xié)議棧的 Kubernetes 集群。

在開始之前

  • 提供程序?qū)﹄p協(xié)議棧網(wǎng)絡(luò)的支持 (云供應(yīng)商或其他方式必須能夠?yàn)?nbsp;Kubernetes 節(jié)點(diǎn) 提供可路由的 IPv4/IPv6 網(wǎng)絡(luò)接口)
  • 一個能夠支持雙協(xié)議棧的 網(wǎng)絡(luò)插件。
  • 啟用雙協(xié)議棧 集群

您的 Kubernetes 服務(wù)器版本必須不低于版本 v1.23. 要獲知版本信息,請輸入 ?kubectl version?。

說明: 雖然你可以使用較早的版本進(jìn)行驗(yàn)證,但該功能是從 v1.23 版本進(jìn)入 GA 狀態(tài)并正式支持的。

驗(yàn)證尋址

驗(yàn)證節(jié)點(diǎn)尋址

每個雙協(xié)議棧節(jié)點(diǎn)應(yīng)分配一個 IPv4 塊和一個 IPv6 塊。 通過運(yùn)行以下命令來驗(yàn)證是否配置了 IPv4/IPv6 Pod 地址范圍。 將示例節(jié)點(diǎn)名稱替換為集群中的有效雙協(xié)議棧節(jié)點(diǎn)。 在此示例中,節(jié)點(diǎn)的名稱為 ?k8s-linuxpool1-34450317-0?:

kubectl get nodes k8s-linuxpool1-34450317-0 -o go-template --template='{{range .spec.podCIDRs}}{{printf "%s\n" .}}{{end}}'
10.244.1.0/24
a00:100::/24

應(yīng)該分配一個 IPv4 塊和一個 IPv6 塊。

驗(yàn)證節(jié)點(diǎn)是否檢測到 IPv4 和 IPv6 接口。用集群中的有效節(jié)點(diǎn)替換節(jié)點(diǎn)名稱。 在此示例中,節(jié)點(diǎn)名稱為 ?k8s-linuxpool1-34450317-0?:

kubectl get nodes k8s-linuxpool1-34450317-0 -o go-template --template='{{range .status.addresses}}{{printf "%s: %s \n" .type .address}}{{end}}'
Hostname: k8s-linuxpool1-34450317-0
InternalIP: 10.240.0.5
InternalIP: 2001:1234:5678:9abc::5

驗(yàn)證 Pod 尋址 

驗(yàn)證 Pod 已分配了 IPv4 和 IPv6 地址。用集群中的有效 Pod 替換 Pod 名稱。 在此示例中,Pod 名稱為 ?pod01?:

kubectl get pods pod01 -o go-template --template='{{range .status.podIPs}}{{printf "%s \n" .ip}}{{end}}'
10.244.1.4
a00:100::4

你也可以通過 ?status.podIPs? 使用 Downward API 驗(yàn)證 Pod IP。 以下代碼段演示了如何通過容器內(nèi)稱為 ?MY_POD_IPS ?的環(huán)境變量公開 Pod 的 IP 地址。

env:
- name: MY_POD_IPS
  valueFrom:
    fieldRef:
      fieldPath: status.podIPs

使用以下命令打印出容器內(nèi)部 ?MY_POD_IPS ?環(huán)境變量的值。 該值是一個逗號分隔的列表,與 Pod 的 IPv4 和 IPv6 地址相對應(yīng)。

kubectl exec -it pod01 -- set | grep MY_POD_IPS
MY_POD_IPS=10.244.1.4,a00:100::4

Pod 的 IP 地址也將被寫入容器內(nèi)的 ?/etc/hosts? 文件中。 在雙棧 Pod 上執(zhí)行 cat ?/etc/hosts? 命令操作。 從輸出結(jié)果中,你可以驗(yàn)證 Pod 的 IPv4 和 IPv6 地址。

kubectl exec -it pod01 -- cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
fe00::0    ip6-mcastprefix
fe00::1    ip6-allnodes
fe00::2    ip6-allrouters
10.244.1.4    pod01
a00:100::4    pod01

驗(yàn)證服務(wù)

創(chuàng)建以下未顯式定義 ?.spec.ipFamilyPolicy? 的 Service。 Kubernetes 將從首個配置的 ?service-cluster-ip-range? 給 Service 分配集群 IP, 并將 ?.spec.ipFamilyPolicy? 設(shè)置為 ?SingleStack?。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: MyApp
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80

使用 ?kubectl ?查看 Service 的 YAML 定義。

kubectl get svc my-service -o yaml

該 Service 通過在 kube-controller-manager 的 ?--service-cluster-ip-range? 標(biāo)志設(shè)置的第一個配置范圍,將 ?.spec.ipFamilyPolicy? 設(shè)置為 ?SingleStack?, 將 ?.spec.clusterIP? 設(shè)置為 IPv4 地址。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  clusterIP: 10.0.217.164
  clusterIPs:
  - 10.0.217.164
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 80
    protocol: TCP
    targetPort: 9376
  selector:
    app: MyApp
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

創(chuàng)建以下顯示定義 ?.spec.ipFamilies? 數(shù)組中的第一個元素為 IPv6 的 Service。 Kubernetes 將 ?service-cluster-ip-range? 配置的 IPv6 地址范圍給 Service 分配集群 IP, 并將 ?.spec.ipFamilyPolicy? 設(shè)置為 ?SingleStack?。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: MyApp
spec:
  ipFamilies:
  - IPv6
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80

使用 ?kubectl ?查看 Service 的 YAML 定義。

kubectl get svc my-service -o yaml

該 Service 通過在 kube-controller-manager 的 ?--service-cluster-ip-range? 標(biāo)志設(shè)置的 IPv6 地址范圍,將 ?.spec.ipFamilyPolicy? 設(shè)置為 ?SingleStack?, 將 ?.spec.clusterIP? 設(shè)置為 IPv6 地址。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: MyApp
  name: my-service
spec:
  clusterIP: fd00::5118
  clusterIPs:
  - fd00::5118
  ipFamilies:
  - IPv6
  ipFamilyPolicy: SingleStack
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: MyApp
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

創(chuàng)建以下顯式定義 ?.spec.ipFamilyPolicy? 為 ?PreferDualStack ?的 Service。 Kubernetes 將分配 IPv4 和 IPv6 地址(因?yàn)樵摷簡⒂昧穗p棧), 并根據(jù) ?.spec.ipFamilies? 數(shù)組中第一個元素的地址族, 從 ?.spec.ClusterIPs? 列表中選擇 ?.spec.ClusterIP?。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: MyApp
spec:
  ipFamilyPolicy: PreferDualStack
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80

說明:

?kubectl get svc? 命令將僅在 ?CLUSTER-IP? 字段中顯示主 IP。

kubectl get svc -l app=MyApp

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
my-service   ClusterIP   fe80:20d::d06b   <none>        80/TCP    9s

使用 ?kubectl describe? 驗(yàn)證服務(wù)是否從 IPv4 和 IPv6 地址塊中獲取了集群 IP。 然后你就可以通過 IP 和端口,驗(yàn)證對服務(wù)的訪問。

kubectl describe svc -l app=MyApp
Name:              my-service
Namespace:         default
Labels:            app=MyApp
Annotations:       <none>
Selector:          app=MyApp
Type:              ClusterIP
IP Family Policy:  PreferDualStack
IP Families:       IPv4,IPv6
IP:                10.0.216.242
IPs:               10.0.216.242,fd00::af55
Port:              <unset>  80/TCP
TargetPort:        9376/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

創(chuàng)建雙協(xié)議棧負(fù)載均衡服務(wù) 

如果云提供商支持配置啟用 IPv6 的外部負(fù)載均衡器,則創(chuàng)建如下 Service 時將 ?.spec.ipFamilyPolicy? 設(shè)置為 ?PreferDualStack?, 并將 ?spec.ipFamilies? 字段 的第一個元素設(shè)置為 ?IPv6?,將 ?type ?字段設(shè)置為 ?LoadBalancer?:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: MyApp
spec:
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
  - IPv6
  type: LoadBalancer
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80

檢查服務(wù):

kubectl get svc -l app=MyApp

驗(yàn)證服務(wù)是否從 IPv6 地址塊中接收到 ?CLUSTER-IP? 地址以及 ?EXTERNAL-IP?。 然后,你可以通過 IP 和端口驗(yàn)證對服務(wù)的訪問。

NAME         TYPE           CLUSTER-IP   EXTERNAL-IP        PORT(S)        AGE
my-service   LoadBalancer   fd00::7ebc   2603:1030:805::5   80:30790/TCP   35s


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號