k8s與雲伺服器之間服務互訪之節點網路打通

2022-07-05 00:24:11 字數 3428 閱讀 5703

一、概述

k8s暴露服務的方式有很多使用ingress、nodeport等,這模擬較適用於無狀態的服務,對於statefulset部署的有狀態的服務,(關於statefulset的介紹參考kubernetes的官網或參考我的由於statefulset使用的是headless service。是固定網路標示的,也就是服務的完整網域名稱是不會改變的。但是有兩個問題:

1、物理機在k8s集群的外面沒辦法解析k8s集群內部的網域名稱

2、解析網域名稱後網路不能通訊

二、物理網路與k8s集群打通

有了上面提出的兩個問題,我們先來簡單分析一下k8s的網路,我們使用的是calico-bgp+ipvs,所以這裡就以calico為例,calico為k8s提供了乙個網路空間,提供的位址池和k8s初始化時指定的pod-cidr是相同的。部署服務的時候會在位址池裡面為pod分配位址,比如設定的是192.168.0.0/16,首先是分配node節點,一般情況下calico會先給node節點隨機分配乙個網段,例如有個節點是node1 ,calico會分配乙個192.168.19.0網段,具體的子網掩碼(netmask)要看路由表在任意節點上執行(route -n)檢視。

檢視具體的分配,部署calico的時候選擇的是將資料儲存到etcd集群,所以也可以去etcd裡面產看:

# etcdctl get --prefix "

/calico

" --keys-only | grep

"ipam/v2/host

"/calico/ipam/v2/host/ku13-1/ipv4/block/192.244.190.128-26

/calico/ipam/v2/host/ku13-1/ipv4/block/192.244.190.192-26

/calico/ipam/v2/host/ku13-2/ipv4/block/192.244.32.0-26

/calico/ipam/v2/host/ku13-2/ipv4/block/192.244.32.64-26

/calico/ipam/v2/host/ku13-3/ipv4/block/192.244.6.192-26

/calico/ipam/v2/host/ku13-3/ipv4/block/192.244.7.0-26

/calico/ipam/v2/host/ku13-3/ipv4/block/192.244.7.64-26

/calico/ipam/v2/host/ku13-4/ipv4/block/192.244.70.0-26

還有乙個服務kube-proxy,這個服務負責node之間的網路通訊,重新整理ipvs列表。具體的calico和kube-proxy工作詳情這裡不做詳解。

我們了解到要想解決我們上面提出的兩個問題,我們需要將kubernets裡面的coredns服務拿出來,為物理機提供dns解析、然後需要將物理機與k8s集群網路打通。接下來我們解決這兩個問題:

解決第乙個問題也需要以第二個問題為前提,所以我們只需要解決了第二個問題,第乙個問題只需要在物理機上面的/etc/resolv.conf新增一條nameserver記錄。

解決第二個問題:網路打通

打通網路我們需要兩個工具:calico、kube-proxy

我們之前的集群都是使用kubeadm部署的,所以我們可以很簡單實現這兩個服務的部署,如果不是使用kubeadm部署的集群可以參考網上這個服務的部署,本文不做介紹。主要介紹kubeadm部署的實現。

我們準備乙個伺服器,上面需要部署kubeadm、docker具體的準備參考之前的集群初始化,我們將新伺服器以node節點的形式加入到集群裡面,使用kubeadm join很方便的將伺服器加入到現有的k8s集群裡面,這個伺服器只需要分配很小的資源,因為這個上面不會部署任何服務,只有kubeadm join時部署的calico-node、kube-proxy。

新增節點參考:

節點成功加入集群後還要執行乙個操作,就是設定節點不能被排程:

kubctl  drain  [node-name]  --ignore-daemonsets
2、生成路由規則

在上面新部署的伺服器上面有到k8s集群的所有路由,我們將這些路由進行提取生成乙個路由表給物理機使用,將所有路由設定成預設路由,都經過上面新加伺服器的ip。

為了方便使用我寫了乙個生成指令碼,此指令碼在gateway節點即上面新加的節點上面執行:

#cat generate-rule

#!/bin/bash

route -n | grep ug | grep -v ^0 | awk

'' >a.txt

ip=`ip a | grep eth0 | grep inet |awk -f '/'

''|awk''

`service_net="192.96.0.0"

service_mask="255.255.0.0"

#判斷route.rule檔案是否存在

if [ -f route.rule ];then

>route.rule

fi

#生成route.rule檔案
#新增coredns的路由

echo "route add -net $service_net netmask $service_mask gw $ip" >route.rule

while

read nt mk

doecho

"route add -net $nt netmask $mk gw $ip

" >>route.rule

done

#刪除臨時檔案

rm -rf a.txt

service_net是k8s service的網段,即coredns的service ip所在的網段,service_mask是k8s service的子網掩碼,這個在使用kubeadm初始化的時候就指定了,我們使用的是:

podsubnet: 192.244.0.0/16

servicesubnet:

192.96.0.0/16

將service_net、service_mask換成自己的。

然後將生成的檔案copy到物理機上,然後執行:

sh  route.rule
在物理機上面在/etc/resolv.conf裡面新增coredns的service的ip,service名稱是kube-dns,在任意master節點上檢視:

kubectl get svc -n kube-system | grep kube-dns

kube-dns         clusterip   192.96.0.10

53/udp,53/tcp 7d8h

nameserver 192.96.0.10

在物理機上面測試連通性:

搭建k8s的伺服器硬體選型

前言 為了能夠搭建高效 穩定 安全的k8s高可用系統,需對伺服器各項要素,進行周到的考慮 集群規劃 建立k8s集群時,不宜使用多而小的伺服器資源,有如下弊端 使用大規格ecs的優勢 選擇master節點規格 通過容器服務建立的kubernetes集群,master節點上執行著etcd kube ap...

K8S部署DNS服務

root hdss7 11 yum install y bind root hdss7 11 rpm qa bind bind 9.11.4 16.p2.el7 8.6.x86 64 13 listen on port 53 監聽本機ip 14 listen on v6 port 53 刪除,不監聽...

K8S 服務編排YAML

yaml 是一種簡潔的非標記語言。語法格式 在k8s部署乙個應用的yaml內容大致分為兩部分 控制器定義 定義控制器屬性 被控制物件 pod模板,定義容器屬性 具體字段意義 apiversion api版本 kind 資源型別 metadata 資源元資料 spec 資源規格 replicas 副本...