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

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

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

一、Kubernetes集羣聯邦介紹

1、管理多個kubernetes集羣

「集羣聯邦」在架構上同kubernetes集羣很相似。有一個「集羣聯邦」的API server提供一個標準的Kubernetes API,並且通過etcd來存儲狀態。不同的是,一個通常的Kubernetes只是管理節點計算,而「集羣聯邦」管理所有的kubernetes集羣。

2、跨集羣服務發現

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

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

3、跨集羣調度

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

通過跨集羣調度,我們可以:

  • 跨kubernetes集羣均勻的調度任務負載
  • 將各個kubernetes集羣的工作負載進行最大化,如果當前kubernetes集羣超出了承受能力,那麼將額外的工作負載路由到另一個比較空閒的kubernetes集羣中
  • 根據應用地理區域需求,調度工作負載到不同的kubernetes集羣中,對於不同的終端用戶,提供更高的帶寬和更低的延遲。

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

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

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

1、系統環境及初始化

1.1 系統環境

功能組件 系統組件 系統版本 推薦配置 設備數量 備註
聯邦集羣控制平面 K8S+Federation CentOS 7.2 4核/8G/80G 2臺 聯邦集羣控制平面
K8s集羣01 Kubernetes master+node CentOS 7.2 4核/8G/80G 2臺 聯邦集羣節點
K8s集羣02 Kubernetes master+node CentOS 7.2 4核/8G/80G 2臺 聯邦集羣節點

1.2 安裝前準備

1.2.1 準備kubernetes組件鏡像

Kubernetes1.7版本的集羣與聯邦集羣功能的安裝方式均爲鏡像安裝,所有組件功能都使用官方提供的鏡像來實現,由於官方鏡像國內無法正常下載,需要提前準備好鏡像或科學上。

網,具體鏡像列表如下

序號 Kubernetes鏡像 版本
1 gcr.io/google_containers/kube-proxy-amd64 v1.7.0
2 gcr.io/google_containers/kube-apiserver-amd64 v1.7.0
3 gcr.io/google_containers/kube-controller-manager-amd64 v1.7.0
4 gcr.io/google_containers/kube-scheduler-amd64 v1.7.0
5 gcr.io/google_containers/kube-aggregator v1.7.0
6 gcr.io/google_containers/k8s-dns-sidecar-amd64 1.14.4
7 gcr.io/google_containers/k8s-dns-kube-dns-amd64 1.14.4
8 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64 1.14.4
9 gcr.io/google_containers/etcd-amd64 3.0.17
10 quay.io/coreos/flannel v0.7.1-amd64
11 gcr.io/google_containers/pause-amd64 3.0
聯邦集羣鏡像
1 gcr.io/google_containers/hyperkube-amd64 v1.7.0
2 docker.io/coredns/coredns 006
3 gcr.io/kubernetes-helm/tiller v2.1.3

 1.2.2 安裝Docker 1.12

Kubernetes 1.7還沒有針對docker 1.13上做測試和驗證,所以這裏安裝Kubernetes官方推薦的Docker 1.12版本。

1.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

  1.2.4 安裝Kuberadm與Kubelet

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

在每個節點安裝kubeadm和kubelet:

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

安裝完成後初始化環境準備完成。

2、安裝kubernetes集羣

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

   2.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

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

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

此時kubectl命令在master node上就好用了,查看一下當前機器中的Node:

kubectl get nodes
  NAME      STATUS     AGE       VERSION
  node0     Ready     3m         v1.7.0

 2.2 安裝Pod網絡組件

接下來安裝flannel network add-on:

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" ]   //改爲本機網卡名稱

部署網絡組件:

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.1安裝前配置修改

修改前先停止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.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"NodePort"
middleware:
  kubernetes:
    enabled: false
  etcd:
    enabled: true
    zones:
    - "example.com."
    endpoint: "http://192.168.5.13:2379"
EOF

初始化helm,並使用helm安裝coredns組件

helm init
helm install --namespace default --name coredns -f /opt/Values.yaml stable/coredns

新建coredns配置文件

vi /root/coredns-provider.conf
[Global]
etcd-endpoints = http://192.168.0.51:2379
zones = example.com.

3.3添加kubernetes從節點

在kubernetes工作節點上初始安裝後執行以下命令

kubeadm join --token e7986d.e440de5882342711 192.168.5.13:6443

在master節點查看節點狀態

kubectl get nodes

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

3.4初始化聯邦集羣

kubefed init fellowship \
    --host-cluster-context=kubernetes-[email protected] \
    --dns-provider="coredns" \
    --dns-zone-name="example.com." \
    --
相關文章
相關標籤/搜索