Kubernetes實戰(一):使用Kubeadm工具快速安裝kubernetes集羣

Kubernetes簡介

Kubernetes概述

之前在介紹容器技術的博文https://blog.csdn.net/weixin_41977332/article/details/105305831裏,有提了一下容器的編排引擎Kubernetes,這篇博文我們來更加詳細地介紹一下Kubernetes。Kubernetes是一個比較新的基於容器技術的分佈式架構領先方案,是google內部使用多年的大規模集羣管理系統Borg的一個開源版本。作爲一個完備的分佈式系統支撐平臺,Kubernetes具有完備的集羣管理能力,包括多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和服務發現機制、內建智能負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和在線擴容能力、可擴展的資源自動調度機制以及多粒度的資源配額管理能力。同時Kubernetes提供了完備的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。通過Kubernetes部署應用,我們不必再費心於負載均衡器的選型和部署實施的問題,不必再考慮引入或者自己開發一個複雜的服務治理框架,不必再頭疼於服務監控和故障處理模塊的開發。

Kubernetes相關概念:Service和Pod

在Kubernetes中,Service(服務)是分佈式集羣架構的核心,一個service對象主要有如下幾個關鍵特徵:

  1. 擁有一個唯一的指定名字(比如mysql-server)
  2. 擁有一個虛擬IP(Cluster IP,Service IP或VIP)和端口號
  3. 能夠提供某種遠程服務的能力
  4. 被映射到了提供這種服務能力的一組容器應用上

Service的服務進程目前都是基於Socket通信方式對外提供服務,比如Redis、Memcache、MySQL、Web Server,或者是實現了某個具體業務的一個特定的TCP Server進程,雖然一個Service通常由多個相關的服務進程來提供服務,每個服務進程都有一個獨立的Endpoint(IP+Port)訪問點,但Kubernetes能夠讓我們通過服務連接到指定的Service上。有了Kubernetes內置的透明負載均衡和故障恢復機制,不管後端有多少服務進程,也不管某個服務進程是否會由於發生故障而重新部署到其他機器,都不會影響我們隊服務的正常調用,更重要的是這個Service本身一旦創建就不會發生變化,意味着在Kubernetes集羣中,我們不用爲了服務的IP地址的變化問題而頭疼了。
容器提供了強大的隔離功能,所有有必要把爲Service提供服務的這組進程放入容器中進行隔離。爲此,Kubernetes設計了Pod對象,將每個服務進程包裝到相對應的Pod中,使其成爲Pod中運行的一個容器。爲了建立Service與Pod間的關聯管理,Kubernetes給每個Pod貼上一個標籤Label,比如運行MySQL的Pod貼上name=mysql標籤,給運行PHP的Pod貼上name=php標籤,然後給相應的Service定義標籤選擇器Label Selector,這樣就能巧妙的解決了Service於Pod的關聯問題。
關於Pod這個概念,Pod 運行在一個我們稱之爲節點(Node) 的環境中,這個節點既可以是物理機,也可以是私有云 或者公有云中的一個虛擬機每個 Pod 裏運行着一個特殊的被稱之爲 Pause 的容器,其他 容器則爲業務容器,這些業務容器共享 Pause 容器的網絡棧和 Volume 掛載卷,因此它們之間的 通信和數據交換更爲高效,在設計時我們可以充分利用這一特性將一組密切相關的服務進程放 入同一個 Pod 中。
爲什麼Kubernetes會設計出一個全新的Pod的概念並且Pod內需要有一個特殊的Pause容器呢?因爲在一組容器作爲一個單元的情況下,我們難以對“整體”簡單地進行判斷及有效的行動,比如說,一組容器內一個容器死亡了,此時算是整體死亡嗎?引入業務無關並且不易死亡的Pause容器作爲Pod的根容器,以它的狀態代表整個容器組的狀態,就可以很好地解決這個問題,同時,Pod裏的多個業務容器通過共享Pause容器的IP和掛載卷,可以更高效地進行通信和文件共享。
在集羣管理方面,Kubernetes將集羣中的機器劃分爲一個Master節點和一羣工作節點Node,其中,在Master節點運行着集羣管理相關的一組進程kube-apiserver、kube-controller-manager和kube-scheduler,這些進程實現了整個集羣的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理能力,並且都是全自動完成的。Node作爲集羣中的工作節點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行着Kubernetes的kubelet、kube-proxy服務進程,這些服務進程負責Pod的創建、啓動、監控、重啓、銷燬以及實現軟件模式的負載均衡器。
在Kubernetes集羣中,它解決了傳統IT系統中服務擴容和升級的兩大難題。你只需爲需要擴容的Service關聯的Pod創建一個Replication Controller簡稱(RC),則該Service的擴容及後續的升級等問題將迎刃而解。在一個RC定義文件中包括以下3個關鍵信息。

  1. 目標Pod的定義
  2. 目標Pod需要運行的副本數量(Replicas)
  3. 要監控的目標Pod標籤(Label)

在創建好RC後,Kubernetes會通過RC中定義的的Label篩選出對應Pod實例並實時監控其狀態和數量,如果實例數量少於定義的副本數量,則會根據RC中定義的Pod模板來創建一個新的Pod,然後將新Pod調度到合適的Node上啓動運行,知道Pod實例的數量達到預定目標,這個過程完全是自動化。

使用kubeadm工具快速安裝kubernetes集羣

Kubeadm是用於安裝Kubernetes集羣的命令行工具,目前還不能用於生產環境,但很適合初學者快速安裝和學習Kubernetes。本安裝教程採用的集羣有兩個節點,一個Master節點爲Centos7的虛擬機,內存大小10G,硬盤大小50G,網絡地址爲192.168.1.104,另一個爲Node節點也爲Centos7虛擬機,內存大小4G,硬盤大小爲40G,網絡地址爲192.168.1.105

Master節點

配置yum源:

vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
yum repolist

設置gpg校驗配置

wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
rpm --import rpm-package-key.gpg 
rpm --import yum-key.gpg 

關閉防火牆,selinux和swap

systemctl disable firewalld
systemctl stop firewalld
setenforce 0
swapoff -a 
vim /etc/fstab   #註釋該文件中關於swap那行

安裝組件

yum install -y docker kubelet kubeadm kubectl kubernetes-cni

設置docker國內鏡像源:

vim /etc/docker/daemon.json
{"registry-mirrors": ["http://hub-mirror.c.163.com"]}

設置docker和kubelet服務啓動和開機自啓

systemctl enable docker  
systemctl start docker
systemctl enable kubelet
systemctl start kubelet

下載kubernetes相關鏡像

通過kubeadm config images list查看所需鏡像,然後上docker hub上尋找有沒有相應版本的鏡像(國內網絡無法訪問k8s.gcr.io下載鏡像)

docker pull aiotceo/kube-apiserver:v1.17.4
docker pull aiotceo/kube-controller-manager:v1.17.4
docker pull aiotceo/kube-scheduler:v1.17.4
docker pull aiotceo/kube-proxy:v1.17.4
docker pull thejosan20/pause:3.1
docker pull aiotceo/etcd:3.4.3
docker pull coredns/coredns:1.6.5

docker tag aiotceo/kube-apiserver:v1.17.4 k8s.gcr.io/kube-apiserver:v1.17.4
docker tag aiotceo/kube-controller-manager:v1.17.4 k8s.gcr.io/kube-controller-manager:v1.17.4
docker tag aiotceo/kube-scheduler:v1.17.4 k8s.gcr.io/kube-scheduler:v1.17.4
docker tag aiotceo/kube-proxy:v1.17.4 k8s.gcr.io/kube-proxy:v1.17.4
docker tag thejosan20/pause:3.1 k8s.gcr.io/pause:3.1
docker tag aiotceo/etcd:3.4.3 k8s.gcr.io/etcd:3.4.3-0
docker tag coredns/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5

運行kubeadm init 安裝Master

kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

安裝網絡插件

docker pull quay.io/coreos/flannel:v0.12.0-amd64
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

node節點

配置yum安裝源和關閉防火牆,交換分區等操作,和master節點相同
安裝服務:

yum install -y docker kubelet kubeadm kubectl kubernetes-cni
systemctl enable docker 
systemctl start docker
systemctl enable kubelet
systemctl start kubelet

執行kubeadm join命令加入集羣(見kubeadm init之後的命令行提示)
配置網絡插件

docker pull quay.io/coreos/flannel:v0.12.0-amd64

下載鏡像

docker pull aiotceo/kube-proxy:v1.17.4
docker tag aiotceo/kube-proxy:v1.17.4 k8s.gcr.io/kube-proxy:v1.17.4

將master節點中/etc/cni/net.d/10-flannel.conflist拷貝到node節點中相同文件夾下,如果沒有目錄則創建該目錄
如果在node節點上想要使用kubectl命令行,則需要進行如下操作

mkdir -p $HOME/.kube
scp -i master的ip:/etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

安裝完成之後在Master節點使用命令kubectl get pods --all-namespaces和kubectl get nodes查看nodes節點和各pods是否工作正常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章