首先,他是一個全新的基於容器技術的分佈式架構領先方案。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
- 容器編排
- 輕量級
- 開源
- 彈性伸縮
- 負載均衡git
Endpoint Slices
Kubernetes 集羣中網絡端點的可擴展跟蹤。
服務發現與負載均衡
無需修改您的應用程序便可使用陌生的服務發現機制。Kubernetes 爲容器提供了本身的 IP 地址和一個 DNS 名稱,而且能夠在它們之間實現負載平衡。
自我修復
從新啓動失敗的容器,在節點死亡時替換並從新調度容器,殺死不響應用戶定義的健康檢查的容器,而且在它們準備好服務以前不會它們公佈給客戶端。
自動裝箱
根據資源需求和其餘約束自動放置容器,同時不會犧牲可用性,將任務關鍵工做負載和盡力服務工做負載進行混合放置,以提升資源利用率並節省更多資源。
IPv4/IPv6 雙協議棧
Allocation of IPv4 and IPv6 addresses to Pods and Services
水平伸縮
使用一個簡單的命令、一個UI或基於CPU使用狀況自動對應用程序進行伸縮。github
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
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上須要運行容器服務後端
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
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
[root@master ~]# systemctl stop firewalld [root@master ~]# systemctl disable firewalld [root@master ~]# vim /etc/selinux/config
[root@master ~]# swapoff -a //臨時禁用swap [root@master ~]# free -h [root@master ~]# vim /etc/fstab
[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
[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
[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
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
建立本地緩存(三臺)
[root@master ~]# yum makecache fast
[root@master ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0
[root@node01 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0
[root@master ~]# systemctl enable kubelet
從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
[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
[root@master images]# sh image.sh
[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
[root@master images]# kubectl get node //查看當前節點信息
能夠看出master的狀態是未就緒(NotReady),之因此是這種狀態是由於還缺乏一個附件flannel,沒有網絡各Pod是沒法通訊的
[root@master images]# kubectl get cs
組件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網絡運行正常)
[root@master images]# kubectl get pod -n kube-system //查看名稱空間爲kube-system的pod
查看當前節點信息
kubectl get node //查看當前節點信息(已經準備好了)
上傳所需鏡像包,也可使用docker pull下載
[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 //查看本地鏡像
這時使用的命令是初始化羣集以後生成的令牌(只有24小時的時效)
[root@node01 ~]# kubeadm join 192.168.1.21:6443 --token z0vknh.s6ib4eu4f8bre2nu --discovery-token-ca-cert-hash sha256:8da72cc83f45d1247f42ce888658129b43726fe2af4ffc0c4e79faedb4050359
[root@master images]# kubectl get node
[root@master ~]# vim .vimrc set tabstop=2 [root@master ~]# source .vimrc
[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
[root@master ~]# kubectl get pod -n kube-system #查看pod資源,相似於docker中的容器,確保返回的信息都是running #「-n kube-system」:是k8s的名稱空間
[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