一、kubernetes(以下簡(jiǎn)稱k8s)和相關(guān)服務(wù)介紹
1.etcd:
- key-value鍵值存儲(chǔ)數(shù)據(jù)庫,用來存儲(chǔ)kubernetes的信息。
2.flannel:
- Flannel 是 CoreOS 團(tuán)隊(duì)針對(duì) Kubernetes 設(shè)計(jì)的一個(gè)覆蓋網(wǎng)絡(luò)(Overlay Network)工具,需要另外下載部署。我們知道當(dāng)我們啟動(dòng) Docker 后會(huì)有一個(gè)用于和容器進(jìn)行交互的 IP 地址,如果不去管理的話可能這個(gè) IP 地址在各個(gè)機(jī)器上是一樣的,并且僅限于在本機(jī)上進(jìn)行通信,無法訪問到其他機(jī)器上的 Docker 容器。Flannel 的目的就是為集群中的所有節(jié)點(diǎn)重新規(guī)劃 IP 地址的使用規(guī)則,從而使得不同節(jié)點(diǎn)上的容器能夠獲得同屬一個(gè)內(nèi)網(wǎng)且不重復(fù)的 IP 地址,并讓屬于不同節(jié)點(diǎn)上的容器能夠直接通過內(nèi)網(wǎng) IP 通信。
3.k8s master 組件:
- Kubernetes 集群中主要存在兩種類型的節(jié)點(diǎn),分別是 master 節(jié)點(diǎn),以及 minion 節(jié)點(diǎn)。Minion 節(jié)點(diǎn)是實(shí)際運(yùn)行 Docker 容器的節(jié)點(diǎn),負(fù)責(zé)和節(jié)點(diǎn)上運(yùn)行的 Docker 進(jìn)行交互,并且提供了代理功能。
- Master 節(jié)點(diǎn)負(fù)責(zé)對(duì)外提供一系列管理集群的 API 接口,并且通過和 Minion 節(jié)點(diǎn)交互來實(shí)現(xiàn)對(duì)集群的操作管理。整體架構(gòu)圖如下:
(1) kubectl
- 客戶端命令行工具,將接受的命令格式化后發(fā)送給kube-apiserver,作為整個(gè)系統(tǒng)的操作入口。
(2) kube-apiserver
- 作為整個(gè)系統(tǒng)的控制入口,以REST API服務(wù)提供接口。用戶和 kubernetes 集群交互的入口,封裝了核心對(duì)象的增刪改查操作,提供了 RESTFul 風(fēng)格的 API 接口,通過 etcd 來實(shí)現(xiàn)持久化并維護(hù)對(duì)象的一致性。
(3) kube-controller-manager
- 用來執(zhí)行整個(gè)系統(tǒng)中的后臺(tái)任務(wù),包括節(jié)點(diǎn)狀態(tài)狀況、Pod個(gè)數(shù)、Pods和Service的關(guān)聯(lián)等。主要是用于保證 replicationController 定義的復(fù)制數(shù)量和實(shí)際運(yùn)行的 pod 數(shù)量一致,另外還保證了從 service 到 pod 的映射關(guān)系總是最新的。
(4)kube-scheduler
- 負(fù)責(zé)節(jié)點(diǎn)資源管理,接受來自kube-apiserver創(chuàng)建Pods任務(wù),并分配到某個(gè)節(jié)點(diǎn)。負(fù)責(zé)集群資源的調(diào)度和管理,例如當(dāng)有 pod 異常退出需要重新分配機(jī)器時(shí),scheduler 通過一定的調(diào)度算法從而找到最合適的節(jié)點(diǎn)。
4.k8s minion組件 :
(1) kube-proxy
運(yùn)行在每個(gè)計(jì)算節(jié)點(diǎn)上,負(fù)責(zé)Pod網(wǎng)絡(luò)代理。定時(shí)從etcd獲取到service信息來做相應(yīng)的策略。運(yùn)行在 minion 節(jié)點(diǎn),負(fù)責(zé)為 pod 提供代理功能,會(huì)定期從 etcd 獲取 service 信息,并根據(jù) service 信息通過修改 iptables 來實(shí)現(xiàn)流量轉(zhuǎn)發(fā)(最初的版本是直接通過程序提供轉(zhuǎn)發(fā)功能,效率較低。),將流量轉(zhuǎn)發(fā)到要訪問的 pod 所在的節(jié)點(diǎn)上去。
(2) kubelet
運(yùn)行在每個(gè)計(jì)算節(jié)點(diǎn)上,作為agent負(fù)責(zé)和節(jié)點(diǎn)上的 Docker 交互,例如啟停容器,監(jiān)控運(yùn)行狀態(tài)等。接受分配該節(jié)點(diǎn)的Pods任務(wù)及管理容器,周期性獲取容器狀態(tài),反饋給kube-apiserver。
二、kubernetes 部署
1.安裝前工作:
(1)清理其它docker版本和依賴軟件:
yum -y remove docker
yum -y remove docker-selinux
yum remove docker-common-1.10.3-46.el7.centos.14.x86_64 -y
yum remove docker-common -y
2.安裝k8s master
yum install etcd
yum install kubernetes-master docker
安裝kubernetes-node 會(huì)自動(dòng)依賴安裝docker,所以可以在kubernetes-master上先安裝kubernetes-node,借此安裝docker然后在卸載kubernetes-node。
etcd配置:
# vim /etc/etcd/etcd.conf 將以下幾行進(jìn)行修改,完成后保存退出。
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.13.32.223:2379"
ETCD參數(shù)說明
重要的參數(shù)用途:
—data-dir 指定節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)目錄,這些數(shù)據(jù)包括節(jié)點(diǎn)ID,集群ID,集群初始化配置,Snapshot文件,若未指定—wal-dir,還會(huì)存儲(chǔ)WAL文件;
—wal-dir 指定節(jié)點(diǎn)的was文件的存儲(chǔ)目錄,若指定了該參數(shù),wal文件會(huì)和其他數(shù)據(jù)文件分開存儲(chǔ)。
—name 節(jié)點(diǎn)名稱
—initial-advertise-peer-urls 告知集群其他節(jié)點(diǎn)url.
— listen-peer-urls 監(jiān)聽URL,用于與其他節(jié)點(diǎn)通訊
— advertise-client-urls 告知客戶端url, 也就是服務(wù)的url
— initial-cluster-token 集群的ID
— initial-cluster 集群中所有節(jié)點(diǎn)
k8s 配置1:
#vim /etc/kubernetes/apiserver
KUBE_ETCD_SERVERS="--etcd_servers=http://192.168.17.101:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.73.18.0/24"
k8s 配置2:
#vim /etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--node-monitor-grace-period=10s --pod-eviction-timeout=10s"
k8s 配置3:
#vim /etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.17.101:8080"
啟動(dòng)順序:
systemctl enable etcd
systemctl enable kube-apiserver kube-scheduler kube-controller-manager
systemctl start etcd
systemctl start kube-apiserverkube-schedulerkube-controller-manager
最后還要執(zhí)行命令:
etcdctl mk/coreos.com/network/config'{"Network": “192.168.1.0/24" }'
這個(gè)不設(shè)置會(huì)導(dǎo)致后面flanneld起不來,進(jìn)而導(dǎo)致docker啟動(dòng)不了
3.安裝k8s minion:
yum install flannel
yum install kubernetes-node
docker會(huì)自動(dòng)安裝
安裝kubernetes-node 會(huì)自動(dòng)依賴安裝docker)
安裝flannel:(k8s master 可以用不用安裝)
Flannel是CoreOS團(tuán)隊(duì)針對(duì)Kubernetes設(shè)計(jì)的一個(gè)網(wǎng)絡(luò)規(guī)劃服務(wù),簡(jiǎn)單來說,它的功能是讓集群中的不同節(jié)點(diǎn)主機(jī)創(chuàng)建的Docker容器都具有全集群唯一的虛擬IP地址。
- flannel配置2:
#vim /etc/sysconfig/flanneld
FLANNEL_ETCD="http://10.13.32.223:2379"
FLANNEL_ETCD_KEY="/coreos.com/network"
- k8s minion配置1:
kubernetes node配置文件進(jìn)行修改:
#vim /etc/kubernetes/config
KUBE_MASTER="--master=http://10.13.32.223:8080"
- k8s minion配置2:
#vim /etc/kubernetes/kubelet`
KUBELET_HOSTNAME="--hostname_override=10.73.18.81"
KUBELET_API_SERVER="--api_servers=http://10.13.32.223:8080"
啟動(dòng)順序:(非常關(guān)鍵)
- 先啟動(dòng)docker:
systemctl enable docker
systemctl start docker
- 再啟動(dòng)flannel:
systemctl enable flanneld.service
systemctl restart flanneld.service
- 重啟docker:
systemctl restart docker
- 啟動(dòng)kubelete 和kube-proxy服務(wù):
systemctl enable kubelet kube-proxy
systemctl start kubelet kube-proxy
三、注意事項(xiàng)
1.etcd 需要初始化網(wǎng)段信息
安裝完etcd服務(wù)后,還要執(zhí)行命令:
etcdctl mk/coreos.com/network/config'{"Network": “192.168.1.0/24" }'
- 因?yàn)閒lannel 會(huì)依賴etcd的容器網(wǎng)段信息,這個(gè)不設(shè)置會(huì)導(dǎo)致后面flanneld起不來,進(jìn)而導(dǎo)致docker啟動(dòng)不了。
2.etcd 集群模式啟動(dòng)配置
/usr/lib/systemd/system/etcd.service文件中通過systemd啟動(dòng):
- docker 和k8s minion(安裝命令為yum install kubernetes-node) 會(huì)有依賴關(guān)系,安裝最好通過yum 命令來安裝讓其自動(dòng)解決。
- 或者通過二進(jìn)制文件進(jìn)行安裝,即從git-hub上下載編譯好的k8s,把k8s組件的各個(gè)二進(jìn)制文件拷貝到對(duì)應(yīng)的master和minion上,即可使用。