Skip to content

Latest commit

 

History

History
261 lines (194 loc) · 9.65 KB

README0.2-zh-hk.md

File metadata and controls

261 lines (194 loc) · 9.65 KB

Kube-ipam基於etcd分佈式存儲實現kubernetes動態IP網絡分配管理,確保集羣中IP地址的唯一性。 Kube-ipam支持給kubernetes集羣中的Pod固定IP地址,同時支持resolv.conf的DNS配寘。


kube-ipam


English Documents | 繁體中文檔案 | 简体中文文档 | 日本語の文書



[1] 概述

一些場景往往對IP地址有依賴,需要使用固定IP地址的Pod,可以使用kube-ipam輕鬆解决這類問題。 例如,mysql主從架構的時候,主database與從database之間的同步; 例如keepalived做集羣HA的時候,兩個節點之間檢測通信等; 例如某些安全防護設備,需要基於IP地址進行網路安全訪問策略限制的場景等。

kube-ipam


Kube-ipam基於etcd分佈式存儲實現kubernetes動態IP網絡分配管理,確保kubernetes集羣中的Pod擁有固定的IP地址。 在使用kube-ipam配寘之後,上圖中的fixed-ip Pod在銷毀重建之後仍然可以保持原有IP地址的固定不變。



[2] 安裝kube-ipam

啟用與配寘CNI路徑

請確保你的kubelet正確的配寘了network-plugincni-conf-dircni-bin-dir參數。 下麵給出一個kubelet的配寘示例供你參攷:

# cat /etc/systemd/system/kubelet.service
…
ExecStart=/usr/local/bin/kubelet \
…
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin/ \
…

獲取和安裝kube-ipam

你可以通過下載編譯獲得kube-ipam的二進位檔案,然後將kube-ipam的二進位檔案拷貝到kubernetes node主機的/opt/cni/bin/目錄中。

# wget https://github.com/cloudnativer/kube-ipam/releases/download/v0.2.0/kube-ipam-v0.2.0-x86.tgz
# tar -zxvf kube-ipam-v0.2.0-x86.tgz
# mv kube-ipam-v0.2.0-x86/kube-ipam /opt/cni/bin/kube-ipam


[3] /etc/cni/net.d配寘

3.1 子網和etcd配寘

你可以通過subnet參數設置IP子網資訊,通過gateway設定閘道資訊。 你可以通過etcdConfig配寘etcd的證書和endpoint地址。

編輯所有kubernetes node主機的/etc/cni/net.d/1-kube-ipam.conf檔案。

# cat /etc/cni/net.d/1-kube-ipam.conf
{
        "cniVersion":"0.3.1",
        "name": "k8snetwork",
        "type": "macvlan",
        "master": "eth0",
        "ipam": {
                "name": "kube-subnet",
                "type": "kube-ipam",
		"kubeConfig": "/etc/kubernetes/pki/kubectl.kubeconfig"
                "etcdConfig": {
                        "etcdURL": "https://192.168.1.50:2379,https://192.168.1.58:2379,https://192.168.1.63:2379",
                        "etcdCertFile": "/etc/kubernetes/pki/etcd.pem",
                        "etcdKeyFile": "/etc/kubernetes/pki/etcd-key.pem",
                        "etcdTrustedCAFileFile": "/etc/kubernetes/pki/ca.pem"
                },
                "subnet": "10.188.0.0/16",
		"fixedStart": "10.188.0.10",
		"fixedEnd": "10.188.0.255",
                "rangeStart": "10.188.1.0",
                "rangeEnd": "10.188.255.254",
                "gateway": "10.188.0.1",
                "routes": [{
                        "dst": "0.0.0.0/0"
                }],
                "resolvConf": "/etc/resolv.conf"
        }
}

3.2 配寘參數說明

  • type(string,required):填寫CNI挿件的類型,例如macvlan、ipvlan、kube-router、bridge、calico等(還可以與Multus結合支持更多CNI挿件)。
  • routes(string,optional):要添加到容器命名空間的路由清單。 每個路由都是一個帶有“dst”和可選“gw”欄位。 如果省略“gw”,將使用“閘道”的值。
  • resolvConf(string,optional):主機上要解析並作為DNS配寘返回的resolv. conf檔案路徑。
  • etcdConfig:etcd地址資訊的對象
    • etcdURL(string,required):etcd的endpoint URL地址。
    • etcdCertFile(string,required):etcd的cert檔案。
    • etcdKeyFile(string,required):etcd的key檔案。
    • etcdTrustedCAFileFile(string,required):etcd的ca檔案。
    • kubeConfig(string,required):kubernetes集羣的kubeconfig檔案。
  • ranges,(array,required,nonempty)an array of arrays of range objects:
    • subnet(string,required):要分配出去的CIDR塊。
    • rangeStart(string,optional):從subnet子網內開始分配的IP地址,默認為subnet子網段內的“.2”這個IP地址。
    • rangeEnd(string,optional):從subnet子網內結束分配的IP地址,默認為subnet子網段內的“.254”這個IP地址。
    • gateway(string,optional):從subnet子網內分配的閘道IP地址,默認為subnet子網段內的“.1”這個IP地址。

提示:ranges可以支持多個子網的配寘格式,詳見multiple-subnets檔案



[4] Kubernetes固定IP容器方法

4.1 固定IP地址配寘

pod IP地址的固定分配可以通過在pod的annotations中配寘kube-ipam.ipkube-ipam.netmaskkube-ipam.gateway參數來實現。
/etc/cni/net.d/1-kube-ipam.conf中,隨機IP地址的範圍在rangestartrangeend中設定。 沒有設定在rangestartrangeend中IP地址段,可以手工分配給固定IP的容器。
換句話說,如果你需要保持pod的IP地址固定不變,請不要將kube-ipam.ip的值設定在此rangestartrangeend範圍內。
新建一個fixed-ip-test-Deployment.yaml,用來創建一個固定IP的Pod:

# cat fixed-ip-test-Deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fixed-ip-test
  namespace: default
  labels:
    k8s-app: cloudnativer-test
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      k8s-app: cloudnativer-test
  template:
    metadata:
      labels:
        k8s-app: cloudnativer-test
      annotations:
        kube-ipam.ip: "10.188.0.216"
        kube-ipam.netmask: "255.255.0.0"
        kube-ipam.gateway: "10.188.0.1"
    spec:
      containers:
      - name: fixed-ip-test
        image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80  
---

在本例中,我們可以使用10.188.0.0/16網段中,除了10.188.0.10~10.188.0.200之外的IP地址來分配給Pod。
說明:如果想要創建隨機IP的Pod,只需要去掉annotations的kube-ipam.ipkube-ipam.netmaskkube-ipam.gateway配寘即可。

4.2 創建一個固定IP的Pod

使用kubectl apply -f命令來創建固定IP的Pod:

# kubectl apply -f fixed-ip-test-Deployment.yaml
#
# kubectl get pod -o wide
  NAME                             READY   STATUS    RESTARTS   AGE     IP             NODE   
  fixed-ip-test-6d9b74fd4d-dbbsd   1/1     Running   0          2d23h   10.188.0.216   192.168.20.21

現在,這個fixed-ip-test-6d9b74fd4d-dbbsd這個Pod就被分配了一個固定不變的IP地址(10.188.0.216)。

4.3 銷毀重建Pod,IP保持固定不變

例如我們使用kubectl delete命令來删除上面這個Pod,kubernetes會自動重建一個新的Pod:

# kubectl delete pod fixed-ip-test-6d9b74fd4d-dbbsd
#
# kubectl get pod -o wide
  NAME                             READY   STATUS    RESTARTS   AGE   IP             NODE   
  fixed-ip-test-6d9b74fd4d-xjhek   1/1     Running   0          1h    10.188.0.216   192.168.30.35

此時,新啟動的fixed-ip-test-6d9b74fd4d-xjhek這個Pod的IP地址依然是10.188.0.216。

這裡還有一篇關於在calicoCNI環境使用kube-ipam来固定容器IP的例子,請點擊這裡查看



[5] 查看日誌資訊

查看kubernetes node主機上的/var/log/kube-ipam.log檔案,可以獲取kube-ipam的系統日誌資訊。



[6] 分層網路安全架構


kube-ipam可以與Multus結合來進行組網,這樣可以支持更多的CNI挿件場景下的容器IP地址固定。例如,我們可以基於kube-ipamMultus實現Web和資料庫分層網路安全訪問架構,讓一個Pod同時支持隨機IP和固定IP等多個網路介面。 這樣的部署管道有利於安全人員把應用網絡和資料庫等多個網絡區域進行相互隔離,有效控制容器集羣網絡架構。


kube-ipam


上圖中顯示了每個Pod具有2個介面:eth0、net1。 eth0作為外界用戶訪問web pod的網路介面; 而net1是附加的容器網卡,作為web Pod到database Pod的內部網路通信。
用戶可以通過ingress或service來訪問到web服務。 web pod可以通過database區域網絡,訪問固定IP地址的database服務。 Database區域網絡的database Pod可以互相通過固定IP地址進行集羣的通信操作。 分層網路安全訪問架構的安裝與部署過程請點擊這裡查看



# [7] 歡迎提交Issues和PR

如果你在使用過程中遇到問題,可以點擊<a href=“ https://github.com/cloudnativer/kube-ipam/issues “> https://github.com/cloudnativer/kube-install/issues 向我們提交Issues,也可以Fork原始程式碼,然後嘗試修復BUG之後,向我們提交PR。

# git clone your-fork-code
# git checkout -b your-new-branch
# git commit -am "Fix bug or add some feature"
# git push origin your-new-branch

歡迎給我們提交Issues和PR。
謝謝每一位貢獻者!