簡體   English   中英

將外部IP分配給Kubernetes服務

[英]Assign External IP to a Kubernetes Service

編輯:我的設置的重點是實現(如果可能)以下內容:

  • 我有多個k8s節點
  • 當我聯系IP地址(來自我公司的網絡)時,它應該被路由到我的容器/ pod / service /中的任何一個。
  • 我應該能夠輕松設置IP(就像我的服務.yml定義)

我正在運行一個小的Kubernetes集群(用kubeadm構建),以評估我是否可以將Docker(舊)Swarm設置移動到k8s。 我絕對需要的功能是能夠為容器分配IP,就像我使用MacVlan一樣。

在我目前的docker設置中,我正在使用MacVlan將我公司網絡中的IP地址分配給某些容器,這樣我就可以直接到達(沒有反向代理),就像它是任何物理服務器一樣。 我正在努力實現與k8s類似的東西。

我發現:

  • 我必須使用服務
  • 我不能使用LoadBalancer類型,因為它僅適用於兼容的雲提供商(如GCE或AWS)。
  • 我應該使用ExternalIPs
  • Ingress Resources是某種反向代理?

我的yaml文件是:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
      name: nginx-deployment
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs: 
    - A.B.C.D

我跳的是我的服務將獲得IP ABCD(這是我公司的網絡之一)。 我的部署工作正常,因為我可以使用它的ClusterIP從k8s集群內部到達我的nginx容器。

我錯過了什么? 或者至少,我在哪里可以找到有關網絡流量的信息,以查看數據包是否即將到來?

編輯

$ kubectl get svc
NAME            CLUSTER-IP     EXTERNAL-IP       PORT(S)   AGE
kubernetes      10.96.0.1      <none>            443/TCP   6d
nginx-service   10.102.64.83   A.B.C.D           80/TCP    23h

謝謝。

如果這僅用於測試,那么試試吧

kubectl port-forward service/nginx-service 80:80

那么你也能

curl http://localhost:80

可以工作的解決方案(不僅用於測試, 雖然它有其缺點 )是將Pod設置為映射主機網絡,並將hostNetwork規范字段設置為true

這意味着您不需要服務來公開您的Pod,因為它總是可以通過單個端口(您在清單中指定的containerPort )在主機上訪問。 在這種情況下,無需保留DNS映射記錄。

這也意味着您只能在給定節點上運行此Pod的單個實例(談論缺點......)。 因此,它使它成為DaemonSet對象的良好候選者。

如果您的Pod仍然需要訪問/解析內部Kubernetes主機名,則需要將dnsPolicy規范字段設置為ClusterFirstWithNoHostNet 此設置將使您的pod能夠訪問K8S DNS服務。

例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx-reverse-proxy
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      tolerations:  # allow a Pod instance to run on Master - optional
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - image: nginx
        name: nginx
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443

編輯:感謝ingress-nginx文檔,我被放在這條軌道上

您可以只修補外部IP

CMD: $ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'

例如: - $ kubectl patch svc kubernetes -p '{"spec":{"externalIPs":["10.2.8.19"]}}'

首先運行此命令:

kubectl get -n namespace services

上面的命令將返回如下輸出:

 NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
backend   NodePort   10.100.44.154         <none>          9400:3003/TCP   13h   
frontend        NodePort   10.107.53.39     <none>        3000:30017/TCP   13h

從上面的輸出可以清楚地看出,外部IP尚未分配給服務。 要將外部IP分配給后端服務,請運行以下命令。

 kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

並將外部IP分配給前端服務運行此命令。

 kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

現在獲取命名空間服務以檢查外部IP分配:

kubectl get -n namespace services

我們得到這樣的輸出:

NAME     TYPE     CLUSTER-IP     EXTERNAL-IP    PORT(S)             AGE
backend  NodePort 10.100.44.154  192.168.0.194  9400:3003/TCP       13h
frontend NodePort 10.107.53.39   192.168.0.194  3000:30017/TCP      13h

干杯!!! 現在已分配Kubernetes外部IP。

你可以試試kube-keepalived-vip配置來路由流量。 https://github.com/kubernetes/contrib/tree/master/keepalived-vip

您可以嘗試在服務的yaml文件中添加“type:NodePort”,然后您將有一個端口通過Web瀏覽器或從外部訪問它。 對我而言,它有所幫助。

只需添加其他選項。

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --external-ip=1.1.1.1

我不知道在你的特定情況下是否有幫助,但我所做的(我在裸機群集上)是使用LoadBalancer並將loadBalancerIP以及externalIPs為我的服務器IP。

之后,正確的外部IP出現在負載均衡器上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM