K8s(Kubernetes)的安裝部署

一. Kubernetes 系統簡介

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

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

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

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

1. Kubernetes優點:

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

2. Kubernetes 特性

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

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調度)的進程sql

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引擎,負責本機容器的建立和管理工做docker

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

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
連接:http://www.javashuo.com/article/p-ykytdane-w.html

相關文章
相關標籤/搜索