Kubernetes使用集羣聯邦實現多集羣管理

 

    Kubernetes在1.3版本以後,增長了「集羣聯邦」Federation的功能。這個功能使企業可以快速有效的、低成本的跨區跨域、甚至在不一樣的雲平臺上運行集羣。這個功能能夠按照地理位置建立一個複製機制,將多個kubernetes集羣進行復制,即便遇到某個區域鏈接中斷或某個數據中心故障,也會保持最關鍵的服務運行。在1.7版之後支持本地多個集羣聯邦管理,不須要使用依賴雲平臺。node

1         Kubernetes聯邦介紹 

1.1         管理多個kubernetes集羣

 「集羣聯邦」在架構上同kubernetes集羣很類似。有一個「集羣聯邦」的API server提供一個標準的Kubernetes API,而且經過etcd來存儲狀態。不一樣的是,一個一般的Kubernetes只是管理節點計算,而「集羣聯邦」管理全部的kubernetes集羣。mysql

 

 

1.2     跨集羣服務發現

      Kubernetes有一個標準的插件:kube-dns,這個插件能夠在集羣內部提供DNS服務,經過DNS解析service名字來訪問kubernetes服務。Kubernetes服務是由一組kubernetesPOD組成的,這些POD是一些已經容器化了的應用,這些POD前面使用到了負載均衡器。假如咱們有一個kubernetes集羣,這個集羣裡面有一個服務叫作mysql,這個服務是由一組mysql POD組成的。在這個kubernetes集羣中,其餘應用能夠經過DNS來訪問這個mysql服務。linux

      集羣聯邦federation/v1beta1 API擴展基於DNS服務發現的功能。利用DNS,讓POD能夠跨集羣、透明的解析服務。git

 

 

1.3     跨集羣調度

     爲了追求高可用性和更高的性能,集羣聯邦可以把不一樣POD指定給不一樣的Kubernetes集羣中。集羣聯邦調度器將決定如何在不一樣kubernetes集羣中分配工做負載。github

 

經過跨集羣調度,咱們能夠:sql

l 跨kubernetes集羣均勻的調度任務負載docker

l 將各個kubernetes集羣的工做負載進行最大化,若是當前kubernetes集羣超出了承受能力,那麼將額外的工做負載路由到另外一個比較空閒的kubernetes集羣中api

l 根據應用地理區域需求,調度工做負載到不一樣的kubernetes集羣中,對於不一樣的終端用戶,提供更高的帶寬和更低的延遲。跨域

1.4     集羣高可用,故障自動遷移

     集羣聯邦能夠跨集羣冗餘部署,當某個集羣所在區域出現故障時,並不影響整個服務。集羣聯邦還能夠檢測集羣是否爲不可用狀態,若是發現某個集羣爲不可用狀態時,能夠將失敗的任務從新分配給集羣聯邦中其餘可用狀態的集羣上。tomcat

 

2         Kubernetes使用集羣聯邦實現多集羣管理

2.1     系統環境及初始化

 

 

2.2     安裝前準備

2.2.1      準備kubernetes組件鏡像

   Kubernetes1.7版本的集羣與聯邦集羣功能的安裝方式均爲鏡像安裝,全部組件功能都使用官方提供的鏡像來實現,因爲官方鏡像國內沒法正常下載,須要提早準備好鏡像或***。

具體鏡像列表以下:

 

 

2.2.2      安裝Docker 1.12

 Kubernetes 1.7尚未針對docker 1.13上作測試和驗證,因此這裏安裝Kubernetes官方推薦的Docker 1.12版本。

 

2.2.3      修改系統配置

建立/etc/sysctl.d/k8s.conf文件,添加以下內容:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

執行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。

 

在/etc/hostname中修改各節點的hostname,在/etc/hosts設置hostname對應ip:

192.168.5.13 test01.example.com

192.168.5.14 test02.example.com

 

關閉防火牆服務與禁用開機啓動項

systemctl stop firewalld

systemctl disable firewalld

 

關閉SELINUX選項

setenforce 0 

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'/etc/sysconfig/selinux

 

2.2.4      安裝Kuberadm與Kubelet

注意:該yum源須要科學才能正常安裝

在每一個節點安裝kubeadm和kubelet,首先是添加kubernetes的YUM源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg

       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

EOF

 

安裝kubeadm, kubelet, kubectl, kubernets-cni

yum install -y kubelet kubeadm kubectl kubernetes-cni

 

kubelet服務設置開機啓動

systemctl enable kubelet.service

 

以上安裝完成後,初始化環境的準備就完成了。

 

3         安裝kubernetes集羣

首先在一個節點上安裝kubernetes做爲master節點,將master節點參與集羣調度.而後在該節點上安裝聯邦集羣功能,做爲聯邦集羣的控制平面。

 

3.1      初始化集羣

使用kubeadm初始化集羣,選擇node1做爲Master

在node1上執行下面的命令:

注:由於咱們選擇flannel做爲Pod網絡插件,因此命令指定--pod-network-cidr=10.240.0.0/16

kubeadm init --kubernetes-version=v1.7.0 --pod-network-cidr=10.240.0.0/16 --apiserver-advertise-address=192.168.5.13

 

kubeadm init執行成功後輸出下面的信息:

You can now join any number of machines by running the following on each node

as root:

kubeadm join --token e7986d.e440de5882342711 192.168.5.13:6443

請保存好kubeadm join 的信息,後續節點加入集羣須要使用該命令.

 

爲了使用kubectl訪問apiserver,在~/.bash_profile中追加下面的環境變量:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

source /etc/profile

 

此時kubectl命令在master node上就能夠用了,查看一下當前機器中的Node,看到node0狀態爲Ready:

kubectl get nodes

  NAME      STATUS     AGE       VERSION

  node0     Ready     3m         v1.7.0

 

3.2      安裝Pod網絡組件

     接下來安裝flannel network add-on,首先下載須要的yaml文件:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml 

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 

目前須要在kube-flannel.yml中使用--iface參數指定集羣主機內網網卡的名稱,不然可能會出現dns沒法解析。須要將kube-flannel.yml下載到本地,flanneld啓動參數加上--iface=<iface-name>

vi kube-flannel.yml

   command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ]   //--iface=eth1

改成本機網卡名稱

 

部署網絡組件:

kubectl create -f kube-flannel-rbac.yml

kubectl apply -f kube-flannel.yml

 

確保全部的Pod都處於Running狀態。

kubectl get pod --all-namespaces -o wide

以下圖:

 

 

 

使用下面的命令使Master Node參與工做負載:

kubectl taint nodes --all  node-role.kubernetes.io/master-

3.3     安裝聯邦集羣組件

3.3.1       安裝前配置修改

   修改etcd與apiserver的監聽端口,修改前先中止kubelet服務

vi /etc/kubernetes/manifests/etcd.yaml

   - --listen-client-urls=http://0.0.0.0:2379

   - --advertise-client-urls=http://0.0.0.0:2379

 

vi /etc/kubernetes/manifests/kube-apiserver.yaml

   - --insecure-port=8080

   - --insecure-bind-address=0.0.0.0

 

重啓kubelet服務讓etcd與apiserver監聽端口生效

systemctl restart kubelet

 

3.3.2       安裝helm工具部署Coredns

curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh

chmod 700 get_helm.sh

./get_helm.sh

 

修改RBAC臨時訪問權限(這是比較關鍵的地方,沒有這步後面會失敗)

kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default

 

建立coredns鍵值文件

cat <<EOF > /opt/Values.yaml

isClusterService: false

serviceType: "NodePort"

middleware:

  kubernetes:

    enabled: false

  etcd:

    enabled: true

    zones:

    - "example.com."

    endpoint: "http://192.168.5.13:2379"

EOF

 

新建coredns配置文件

vi /root/coredns-provider.conf

[Global]

etcd-endpoints = http://192.168.0.51:2379

zones = example.com.

3.3.3       添加kubernetes從節點

在kubernetes工做節點上初始安裝後執行如下命令,就能夠加入集羣

kubeadm join --token e7986d.e440de5882342711 192.168.5.13:6443

在master節點查看節點狀態,添加以後能夠在master上執行這個查看是否添加成功

kubectl get nodes

重複上述步驟建立多個kubernetes集羣,爲聯邦集羣添加集羣節點作準備。

 

3.3.4       初始化聯邦集羣

執行這個進行聯邦的初始化,在控制平面的master節點上執行:

 

kubefed init fellowship \

    --host-cluster-context=kubernetes-admin@kubernetes \

    --dns-provider="coredns" \

    --dns-zone-name="example.com." \

    --dns-provider-config="/root/coredns-provider.conf" \

    --apiserver-enable-basic-auth=true \

    --apiserver-enable-token-auth=true \

    --apiserver-arg-overrides="--anonymous-auth=false,--v=4" \

    --api-server-service-type="NodePort" \

    --api-server-advertise-address="192.168.5.13" \

--etcd-persistent-storage=false

初始化完成後集羣聯邦會在federation-system命名空間中建立兩個POD

 

 

 

3.3.5       其餘kubernetes集羣加入聯邦集羣

選擇集羣的context

kubectl config use-context fellowship   //fellowship爲聯邦初始化時建立的名稱

添加聯邦集羣文件

集羣1

cat /home/tmp/c1.yaml 

   apiVersion: federation/v1beta1

   kind: Cluster

   metadata:

 name: c1

   spec:

 serverAddressByClientCIDRs:

 - clientCIDR: 0.0.0.0/0

   serverAddress: http://192.168.15.53:8080

 

集羣2

   cat /home/tmp/c2.yaml 

   apiVersion: federation/v1beta1

   kind: Cluster

   metadata:

 name: c2

   spec:

serverAddressByClientCIDRs:

- clientCIDR: 0.0.0.0/0

  serverAddress: http://192.168.8.12:8080

 

執行添加這2個集羣到聯邦

kubectl create -f c1.yaml

kubectl create -f c2.yaml

 

查看聯邦集羣狀態,狀態爲Ready就是成功了。

[root@test01 ~]# kubectl get cluster

NAME      STATUS     AGE

c1        Ready      2d

c2        Ready      2d

 

3.3.6       經過聯邦集羣部署應用

經過聯邦集羣部署應用,須要在聯邦集羣控制平面的節點上,切換到聯邦的context

kubectl config use-context fellowship   //fellowship爲聯邦初始化時建立的名稱

 

配置應用在分佈在2個集羣中:

vi tomcat.yaml

apiVersion: exensions/v1beta1

kind: ReplicaSet

metadata:

  name: tomcat

  lables:

    app: tomcat

  annotaions:

    federation.kubernetes.io/replica-set-preferences:

        {

       "rebalance": true,

       "clusters": {

          "c1": {

      "weight": 1

   },

          "c2": {

      "weight": 1

   }

    }

}

spec:

  replicas: 4

  template:

    metadata:

      labels:

        #region: tomcat

app: tomcat

    spec:

      containers:

        - name: fed-tomcat

  image: 192.168.18.250:5002/admin/tomcat:v0.0.5

  resourcces:

    requests:

      cpu: 200M

      memory: 500Mi

  ports:

  - containerPort: 80

 

經過以上編排建立應用在聯邦,應用的4個實例按比例分佈到2個集羣中

 

 

目前集羣聯邦只支持如下幾種類型資源的建立:

Cluster

ConfigMap

DaemonSets

Deployment

Events

Ingress

Namespaces

ReplicaSets

Secrets

Services

 

4         Q&A

Q:node機器推薦命名規則與生成使用經驗

A:推薦使用「地理位置+機房編號+機櫃號+應用名稱」的縮寫字母來命名,這樣便於運維人員後續的管理和維護。

 

Q:爲何要修改etcd與apiserver的監聽端口?

A:修改etcd監聽IP爲0.0.0.0是爲了防止出現監聽了lo網卡的127.0.0.1的IP,出現不能鏈接的狀況。apiserver則是開啓8080端口用於接收http請求,這樣是爲了測試時方便不用使用CA證書認證。

 

Q:請問docker 源怎麼弄,國內通常很差鏈接,下載不了?另外還有1.6要升級到1.7怎麼作?

A:建議使用***方式,這樣就不須要改動配置。1.6升級到1.7,先中止kubelet服務,而後下載1.7版本的kubernetes-server-linux-amd64.tar.gz包,解壓替換/usr/bin目錄下的同名文件,而後再把kubelet服務啓動

 

Q:在聯邦集羣中部署服務,能夠將服務只部署在一個集羣中麼?

A:能夠只部署服務在一個集羣中,經過編排文件中federation.kubernetes.io/replica-set-preference來控制副本分佈在哪一個集羣。

 

Q:聯邦集羣的幾個組件如今有支持高可用麼?沒有的話,咱們應該怎麼避免聯邦組件的bug致使的服務不可用?

A:聯邦集羣的Federation組目錄沒有支持高可用,但聯邦功能主要是爲了調度管理k8s集羣的,因此聯邦集羣Federation組件出現故障時並不會直接影響到下面各個集羣自身的已經在運行的服務。

相關文章
相關標籤/搜索