2020版Kubernetes快速上手指南


原文:https://www.abcxlab.com/research/cloud/202005072134085267.html

Kubernetes作為新一代雲計算平台,自2014年開源以來得到快速發展(2016年)並逐步成熟(2018年),極大推動了雲原生領域及技術(微服務、FaaS和Serverless)的發展,被譽為影響雲計算未來10年的革新技術。隨着Kubernetes及其生態的廣泛成熟,我想2020年除了那些大廠外,在中小型IT公司Kubernetes也一定得到普遍的青睞和積極采用。可以說2020年是Kubernetes大踏步進入中小企業市場的最佳時機,2020年絕對是Kubernetes“生產力元年”。因此作為開發人員,很有必要花點時間跟進學習下Kubernetes這門新技術。本文結合自己的實踐分享下Kubernetes簡單快速上手過程(簡稱快手指南,哈哈),希望對大家有所幫助。

注:從 Google 搜索引擎的趨勢數據來看,Kubernetes和Spring Boot的關注度同趨勢地從2016年后迅猛增長,而相應OpenStack和Hadoop在2016后遇冷下降明顯,折射着雲計算2.0時代的到來。

目標

作為新人,Kubernetes上手普遍存在如下痛點:

  1. 技術門檻較高,有較多概念和依賴。例如:Docker技術棧、Kubernetes體系新名詞、復雜的YAML配置讓人頭疼。
  2. 部署困難。例如:多節點群集,多個部署工具和方式選擇困難,Kubernetes部署過程中問題多。
  3. 欠缺好的文章指導,目前能Google搜索的技術文章不是滯后就是凌亂,而官方文檔雖然權威、詳盡,但新人起步的針對性不足。
  4. 讓人心煩的網絡和存儲配置。作為雲計算平台,除了計算容器化外,平台的網絡和存儲需要額外選擇和配置。
  5. 額外的應用適配。搭建好了的平台,只有跑上我們開發的應用才是終極勝利。但這又是另外一件不很輕松的事情。

基於以上常見痛點,本文結合實驗室搭建的Kubernetes演示環境,通過“所見即所得”方式來講解下具體的實踐過程,希望能達到如下目標:

  1. 通過試用免費開放的實驗環境,增強體驗感和可操作性;
  2. Github提供同步學習的開放源代碼,增強演示過程的可復制性,讓所見即所得;
  3. 精簡Kubernetes概念,快速了解核心內容;
  4. 同步最新版本,通過Step-by-Step方式跳過各種坑,輕松部署Kubernetes;
  5. 通過運行演示的NodeJs和SpringBoot應用,達到學以致用的最終目標;
  6. 面向產線增加關鍵知識點延伸,便於接下來進一步拓展學習;

預演

本教程涉及源代碼可以通過如下方式下載:

本教程支持在線演示環境體驗,具體訪問方式如下:

  • 群集演示地址: https://k8s.abcxlab.com/
  • 演示登錄Token:  請掃碼關注ABC實驗室微信公眾號,輸入”k8s” 即可獲取
  • eyJhbGciOiJSUzI1NiIsImtpZCI6ImFsNzE2YkJFUXV0MnlzNXJHOHRuRFZoZ3FyNGxkb00tUkJGNFVTZ2lQWm8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJyZWFkLW9ubHktdG9rZW4tbnZrenQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicmVhZC1vbmx5Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZjE5NDZjYTMtMTBiMy00YTQ5LWI1MDEtZjZiYjQyMDQ4NTJjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOnJlYWQtb25seSJ9.rV-wXUqMZE2Ppv_po7rOm9JJdWbRCM0_gFo-IJaVWE5GtaJh0qFHSI6D7rjtYYIMKaWV4gzAzy-RcuYgj0Fok6xo1s6yTpNOHN-X4tuuX6MiXBkIcpT1hQ1tI53YLrR7dKJi7NmtDgyFrw75URd1RhFciKf2-KQlxuDrIG75z7Gw0P7FhHaPFXnCYkxtkXAW-UkcIF4y5qKKFMuWA-0EOxB6DKlSLC_zHzY_qiQIvMSzE5eYjWpWxkW-3s6VsjEMIV8lCTdCxEEN1bMtHpFOf9xwuolbWF23U2edJOOMkwOEUGCTS-kxHN8F9Qn7XRqbdXmB10FoeKw6d38Rj_bDaw

演示群集Dashboard截圖

建議先體驗演示環境,獲取直觀感受!

概述

Kubernetes  希臘語為“舵手”,是一個輕便、可擴展的工業級容器編排平台,用於管理容器化應用和服務。Google基於內部Borg系統研發並於2014年正式開源,目前最新發布了V1.18版本。

架構

Kubernetes架構如下圖所示

Kubernetes群集是一個主從分布式架構,由Master節點(多個)組成的控制平面和Worker節點(多個)組成的計算平面共同組成。主要組件如下:

  • API Server:負責所有組件之間通信,並負責存儲狀態和配置到Etcd庫中;
  • Controller Manager:包含不同類型的群集控制器(如ReplicationSet/Deployment/Service等控制器),執行群集級別的功能,如復制組件、持續跟蹤工作節點、處理節點識別等;
  • Scheduler:重點負責給應用的Pod調度分配相應節點;
  • Etcd:一個可靠的分布式數據存儲,持久化保存群集狀態和元數據;
  • Kubelet:管理所在工作節點的所有容器,並持續跟蹤和保持和API Server通訊,響應相關容器管理事件;
  • Kube-proxy:他負責組件之間的負載均衡和服務的網絡連通;
  • Docker引擎:底層運行環境,可以是docker、rtk或其他引擎;

核心概念

  • Pod:最小的調度分配單元,可包含一組容器和卷組成,同一個Pod的容器組共享同一個網絡命名空間;
  • ReplicationController/ReplicateSet:  用於控制Pod副本數量,保證Pod始終運行;
  • StatefulSet:類似ReplicateSet,但StatefulSet提供Pod狀態保持,在重新調度后保留他們的標識和狀態,適合數據庫等有狀態應用場景;
  • DeamonSet: 保證在所有群集節點上運行一個Pod;
  • Service: 為一組功能相同的Pods提供單一不變的接入點,解耦Pods伸縮能力;
  • Deployment:類似ReplicationController/ReplicateSet, 增加滾動升降級策略和能力;
  • ConfigMap:配置選項,支持配置從Pod中解耦分離;
  • Secret:類似ConfigMap,用於敏感數據保存;

特點

Kubernetes平台有如下典型特征:

  • 容器的自動裝箱,即調度;
  • 水平擴容和伸縮,通過控制Pod副本數量達到伸縮能力;
  • 服務發現和負載均衡;
  • 服務自愈和恢復能力;
  • 應用自動發布和回滾;
  • 服務流量路由;
  • 可擴展跟蹤;

安裝說明

好了,簡單了解完基本概念和架構后,讓我們開始動手實踐下吧!

安裝步驟

為了便於學習和掌握群集安裝的具體過程,我們把群集安裝整個過程做一個模塊化切分,可分為如下8大步:

配置說明

  • 安裝工具: kubeadm (v1.18.2)
  • Kubernetes版本:v1.18.2 (最新穩定版本)
  • 硬件最低要求: 2核 4G內存 20G 硬盤 (參考官方
  • 服務器操作系統:Ubuntu Server 18.04 LTS
  • Docker版本: 19.03.8 (最新穩定版本)
  • 環境域名: k8s.abcxlab.com (Dashboard),*.k8s.abcxlab.com (應用)

節點說明

群集節點安排: 1個Master節點、2個Worker節點,具體如下所示:

代碼說明

源代碼地址:https://gitlab.abcxlab.com/bootcamp/k8s-quick-start

源代碼目錄說明:

/app – – springboot應用 和 nodejs 應用目錄,包括應用源代碼、k8s部署腳本、鏡像Dockerfile配置等

/k8s – –  Kubernetes 配置腳本,包括安裝腳本和網絡、負載和Dashboard等YAML配置文件等

應用說明

搭建好Kubernetes平台后,用於應用部署的兩類常見應用說明如下:

SpringBoot應用

NodeJs應用

安裝過程

節點配置

按照最低硬件要求配置類似如下三個物理節點服務器(虛擬機也可),一個為Master節點,另外兩個為Worker節點。

注:本快速安裝為非高可用安裝,支持高可用可參考文末“延伸”章節介紹

Hostname
角色
IP
XAnt Master Node 192.168.1.4
XBox Worker Node 192.168.1.5
XBee Worker Node 192.168.1.6

安裝Ubuntu Server 18.04 LTS 操作系統,並關閉虛擬內存swap功能。

sudo swapoff -a
free -h
total used free shared buff/cache available
Mem: 15G 8.4G 321M 348M 6.9G 6.6G
Swap: 0B 0B 0B

Docker安裝

所有節點部署Docker作為容器引擎,安裝命令如下:

curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/install-docker.sh | sh -

Master安裝

kubernates Master節點安裝,分為三個步驟

1. 安裝kubeadm工具,命令如下:

curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/install-kubeadm.sh | sh -

2.手動下載所需鏡像(防止自動安裝時所需國外鏡像沒法下載),命令如下:

curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/pull-kube-image.sh | sh -

3. 使用kubeadm創建群集,命令如下:

sudo kubeadm init --kubernetes-version=$(kubeadm version -o short) --pod-network-cidr=10.244.0.0/16

正確執行三個步驟后,如果出現如下類似提示,說明安裝成功。

...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.1.4:6443 --token rfstgm.lxk9eik0ub409ifo \
--discovery-token-ca-cert-hash sha256:ec0d455d57d9b8348793a1ba1b937412f4264f1ee37215857c8e8e451d452fa2

按照上面提示在Master上運行配置好kubernetes-cli運行環境,命令如下:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

同時記下Worker 節點加入群集的命令,類似如下:

kubeadm join 192.168.1.4:6443 --token rfstgm.lxk9eik0ub409ifo \
--discovery-token-ca-cert-hash sha256:ec0d455d57d9b8348793a1ba1b937412f4264f1ee37215857c8e8e451d452fa2

關於網絡配置提示,先不用擔心,后續網絡配置章節會做詳細介紹。

提示:為了便於后續Master節點命令行中便捷輸入,建議配置Shell自動補全功能, 如下所示:

#針對bash shell配置
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
#針對zsh shell配置
vim ~/.zshrc
#追加如下內容
if [ $commands[kubectl] ]; then
source <(kubectl completion zsh)
fi
source ~/.zshrc

Worker安裝

Worker節點的安裝第一步類似Master節點(這里用XBox舉例)

1.先安裝kubeadm工具和Flannel鏡像,命令如下:

curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/install-kubeadm.sh | sh -
 
sudo docker pull quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64
sudo docker tag quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64

2.再按照Master節點提示,執行如下節點Join命令

sudo kubeadm join 192.168.1.4:6443 --token rfstgm.lxk9eik0ub409ifo --discovery-token-ca-cert-hash sha256:ec0d455d57d9b8348793a1ba1b937412f4264f1ee37215857c8e8e451d452fa2

提示:如果token過期或忘記discovery-token-ca-cert-hash相應參數值,可以通過在Master節點運行如下命令獲取相應值,其中ca-cert-hash記得加”sha256:“前綴

#重新生成token
kubeadm token create
#獲取discovery-token-ca-cert-hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

按照以上類似步驟,安裝另外一個Worker節點XBee。

等所有節點都安裝完畢后,在Master節點XAnt進行安裝驗證。

3. 檢查群集,看節點是否加入群集

如圖上所示即表明我們kubernetes群集安裝成功,如果Worker節點狀態暫時顯示為NotReady也不用着急,我們繼續配置網絡即可。

提醒:安裝過程中遇到問題時,可參考文末“常見問題”章節

網絡配置

kubernetes 網絡模型核心為三點

  1. 每個 Pod 都擁有一個獨立 IP 地址;
  2. Pods通過扁平的網絡連通,不同節點上Pods可以無NAT地直接通訊;
  3. Service Cluster IP 盡可在集群內部訪問,外部請求需要通過 NodePort、LoadBalance 或者 Ingress 來訪問;

采用kubeadm工具安裝只支持CNI(Container Network Interface)網絡插件,不支持默認的kubenet。因此需要安裝相應插件(例如Flannel、Calico、Romana、Weave-net等插件,本文選擇采用Overlay網絡的Flannel插件),安裝命令如下:

備注:Flannel插件相關YAML配置來自官網: https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

#安裝網絡插件
sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/1.0_kube-flannel.yaml
 
# 驗證是否安裝成功
sudo kubectl get ds -n kube-system

Nginx-Ingress安裝

kubernetes群集內部服務可以通過三種方式暴露給外部訪問(南北流量)

  • NodePort方式,依賴節點的端口映射,屬於節點原生網絡。
  • LoadBalance方式,依賴基礎設施中負載均衡服務(例如:AWS ELB 或阿里雲ELB等),特點是多個LB實例和相應IP地址(屬於4層LB)。
  • Ingress方式,它相對LoadBalance方式的優勢在於通過安裝的Ingress控制器(例如Nginx-Ingress) 基於固定IP的代理多個HTTP/HTTPS服務,有點類似於Nginx虛擬主機反向代理的用法(屬於7層LB)。

這三種連通內網方式相關比較可參考下圖:

由於Ingress連通方式的優點,本文選擇Nginx-Ingress組件來暴露內部服務(例如:Kubernetes Dashboard 應用和演示應用都使用Ingress方式)
Nginx-Ingress安裝命令如下:

備注:nginx-ingress相關YAML配置來自官網:https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

#下載Ingress控制器配置文件
wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/2.0_kube-ingress-nginx-extip.yaml
 
#按需修改externalIP和Port (見備注)
vim 2.0_kube-ingress-nginx-extip.yaml
 
#安裝Ingress控制器
sudo kubectl apply -f 2.0_kube-ingress-nginx-extip.yaml
 
# 驗證是否安裝成功
sudo kubectl get pods -n ingress-nginx

注意:Ingress控制器對外IP和端口需要根據自己環境Worker節點安排做相應配置,默認配置演示群集中XBee和XBox兩個Worker節點的IP,端口分別為9090(HTTP)和9443(HTTPS)(如下圖所示)。兩組IP可以提高可用性,在群集外圍可以綁定到基礎設施環境的LB上(演示環境用Nginx),提供對外服務(例如:https://k8.abcxlab.com)或者直接提供訪問(例如:https://micro.k8s.abcxlab.com:9443/ )

Dashboard安裝

安裝好網絡插件和Ingress控制器后,就可以開開心心部署應用了。我們就來試試部署Kubernetes群集管理儀表盤Dashboard吧。

備注:Dashboard相關YAML配置來自官網:https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml 

# 安裝Dashboard應用及相應授權
sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/3.0_kube-dashboard.yaml
 
# 下載dashboard ingress配置文件
wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/3.1_kube-dashboard-ingress.yaml
 
#把k8s.abcxlab.com域名改為自己要使用的域名:dashboard.your.domain
vim 3.1_kube-dashboard-ingress.yaml
 
# 為Dashboard應用配置Ingress訪問
sudo kubectl apply -f 3.1_kube-dashboard-ingress.yaml
 
# 創建登錄用的ServiceAccount: admin
sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/3.2_kube-dashboard-admin-user.yaml
 
# 驗證是否安裝成功
sudo kubectl get pods -n kubernetes-dashboard

注意:Dashboard的Ingress配置文件的域名:k8s.abcxlab.com 需要修改為自己的域名:<dashboard.your.domain>

如果Dashboard部署成功,就可以通過https://<dashboard.your.domain>:9443 方式訪問如下登錄界面了。(注意:需要域名訪問)

在Master節點執行如下命令獲取Dashboard登錄Token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin | awk '{print $1}')

應用部署

如果一切沒問題,接下來就可以用搭建的群集進行應用部署啦!

1.部署NodeJs/kubia應用

# 部署kubia應用
sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/nodejs/1_kubia-deployment.yaml
 
# 下載kubia應用ingress配置文件
wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/nodejs/2_kubia-ingress.yaml
 
# 把kubia.k8s.abcxlab.com域名改為自己要使用的域名 kubia.your.domain
vim 2_kubia-ingress.yaml
 
# 為kubia應用配置Ingress訪問
sudo kubectl apply -f 2_kubia-ingress.yaml
 
#檢查部署是否成功
sudo kubectl get ingress
curl -kL https://kubia.your.domain/

2.水平伸縮NodeJs/kubia應用

#擴容:從2副本擴容到3
sudo kubectl scale deployment kubia --replicas=3
#檢查擴容是否成功
sudo kubectl get pod
 
#收縮:從3副本擴容到1
sudo kubectl scale deployment kubia --replicas=1
#檢查收縮是否成功
sudo kubectl get pod

3.部署SpringBoot/micro應用

類似於NodeJs/kubia應用部署,命令如下:

#部署micro應用
sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/springboot/1_micro-deployment.yaml
 
# 下載micro應用ingress配置文件
wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/springboot/2_micro-ingress.yaml
 
#把micro.k8s.abcxlab.com域名改為自己要使用的域名 micro.your.domain
vim 2_micro-ingress.yaml
 
# 為micro應用配置Ingress訪問
sudo kubectl apply -f 2_micro-ingress.yaml
 
#檢查部署是否成功
sudo kubectl get ingress
curl -kL https://micro.your.domain/

好了,到此整個Kubernetes群集End-to-End部署和試用完畢,接下來簡單聊聊和產線相關話題。

延伸

高可用部署

Kubernetes群集高可用,主要要保證Etcd高可用性和Master節點組件高可用性。

按照Etcd分布式數據庫是內置還是外置,Kubernetes高可用部署可分為如下兩種方式

1.Master堆疊方式,如下圖所示:

2.Etcd外部群集方式,如下圖所示:

kubeadm工具也支持高可用群集部署,由於篇幅有限,更多介紹可參考官方文檔:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/high-availability/

常見問題

  1. Minikube、kubeadm、Kubespray、Kops等Kubernetes部署工具該如何選擇?
    簡單來說就是幾個工具的使用場景不一樣,Minikube 通過虛擬機方式快速安裝單節點 Kubernetes 集群,可用於個人電腦快速體驗Kubernetes;Kubeadm 是官方推薦的Kubernetes 分發工具,該工具有助於在現有基礎架構上引導最佳 Kubernetes 集群實踐,優點是能夠在任何地方發布最小的可行 Kubernetes 集群;但 Kubeadm 不提供基礎架構配置(例如:網絡、負載均衡、存儲等都需要額外配置);Kops適合於在阿里雲、AWS、GCE、Azure、OpenStack等雲平台上部署Kubernetes群集,目前不支持裸機部署。Kubespray是產線部署常用工具,依賴Ansible,支持AWS,GCE,Azure,OpenStack等雲平台,以及物理服務器的IaaS平台。
  2. 群集部署過程中,有哪些簡單debug方式?
    a. 通過 kubectl  describe 命令, 查看pod/svc/rc/ds/ingress/deployment等狀態
    b. 通過 kubectl logs 命令,查看pod日志
    c. 通過 kubectl exec -it 進入pod 內部,debug功能
    d. tail -f /var/log/syslog  跟蹤系統日志
  3. 群集部署過程中,有哪些簡單重試方式?
    a. 刪除群集:kubeadm reset
    b. 刪除部署:  kubectl delete -f <yaml file>
    c. 重啟服務:  sudo service kubelet restart

參考

    • Flannel 插件:https://github.com/coreos/flannel
    • Nginx Ingress插件:https://kubernetes.github.io/ingress-nginx/deploy/
    • Dashboard應用:https://github.com/kubernetes/dashboard

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM