Kubernetes

what is kubernetes?

         Kubernetes是一個開源的,用於管理雲平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。

        Kubernetes這個詞起源於古希臘,是舵手的意思。而它的logo非常像一個“船舵”。kubernetes是第一個將“一切以服務爲中心,一切圍繞服務運轉”作爲指導思想的產品。構建kubernetes上的系統不進可以獨立運行在物理機、虛擬機集羣或者私有云上以及託管在公有云中。kubernetes方案另一個特點是自動化,如一個服務可以自我擴展、自我診斷,並且容易升級,在收到服務擴容的請求後,kubernetes會觸發調度流程,最終在選定目標節點上啓動相應數量的服務實例副本,這些副本在啓動成功後會自動加入負載均衡器中並生效,整個過程無須額外人工操作。

        通常把kubernetes看作docker的上層架構,kubernetes以docker爲基礎打造了一個雲計算時代的全新分佈式系統架構。kubernetes架構中不僅僅只支持docker一種容器,還支持另一種容器技術Rocket。

kubernetes特性:

  • 自動裝箱、自我修復、水平擴展,服務發現和負載均衡,自動發佈和回滾

  • 密鑰和配置管理,存儲編排,批量處理執行

kubernetes核心術語:

pod、 label, service, ingress..

kubernetes架構:

2019-03-29_152515.jpg


Kubernetes主要由以下幾個核心組件組成:

Master:

  • kube controller manager負責維護集羣的狀態,比如故障檢測、自動擴展、滾動更新等;

  • kube scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;

  • kube apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;

  • etcd保存了整個集羣的狀態;

Node:

  • kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;

  • kube-proxy負責爲Service提供cluster內部的服務發現和負載均衡;

  • Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);

Kubernetes安裝

kubernet安裝方式一:

1、針對於master節點

將API Server、etcd、controller-manager、scheduler各組件進行yum install、編譯安裝或者展開安裝的方式手動直接安裝在master節點主機上,作爲系統級守護進程運行。

2、針對於node節點

將kube-proxy、kubelet、docker、flannel各組件進行yum install或下載已預製好的二進制程序包手動安裝在node節點主機上,作爲系統級守護進程運行。

此部署方式非常的“繁瑣”,出於安全方面的考慮,各組件之間通信都需要配置CA和證書。

注:此部署方式的缺點就是如果master宕機了,需要手動進行啓動這些系統級的守護進程

源碼包獲取地址:https://github.com/kubernetes/kubernetes/releases

2019-03-29_235205.jpg

2019-03-29_235250.jpg

kubernet安裝方式二:

通過k8s官方所提供的專門部署集羣的管理工具kubeadm進行安裝。

每一個節點主機上包括master節點都要手動安裝並運行docker,同時也都要手動安裝並運行kubelet。如果將第一個節點初始化爲master節點,在執行初始化這個步驟,其實就是通過kubeadm工具將API Server、etcd、controller-manager、scheduler各組件運行爲Pod,也就是跑在docker上。而其他node節點,因已經運行了kubelet、docker組件,剩下的kube-proxy組件也是要運行在Pod上。

kubelet:負責能運行Pod化容器的核心組件

docker:運行容器的引擎

但是以上master節點上的Pod都是靜態Pod(static Pod),並不受k8s自身管理,只是運行爲Pod形式而已,也可運行爲自託管Pod。

2019-03-31_150325.jpg

flannel組件也是運行在Pod上的系統級守護進程,起到各node節點通信作用。

kubernetes相關資料:

kubeadm資料:https://github.com/kubernetes/kubeadm

前提條件

1、各主機基於主機名進行通信:/etc/hosts

如:

[root@centos7 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.137.100 centos7 
192.168.137.201 centos7-1 
192.168.137.202 centeos7-2

2、時間同步

3、保持firewalld和iptables.service關閉

安裝環境

2019-03-30_160508.jpg

網絡結構圖:

2019-03-31_151846.jpg

基於阿里yum源進行Kubernetes集羣安裝

一.在主機名centos7(master)安裝

下載docker源:

[root@centos7 yum.repos.d]#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

配置kubernetes源:

    這裏使用阿里雲提供的yum源:

[root@centos7 ~]# 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/rpm-package-key.gpg
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1

    檢查yum源是否正常:

2019-03-29_235951.jpg

    將配置好的kubernetesYum源和dockerYum源下發到node節點上:

[root@centos7 ~]# ansible slave -m copy -a 'src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo'
[root@centos7 ~]# ansible slave -m copy -a 'src=/etc/yum.repos.d/docker.repo dest=/etc/yum.repos.d/docker.repo'

    master節點上安裝docker及kubernetes程序包:

[root@centos7 ~]# yum install docker-ce kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0

2019-03-30_160342.jpg

啓動docker

注意:以下只限於本地網絡可以訪問google環境下

    啓動docker時,docker需要去鏡像倉庫下載每一個所依賴的鏡像文件,這些鏡像文件暫時獲取不到,建議將相關鏡像文件通過其他途徑下載到本地然後導入使用,或者推送到本地倉庫。

    在這裏我們是借用別人此前提供的一種路徑來獲取並下載使用,因此在啓動之前,需要編輯vim /usr/lib/systemd/system/docker.service,在該文件中定義一個環境變量

[root@centos7 ~]# vim /usr/lib/systemd/system/docker.service

2019-03-29_181825.jpg

重新啓動,使配置生效:

[root@centos7 ~]# systemctl daemon-reload  #修改了的unit文件,要通知systemd重載此配置文件
[root@centos7 ~]# systemctl start docker

在啓動docker時發現報錯,報錯信息爲:"Error starting daemon: Error initializing network controller: Error c.."

解決方法:rm -rf /var/lib/docker/network/files/* 重新啓動即可。

通過docker info查看狀態,會顯示代理信息。

2019-03-30_001014.jpg

kubernetes網絡依賴:

同時還要確保以下兩個參數值爲1。通過網橋轉發的IP數據包會iptables規則過濾,而這兩個選項將阻止過濾,Netfilter是默認情況下啓用了橋樑,如果不阻止會導致嚴重的混亂。

2019-03-29_214356.jpg

通過rpm -ql查看安裝完成之後生成的文件:

[root@centos7 ~]# rpm -ql kubelet
/etc/kubernetes/manifests    #清單目錄
/etc/sysconfig/kubelet        #配置文件
/usr/bin/kubelet
/usr/lib/systemd/system/kubelet.service

設定docker和kubelet系統默認啓動:

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

然後,通過kubeadm init命令初始化即可完成集羣安裝。

由於我的本地網絡不能訪問google,可以從docker鏡像倉庫中pull下kubernetes的版本爲v1.12.2組件鏡像文件:

首先設定docker鏡像加速器,方便下載鏡像:

[root@centos7:/root]
# vim /etc/docker/daemon.json
 {
      "registry-mirrors" : ["https://registry.docker-cn.com"]
 }

從docker鏡像倉庫中拉取鏡像文件:

[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-apiserver:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-scheduler:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-proxy:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/pause:3.1
[root@centos7 ~]# docker pull mirrorgooglecontainers/etcd:3.2.24
[root@centos7 ~]# docker pull coredns/coredns:1.2.6

2019-03-30_161430.jpg

mirrorgooglecontainers/pause爲基礎架構容器,可以不用啓動,其他容器可以將它當成模板進行網絡、存儲卷複製。

mirrorgooglecontainers/kube-proxy 作爲附件運行自託管與k8s之上,來幫忙負責生成service資源相關的iptables或者ipvs規則,在1.11版本默認使用ipvs。

將拉取下的鏡像tag更新爲Kubeadm初始化時所能識別的標籤鏡像:

[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-apiserver:v1.13.3 k8s.gcr.io/kube-apiserver:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.3 k8s.gcr.io/kube-controller-manager:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-scheduler:v1.13.3 k8s.gcr.io/kube-scheduler:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-proxy:v1.13.3 k8s.gcr.io/kube-proxy:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
[root@centos7 ~]# docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
[root@centos7 ~]# docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

初始化kubernetes:

[root@centos7 ~]# kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

    --kubernetes-verison:指定初始化版本,默認是1.11.0

    --pod-network-cidr:指定pod網絡的IP地址範圍。如果設置,控制平面將爲每個節點自動分配CIDRs。

    --service-cidr:爲service VIPs使用不同的IP地址。(默認“10.96.0.0/12”)

初始化時,報錯:

2019-03-30_163136.jpg

1)編輯配置文件:

[root@centos7 ~]# vim /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

2)在初始化指定:

--ignore-preflight-errors=Swap

2019-03-30_233241.jpg初始化完成之後,根據提示創建kube目錄,添加kubectl配置:

這裏默認使用root用戶,可以根據需要創建普通用戶執行。

[root@centos7:/root]
# mkdir -p $HOME/.kube
[root@centos7:/root]
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

由於是root用戶不用在去執行第三條命令更改文件屬性。

執行完成之後,查看Node節點信息:

2019-03-30_233914.jpg

可以看出master的狀態是未就緒(NotReady),之所以是這種狀態是因爲還缺少一個附件flannel或者Calico或者weave(這些都是k8s網絡解決方案),沒有網絡各Pod是無法通信的。

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

[root@centos7:/root]
#  kubectl get componentstatus

2019-03-30_234114.jpg
添加網絡組件

1.網絡組件之flannel

組件flannel在github上的地址:https://github.com/coreos/flannel

2019-03-30_234654.jpg

根據命令提示進行安裝:

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

2019-03-30_234906.jpg

僅僅通過執行安裝是不夠的還需要通過docker images命令查看flannel鏡像是否已經拉取下來。

2.網絡組件之Weave

網絡解決方案weave官方地址:https://www.weave.works/docs/net/latest/kubernetes/kube-addon/

weave相關介紹,僅供參考:https://blog.51cto.com/dengaosky/2069478

執行安裝,即可:

# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

安裝完weave插件之後,查看節點狀態信息,會發現master狀態已經處於ready:

2019-03-31_110353.jpg

查看當前節點上屬於kube-system名稱空間下的pods信息:

[root@centos7:/root]
# kubectl get pods -n kube-system

2019-03-31_110920.jpg

查看節點下的命名空間信息:

[root@centos7:/root]

# kubectl get ns

2019-03-31_111137.jpg

可以查看出有三種命名空間:default(kubectl get pods默認default),kube-public,kube-system(系統級的pod都在kube-system命名空間下)

二.Node節點安裝

其餘兩個Node節點安裝

[root@centos7:/root]
# ansible slave -m shell -a "wget -O /root/rpm-package-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg"
[root@centos7:/root]
# ansible slave -m shell -a "wget -O /root/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg"
[root@centos7:/root]
# ansible slave -m shell -a "rpm --import /root/rpm-package-key.gpg"
[root@centos7:/root]
# ansible slave -m shell -a "rpm --import /root/yum-key.gpg "
[root@centos7:/root]
# ansible slave -m shell -a "yum install -y docker-ce kubelet-1.13.3 kubeadm-1.13.3 kubernetes-cni-0.6.0"

啓動bridge-nf方式:

[root@centos7:/root]
# ansible slave -m copy -a "src=/etc/sysctl.conf dest=/etc/sysctl.conf"
[root@centos7:/root]
# ansible slave -m shell -a "sysctl -P"

2019-03-31_122203.jpg

將配置文件從master端copy到node節點上:

[root@centos7:/root]
# ansible slave -m copy -a "src=/etc/sysconfig/kubelet dest=/etc/sysconfig/kubelet "
[root@centos7:/root]
# ansible slave -m copy -a 'src=/etc/docker/daemon.json dest=/etc/docker/daemon.json'

2019-03-31_114417.jpg

啓動節點上的服務:

[root@centos7:/root]
# ansible slave -m shell -a "systemctl start docker"
[root@centos7:/root]
# ansible slave -m shell -a "systemctl enable docker"
[root@centos7:/root]
# ansible slave -m shell -a "systemctl enable kubelet"

在node節點下載kube-proxy ,paue鏡像並修改鏡像標籤:

[root@centos7:/root]
# ansible slave -m shell -a "docker pull mirrorgooglecontainers/kube-proxy:v1.13.3"
[root@centos7:/root]
# ansible slave -m shell -a "docker pull mirrorgooglecontainers/pause:3.1"
[root@centos7:/root]
# ansible slave -m shell -a "docker tag mirrorgooglecontainers/kube-proxy:v1.13.3 k8s.gcr.io/kube-proxy:v1.13.3"
[root@centos7:/root]
# ansible slave -m shell -a "docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1"

將node節點加入集羣:

[root@centos7:/root]
# ansible slave -m shell -a "kubeadm join 192.168.137.100:6443 --token frs7us.e7iukbax80zeid7s --discovery-token-ca-cert-hash sha256:ea10674978cd4bb224c7006f013e1745e87bf18059b02a507eb082baf8ffab25 --ignore-preflight-errors=Swap"

2019-03-31_122954.jpg

在通過kubeadm join加入集羣時候,需要等到一會因爲在加入集羣時各節點正在創建相關pod。

2019-03-31_144850.jpg

在master節點上查看各節點狀態信息:

2019-03-31_144403.jpg

可以通過kubectl get pods -n kube-system -o wide查看flannel和proxy有兩個,一個在master節點上,一個在node01節點上。

[root@centos7:/root]
# kubectl get pods -n kube-system -o wide

2019-03-31_145005.jpg


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