K8s(Kubernetes)的安裝部署

一. Kubernetes 系統簡介

首先,他是一個全新的基於容器技術的分佈式架構領先方案。Kubernetes(k8s)是Google開源的容器集羣管理系統(內部:Borg)。在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集羣管理的便捷性。
  Kubernetes是一個完備的分佈式系統支撐平臺,具有完備的集羣管理能力,多擴多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智能負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和在線擴容能力、可擴展的資源自動調度機制以及多粒度的資源配額管理能力。同時Kubernetes提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。
Kubernetes中,Service是分佈式集羣架構的核心,一個Service對象擁有如下關鍵特徵:

擁有一個唯一指定的名字
擁有一個虛擬IP(Cluster IP、Service IP、或VIP)和端口號
能夠體統某種遠程服務能力
被映射到了提供這種服務能力的一組容器應用上

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的關聯問題。
  在集羣管理方面,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個關鍵信息。
目標Pod的定義
目標Pod需要運行的副本數量(Replicas)
要監控的目標Pod標籤(Label)

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

1. Kubernetes優勢:

    - 容器編排
    - 輕量級
    - 開源
    - 彈性伸縮
    - 負載均衡

2. Kubernetes 特性

Endpoint Slices
Kubernetes 集羣中網絡端點的可擴展跟蹤。
服務發現與負載均衡
無需修改您的應用程序即可使用陌生的服務發現機制。Kubernetes 爲容器提供了自己的 IP 地址和一個 DNS 名稱,並且可以在它們之間實現負載平衡。
自我修復
重新啓動失敗的容器,在節點死亡時替換並重新調度容器,殺死不響應用戶定義的健康檢查的容器,並且在它們準備好服務之前不會它們公佈給客戶端。
自動裝箱
根據資源需求和其他約束自動放置容器,同時不會犧牲可用性,將任務關鍵工作負載和盡力服務工作負載進行混合放置,以提高資源利用率並節省更多資源。
IPv4/IPv6 雙協議棧
Allocation of IPv4 and IPv6 addresses to Pods and Services
水平伸縮
使用一個簡單的命令、一個UI或基於CPU使用情況自動對應用程序進行伸縮。

3. Kubernetes的Master和Node節點

1.Master
  k8s集羣的管理節點,負責管理集羣,提供集羣的資源數據訪問入口。擁有Etcd存儲服務(可選),運行Api Server進程,Controller Manager服務進程及Scheduler服務進程,關聯工作節點Node。Kubernetes API server提供HTTP Rest接口的關鍵服務進程,是Kubernetes裏所有資源的增、刪、改、查等操作的唯一入口。也是集羣控制的入口進程;Kubernetes Controller Manager是Kubernetes所有資源對象的自動化控制中心;Kubernetes Schedule是負責資源調度(Pod調度)的進程

2.Node
  Node是Kubernetes集羣架構中運行Pod的服務節點(亦叫agent或minion)。Node是Kubernetes集羣操作的單元,用來承載被分配Pod的運行,是Pod運行的宿主機。關聯Master管理節點,擁有名稱和IP、系統資源信息。運行docker eninge服務,守護進程kunelet及負載均衡器kube-proxy.
每個Node節點都運行着以下一組關鍵進程
kubelet:負責對Pod對於的容器的創建、啓停等任務
kube-proxy:實現Kubernetes Service的通信與負載均衡機制的重要組件
Docker Engine(Docker):Docker引擎,負責本機容器的創建和管理工作

Node節點可以在運行期間動態增加到Kubernetes集羣中,默認情況下,kubelet會想master註冊自己,這也是Kubernetes推薦的Node管理方式,kubelet進程會定時向Master彙報自身情報,如操作系統、Docker版本、CPU和內存,以及有哪些Pod在運行等等,這樣Master可以獲知每個Node節點的資源使用情況,冰實現高效均衡的資源調度策略。

4. Kubernetes Node運行節點,運行管理業務容器,包含如下組件:

  1.Kubelet
    負責管控容器,Kubelet會從Kubernetes API Server接收Pod的創建請求,啓動和停止容器,監控容器運行狀態並彙報給Kubernetes API Server。
  2.Kubernetes Proxy
    負責爲Pod創建代理服務,Kubernetes Proxy會從Kubernetes API Server獲取所有的Service信息,並根據Service的信息創建代理服務,實現Service到Pod的請求路由和轉發,從而實現Kubernetes層級的虛擬轉發網絡。
  3.Docker
    Node上需要運行容器服務

k8s最基本的硬件要求

CPU: 雙核
Mem: 2G
3臺dockerhost
時間必須同步

二. 實驗環境

主機名 IP地址 服務
master 192.168.1.21 docker
node01 192.168.1.22 docker
node02 192.168.1.23 docker

環境準備

分別將3臺虛擬機命名,設置好對應IP,並將其寫入域名解析/etc/hosts中,關閉防火牆,iptables,禁用selinux。還有要做到,時間必須一致。全部禁用swap

1.給三臺docker命名

k8.1

[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su -

k8.2

[root@localhost ~]# hostnamectl set-hostname node01
[root@localhost ~]# su -

k8.3

[root@localhost ~]# hostnamectl set-hostname node02
[root@localhost ~]# su -

驗證docker是否能使用及版本是否一樣

[root@master ~]# docker -v

K8s(Kubernetes)的安裝部署

2.關閉防火牆及禁用selinux

[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
 [root@master ~]# vim /etc/selinux/config

K8s(Kubernetes)的安裝部署

3. 禁用swap(三臺)

[root@master ~]# swapoff -a
//臨時禁用swap
[root@master ~]# free -h
[root@master ~]# vim /etc/fstab 

K8s(Kubernetes)的安裝部署

4.添加域名解析(三臺)

[root@master ~]# echo 192.168.1.21 master >> /etc/hosts
[root@master ~]# echo 192.168.1.22 node01 >> /etc/hosts
[root@master ~]# echo 192.168.1.23 node02 >> /etc/hosts

5.做免密登陸(三臺)

[root@master ~]# ssh-keygen -t rsa
//生成密鑰

複製密鑰到其他主機

   54  ssh-copy-id node01
   55  ssh-copy-id node02

把域名解析複製到其他主機

   63  scp /etc/hosts node01:/etc
   64  scp /etc/hosts node02:/etc

6. 打開路由轉發和iptables橋接功能(三臺)

[root@master ~]# vim /etc/sysctl.d/k8s.conf
//開啓iptables橋接功能
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

[root@master ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
//**打開路由轉發

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
[root@master ~]# sysctl -p 
//刷新一下

如果以上命令執行失敗可能是缺少模塊,可執行以下命令

[root@master ~]# modprobe br_netfiler

把路由轉發和iptables橋接複製到其他主機

[root@master ~]# scp /etc/sysctl.d/k8s.conf  node01:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.d/k8s.conf  node02:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.conf  node02:/etc/
[root@master ~]# scp /etc/sysctl.conf  node01:/etc/

記得node01和node02也要執行以下命令

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
[root@master ~]# sysctl -p 

三. master節點安裝部署k8s

(1)指定yum安裝kubernetes的yum源(三臺)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

下載完成之後,查看一下倉庫是否可用

[root@master ~]# yum repolist 

K8s(Kubernetes)的安裝部署

創建本地緩存(三臺)

[root@master ~]# yum makecache fast

(2)各節點安裝所需安裝包

1.master下載

[root@master ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0

2.node01和node02下載

[root@node01 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0

3.三臺主機把 kubelet加入開機自啓

[root@master ~]# systemctl enable kubelet

(3)master導入,之前準備好的鏡像

從docker鏡像站下載鏡像

docker pull mirrorgooglecontainers/kube-apiserver:v1.14.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.1
docker pull mirrorgooglecontainers/kube-proxy:v1.14.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1

本地上傳鏡像

[root@master ~]# mkdir images
[root@master ~]# cd images/
[root@master images]# ls

K8s(Kubernetes)的安裝部署

1.創建一個導入鏡像的腳本

[root@master images]# cat > image.sh <<EOF
> #!/bin/bash
> for i in /root/images/*
> do
> docker load < $i 
> done
> EOF
[root@master images]# chmod +x image.sh 

2.導入鏡像

[root@master images]# sh image.sh 

3.初始化Kubernetes集羣

[root@master ~]#  kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

如果以上的命令報錯,找出問題後先重置一下(下面的命令),然後再執行以上命令

!!!謹慎使用!!!
[root@master ~]# kubeadm reset
//重置kubeadm

K8s(Kubernetes)的安裝部署

[root@master images]# kubectl get node
//查看當前節點信息

K8s(Kubernetes)的安裝部署

可以看出master的狀態是未就緒(NotReady),之所以是這種狀態是因爲還缺少一個附件flannel,沒有網絡各Pod是無法通信的

4.也可以通過檢查組件的健康狀態

[root@master images]# kubectl get cs

K8s(Kubernetes)的安裝部署

5.添加網絡組件(flannel)

組件flannel可以通過https://github.com/coreos/flannel中獲取

[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

以上只是方式之一,在網絡狀況良好的情況下建議使用上述方法(調用遠端文件執行一下),若網速較差,建議使用以下方法:

[root@master images]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#將github官網指定的.yml配置文件下載到本地
[root@master images]# ls | grep flannel.yml   #確定下載到了當前目錄
kube-flannel.yml
[root@master images]# kubectl apply -f kube-flannel.yml  #指定下載的.yml文件執行相應命令

上述方法,二選一進行配置即可。

看到很多東西被創建是還不夠的,還需要查看flannel是否處於正常啓動並運行的狀態,纔算正在的部署完成

[root@master images]# kubectl get pods --all-namespaces
//查看所有的名稱空間的pod(可以看到flannel網絡運行正常)

K8s(Kubernetes)的安裝部署

[root@master images]# kubectl get pod -n kube-system
//查看名稱空間爲kube-system的pod

K8s(Kubernetes)的安裝部署

查看當前節點信息

kubectl get node
//查看當前節點信息(已經準備好了)

K8s(Kubernetes)的安裝部署

四. node兩臺節點,導入鏡像並加入羣集

(1)導入鏡像

上傳所需鏡像包,也可以使用docker pull下載

K8s(Kubernetes)的安裝部署

[root@node01 images]# docker load < kube-proxy-1-15.tar && docker load -i myflannel-11-0.tar  && docker load -i pause-3-1.tar
[root@node01 images]# docker images
//查看本地鏡像

K8s(Kubernetes)的安裝部署

(2)node01和node02加入羣集

這時使用的命令是初始化羣集之後生成的令牌(只有24小時的時效)

K8s(Kubernetes)的安裝部署

[root@node01 ~]# kubeadm join 192.168.1.21:6443 --token z0vknh.s6ib4eu4f8bre2nu     --discovery-token-ca-cert-hash sha256:8da72cc83f45d1247f42ce888658129b43726fe2af4ffc0c4e79faedb4050359

(3)加入羣集之後查看一下

[root@master images]# kubectl get node

K8s(Kubernetes)的安裝部署

五. 各節點優化一下

(1)設置table鍵的默認間距;

[root@master ~]# vim .vimrc
set tabstop=2
[root@master ~]# source .vimrc 

(2)設置kubectl命令自動補全

[root@master ~]# yum  -y install bash-completion
[root@master ~]#  source /usr/share/bash-completion/bash_completion 
[root@master ~]# source <(kubectl completion bash)
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

(3)確認k8s羣集沒有問題,並設置爲開機自啓

master主機操作如下:

[root@master ~]# kubectl get pod -n kube-system   
#查看pod資源,類似於docker中的容器,確保返回的信息都是running
#“-n kube-system”:是k8s的名稱空間

K8s(Kubernetes)的安裝部署

master和node節點上都需要進行以下操作,以便設置爲開機自啓:

[root@master ~]# systemctl enable kubelet
[root@master ~]# systemctl enable docker 

設置爲開機自啓後,k8s羣集的配置基本完成了,現在可以重啓一下這三臺服務器,如果重啓後,執行下面的命令,狀態都還是running,則表示絕對沒有問題了。

[root@master ~]# kubectl get pod -n kube-system    #重啓後驗證狀態是否還都是running

參考的鏈接:https://www.jianshu.com/p/4dcfcde779e1
鏈接:https://blog.51cto.com/14154700/2447761

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