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架構:
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
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。
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關閉
安裝環境
網絡結構圖:
基於阿里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源是否正常:
將配置好的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
啓動docker
注意:以下只限於本地網絡可以訪問google環境下
啓動docker時,docker需要去鏡像倉庫下載每一個所依賴的鏡像文件,這些鏡像文件暫時獲取不到,建議將相關鏡像文件通過其他途徑下載到本地然後導入使用,或者推送到本地倉庫。
在這裏我們是借用別人此前提供的一種路徑來獲取並下載使用,因此在啓動之前,需要編輯vim /usr/lib/systemd/system/docker.service,在該文件中定義一個環境變量
[root@centos7 ~]# vim /usr/lib/systemd/system/docker.service
重新啓動,使配置生效:
[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查看狀態,會顯示代理信息。
kubernetes網絡依賴:
同時還要確保以下兩個參數值爲1。通過網橋轉發的IP數據包會iptables規則過濾,而這兩個選項將阻止過濾,Netfilter是默認情況下啓用了橋樑,如果不阻止會導致嚴重的混亂。
通過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
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”)
初始化時,報錯:
1)編輯配置文件:
[root@centos7 ~]# vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--fail-swap-on=false"
2)在初始化指定:
--ignore-preflight-errors=Swap
初始化完成之後,根據提示創建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節點信息:
可以看出master的狀態是未就緒(NotReady),之所以是這種狀態是因爲還缺少一個附件flannel或者Calico或者weave(這些都是k8s網絡解決方案),沒有網絡各Pod是無法通信的。
也可以通過檢查組件的健康狀態:
[root@centos7:/root] # kubectl get componentstatus
添加網絡組件
1.網絡組件之flannel
組件flannel在github上的地址:https://github.com/coreos/flannel
根據命令提示進行安裝:
[root@centos7:/root] # kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
僅僅通過執行安裝是不夠的還需要通過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:
查看當前節點上屬於kube-system名稱空間下的pods信息:
[root@centos7:/root] # kubectl get pods -n kube-system
查看節點下的命名空間信息:
[root@centos7:/root]
# kubectl get ns
可以查看出有三種命名空間: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"
將配置文件從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'
啓動節點上的服務:
[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"
在通過kubeadm join加入集羣時候,需要等到一會因爲在加入集羣時各節點正在創建相關pod。
在master節點上查看各節點狀態信息:
可以通過kubectl get pods -n kube-system -o wide查看flannel和proxy有兩個,一個在master節點上,一個在node01節點上。
[root@centos7:/root] # kubectl get pods -n kube-system -o wide