1. 程式人生 > >Kubernetes的多叢集管理實踐

Kubernetes的多叢集管理實踐

?wxfrom=5&wx_lazy=1

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

Kubernetes叢集聯邦介紹

?wxfrom=5&wx_lazy=1

1、管理多個Kubernetes叢集

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

?wxfrom=5&wx_lazy=1

2、跨叢集服務發現

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

叢集聯邦federation/v1beta1API擴充套件基於DNS服務發現的功能。利用DNS,讓POD可以跨叢集、透明的解析服務。

?

3、跨叢集排程

為了追求高可用性和更高的效能,叢集聯邦能夠把不同POD指定給不同的Kubernetes叢集中。叢集聯邦排程器將決定如何在不同Kubernetes叢集中分配工作負載。

通過跨叢集排程,我們可以:

  • 跨Kubernetes叢集均勻的排程任務負載。

  • 將各個Kubernetes叢集的工作負載進行最大化,如果當前Kubernetes叢集超出了承受能力,那麼將額外的工作負載路由到另一個比較空閒的Kubernetes叢集中。

  • 根據應用地理區域需求,排程工作負載到不同的Kubernetes叢集中,對於不同的終端使用者,提供更高的頻寬和更低的延遲。

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

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

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

?

1、系統環境及初始化

1.1 系統環境

?

1.2 安裝前準備

1.2.1 準備Kubernetes元件映象

Kubernetes 1.7版本的叢集與聯邦叢集功能的安裝方式均為映象安裝,所有元件功能都使用官方提供的映象來實現,由於官方映象國內無法正常下載,需要提前準備好映象或科學上網,具體映象列表如下:

?

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.13test01.example.com
192.168.5.14test02.example.com

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

systemctl stopfirewalld
systemctl disable firewalld關閉SELINUX選項

關閉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、Kubernetes-cni:

yum install -ykubelet kubeadm kubectl kubernetes-cni

Kubelet服務設定開機啟動:

systemctl enablekubelet.service

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

2、安裝Kubernetes叢集

首先在一個節點上安裝Kubernetes作為master節點,將master節點參與叢集排程,然後在該節點上安裝聯邦叢集功能,作為聯邦叢集的控制平面。

2.1 初始化叢集

使用Kubeadm初始化叢集,選擇node1作為Master,在node1上執行下面的命令:

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

注:因為我們選擇flannel作為Pod網路外掛,所以命令指定--pod-network-cidr=10.240.0.0/16。

kubeadm init執行成功後輸出下面的資訊:

You can now join anynumber of machines by running the following on each node
as root:
kubeadm join --tokene7986d.e440de5882342711 192.168.5.13:6443

注:請儲存好該資訊,後續節點加入叢集需要使用該命令。

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

echo "exportKUBECONFIG=/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:

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

目前需要在kube-flannel.yml中使用--iface引數指定叢集主機內網網絡卡的名稱,否則可能會出現DNS無法解析。需要將kube-flannel.yml下載到本地,flanneld啟動引數加上--iface=:

vi kube-flannel.yml
  command: [ "/opt/bin/flanneld","--ip-masq", "--kube-subnet-mgr", "--iface=eth1"]   //改為本機網絡卡名稱

部署網路元件:

kubectlcreate -f kube-flannel-rbac.yml
kubectlapply -f kube-flannel.yml

確保所有的Pod都處於Running狀態。

kubectlget pod --all-namespaces -o wide

?

使用下面的命令使MasterNode參與工作負載。

kubectltaint nodes --all node-role.kubernetes.io/master-

3、安裝聯邦叢集元件

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

curlhttps://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

初始化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工作節點上初始安裝後執行以下命令:

kubeadmjoin --token e7986d.e440de5882342711 192.168.5.13:6443

在master節點檢視節點狀態:

kubectlget nodes

重複上述步驟建立多個Kubernetes叢集,為聯邦叢集新增叢集節點做準備。

3.4初始化聯邦叢集

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.5 其他Kubernetes叢集加入聯邦叢集

選擇叢集的Context:

kubectlconfig use-context fellowship   //fellowship為聯邦初始化時建立

新增聯邦叢集檔案:

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

新增叢集到聯邦:

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

新增叢集到聯邦:

kubectlcreate -f c1.yaml
kubectlcreate -f c2.yaml

檢視聯邦叢集狀態:

[[email protected]~]# kubectl get cluster
NAME      STATUS     AGE
c1        Ready     2d
c2        Ready     2d

3.6 通過聯邦叢集部署應用

通過聯邦叢集部署應用,需要在聯邦叢集控制平面的節點上,切換到聯邦的Context。

kubectlconfig 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個叢集中:

[[email protected] ~]# kubectl create namespace default
namespace"default" created
[[email protected] ~]#kubectl create -f tomcat.yaml
replicaset"tomcat" created
[[email protected] ~]#kubectl get rs
NAME      DESIRED     CURRENT       AGE
tomcat    4           4             <invalid>
[[email protected] ~]#kubectl -s 192.168.15.53:8080 get pod
NAME           READY     STATUS       RESTARTS   AGE
tomcat-juywx  1/1      Running      0           33s
tomcat-siidb  1/1      Running      0           33s
[[email protected] ~]#kubectl -s 192.168.8.12:8080 get pod
NAME           READY     STATUS       RESTARTS   AGE
tomcat-sw437  1/1      Running      0           33s
tomcat-n7z74  1/1      Running      0           33s

叢集聯邦只支援以下幾種型別資源的建立:

  • Cluster

  • ConfigMap

  • DaemonSets

  • Deployment

  • Events

  • Ingress

  • Namespaces

  • ReplicaSets

  • Secrets

  • Services


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組目錄沒有支援高可用,但聯邦功能主要是為了排程管理Kubernetes叢集的,所以聯邦叢集Federation元件出現故障時並不會直接影響到下面各個叢集自身的已經在執行的服務。

Q:根據應用地理區域需求,排程工作負載到不同的Kubernetes叢集中,對於不同的終端使用者,提供更高的頻寬和更低的延遲. 這個排程到不同的叢集,是Kubernetes根據地理位置排程嗎?是Kubernetes自己排程嗎?

A:工作負載Kubernetes可以自己排程到比較空閒的叢集上,地理位置排程這個需要通過編排檔案控制應用的容器分配到更合適的區域機房。

Q:是先建立3個Kubernetes叢集,然後在1個叢集的master上kubefed init fellowship是嗎?

A:是的,在其中1個叢集的master上安裝Federation元件,然後把3個Kubernetes叢集加進來管理。

Q:新增聯邦叢集檔案時,裡面的serverAddress是什麼地址?

A:serverAddress就是Kubernetes叢集的API server的IP和埠,c1.yaml裡面的serverAddress就是叢集01的API server的IP和埠,c2.yaml裡面的serverAddress就是叢集02的API server的IP和埠。

深入學習Kubernetes

?

本次培訓內容包含:Kubernetes架構、Kubernetes安裝、Kubernetes功能導覽、監控解決方案、Kubernetes高階——設計和實現、Kubernetes落地實踐等,點選識別下方二維碼加微信好友瞭解具體培訓內容

?

點選閱讀原文連結即可報名。

相關推薦

Kubernetes叢集管理實踐

Kubernetes在1.3版本之後,增加了“叢集聯邦”Federation的功能。這個功能使企業能夠快速有效的、低成本的跨區跨域、甚至在不同的雲平臺上執行叢集。這個功能可以按照地理位置建立一個複製機制,將多個Kubernetes叢集進行復制,即使遇到某個區域連線中斷或某個資料中心故障,也會保持最關鍵

Kubernetes使用叢集聯邦實現叢集管理_Kubernetes中文社群

作者介紹:有容雲系統工程師 呂龍。 Kubernetes在1.3版本之後,增加了“叢集聯邦”Federation的功能。這個功能使企業能夠快速有效的、低成本的跨區跨域、甚至在不同的雲平臺上執行叢集。這個功能可以按照地理位置建立一個複製機制,將多個kubernetes叢集進行復制,即使遇到某個區

GitOps:Kubernetes叢集環境下的高效CICD實踐

為了解決傳統應用升級緩慢、架構臃腫、不能快速迭代、故障不能快速定位、問題無法快速解決等問題,雲原生這一概念橫空出世。雲原生可以改進

Kubernetes(K8S)叢集管理Docker容器(部署篇)

今天這篇文章教給大家如何快速部署一套Kubernetes叢集。K8S叢集部署有幾種方式:kubeadm、minikube和二進位制包。前兩者屬於自動部署,簡化部署操作,我們這裡強烈推薦初學者使用二進位制

滴滴 Elasticsearch 叢集架構實踐

Elasticsearch 是基於 Lucene 實現的分散式搜尋引擎,提供了海量資料實時檢索和分析能力。Elastic 公司開源的一系列產品組成的 Elastic Stack,可以為日誌服務、搜尋引擎、系統監控等提供簡單、易用的解決方案。 一、滴滴 Elasticsearch 簡介

Kubernetes(K8S)叢集管理Docker容器

一、架構拓撲圖 二、環境規劃 角色 IP 元件 master 172.25.77.1 etcd kube-apiserver kube-

Kubernetes之Kubeconfig實現叢集使用者接入的組織、管理

概述 kubectl命令訪問叢集時,預設情況下在$HOME/.kube目錄下尋找名為config的配置檔案,配置檔案中包含叢集ip地址、埠號、使用者名稱、密碼、證書、名稱空間等資訊,kubectl據此建構訪問叢集的上下文。也可以通過KUBECONFIG環境變數或者--kub

Kubernetes 1.13釋出:利用Kubeadm簡化叢集管理,CSI以及作為預設DNS的CoreDNS全面實現普遍可用...

我們很高興地公佈Kubernetes 1.13版本,這是我們2018年年內第四次也是最後一次釋出新的版本! Kubernetes 1.13是迄今為止釋出間隔最短的版本之一,距離上一次迭代僅為十週。此版本繼續關注Kubernetes的穩定性與可擴充套件性,其中儲存與叢集生命週期相

容器、容器叢集管理平臺與Kubernetes技術漫談

本文源自一次技術選型的工作中所收集、整理、調研和撰寫的技術資料,釋出於2018年11月12日。 我們為什麼使用容器? 我們為什麼使用虛擬機器(雲主機)? 為什麼使用物理機? 這一系列的問題並沒有一個統一的標準答案。因為以上幾類技術棧都有自身最適用的場景,在最佳實踐之下,

開源容器叢集管理系統Kubernetes架構及元件介紹

Kubernetes 作為Docker生態圈中重要一員,是Google多年大規模容器管理技術的開源版本,是產線實踐經驗的最佳表現。如Urs Hölzle所說,無論是公有云還是私有云甚至混合雲,Kubernetes將作為一個為任何應用,任何環境的容器管理框架無處不在。正因為如此

二進位制搭建kubernetesmaster叢集【四、配置k8s node】

上一篇我們部署了kubernetes的master叢集,參考:二進位制搭建kubernetes多master叢集【三、配置k8s master及高可用】 本文在以下主機上操作部署k8s node k8s-node1:192.168.80.10 k8s-node2:192.168.80.11 k8s-n

容器、容器叢集管理平臺與Kubernetes技術漫談_Kubernetes中文社群

文章由作者投稿: 高慶,百悟科技  高階運維工程師 本文源自一次技術選型的工作中所收集、整理、調研和撰寫的技術資料,釋出於2018年11月12日。 我們為什麼使用容器? 我們為什麼使用虛擬機器(雲主機)? 為什麼使用物理機? 這一系列的問題並沒有一個統一的標準答案。因為以上幾類技術棧都有自身最

MDC介紹 -- 一種執行緒下日誌管理實踐方式

一:MDC介紹   MDC(Mapped Diagnostic Context,對映除錯上下文)是 log4j 和 logback 提供的一種方便在多執行緒條件下記錄日誌的功能。某些應用程式採用多執行緒的方式來處理多個使用者的請求。在一個使用者的使用過程中,可能有多個不

基於docker+kubernetes的一站式運維管理實踐

【編者的話】本文按照從整體架構到功能模組的順序為我們講述了搜狐自動化運維平臺DomeOS,實現使用者私有叢集的容器化管理和資源智慧分配 專案簡介 2015年下半年,搜狐北京研發中心基於docker和kubernetes開發了一套企業級的一站式運維管理系統——DomeOS

Kubernetes(k8s)中文文件 Service Accounts叢集管理指南_Kubernetes中文社群

譯者:Nancy 這是對Service Accounts的叢集管理指南 User Accounts和Service Accounts 基於以下原因,Kubernetes區分了User Accounts和Service Accounts: User Accounts針對人,Service Accou

Kubernetes在企業中的場景運用及管理實踐

您目前處於: 概要 隨著 Kubernetes 的快速發展,作為產品級容器排程及管理平臺也變得越來越成熟。而隨著更多功能的引進,也使得平臺的複雜度不斷增加。如何在不同的場景更好的運用這些特性,如何更好的對 Kubernetes 進行運維管理,就成為那些計劃把Kuberne

Kubernetes容器叢集中的日誌系統整合實踐

Kubernetes是原生的容器編排管理系統,對於負載均衡、服務發現、高可用、滾動升級、自動伸縮等容器雲平臺的功能要求有原生支援。今天我分享一下我們在Kubernetes叢集中日誌管理的實踐方案。在這個方案中,除了Docker和Kubernetes,主要還涉及的技術包括:Fluentd、Elas

Docker系列(十一):kubernetes叢集叢集部署實踐

Kubernetes分散式叢集架構 服務註冊和服務發現問題怎麼解決的? 分散式通訊的核心就是ip加埠 每個服務分配一個不變的虛擬IP+埠 系統env環境變數裡有每個服務的服務名稱到IP的對映 如下: client = new redis\Client([ 'scheme'

Docker叢集管理工具-Kubernetes部署記錄

1)首先部署nginx pod 和複製器--------------------------------------------------------------------- [[email protected] ~]# docker images REPOSITORY