z1.2 Kubernetes基本架構(gòu)與常用術(shù)語
????Kubernetes(k8s)是自動化容器操作的開源平臺菇篡,這些操作包括部署绍在,調(diào)度和節(jié)點(diǎn)集群間擴(kuò)展。
Kubernetes主要核心組件:
? ? ? ? ectd:保存整個集群的狀態(tài)河泳;
? ? ? ? apiserver:提供資源操作的唯一入口躯概,認(rèn)證,授權(quán)纺腊,訪問控制畔咧,API注冊和發(fā)現(xiàn)等機(jī)制;
? ? ? ? controller manager:負(fù)責(zé)維護(hù)集群的狀態(tài)揖膜,比如故障檢測誓沸,自動擴(kuò)展,滾動更新等壹粟;
? ? ? ? scheduler:負(fù)責(zé)資源的調(diào)度拜隧,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的機(jī)器上;
? ? ? ? kubelet:負(fù)責(zé)維護(hù)容器的生命周期趁仙,負(fù)責(zé)Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理洪添;
? ? ? ? Container runtime:負(fù)責(zé)鏡像管理以及Pod和容器的真正運(yùn)行(CRI);
? ? ? ? Kube-proxy:負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡雀费;
1.2.1 Cluster
? ? Cluster是計算干奢、存儲和網(wǎng)絡(luò)資源的集合,Kubernetes利用這些資源運(yùn)行各種基于容器的應(yīng)用盏袄。
????kubernetes Cluster由Mater和Node組成忿峻,節(jié)點(diǎn)上運(yùn)行著若干Kubernetes服務(wù)。
1.2.1 Master
????Kubernetes中的Master是一臺運(yùn)行Kubernetes的主機(jī)辕羽,可以是物理機(jī)也可以是虛擬機(jī)逛尚,它是Kubernetes集群中的控制節(jié)點(diǎn),它負(fù)責(zé)完成整個Kubernetes集群的創(chuàng)建逛漫、管理和控制黑低,在Kubernetes集群中必不可少。
我們默認(rèn)只能在Master上使用kubectl工具完成Kubernetes具體的操作命令,如果Master宕機(jī)或是離線克握,我們所有的控制命令都會失效蕾管。因此Master非常重要,在生產(chǎn)環(huán)境中菩暗,Master一般會配置高可用集群服務(wù)解決其單點(diǎn)故障問題掰曾。
Kubernetes 1.4 開始Master上的關(guān)鍵服務(wù)都是以Docker 容器實例的方式運(yùn)行的,包括etcd服務(wù)停团。具體服務(wù)和其功能如下:
Kubernetes API Server ( kube-apiserver)旷坦,為kubernetes客戶端提供HTTP Rest API接口的關(guān)鍵服務(wù),是kubernetes中對象資源增佑稠、刪秒梅、查、改等操作的唯一入口舌胶,同時也是kubernetes集群控制的入口捆蜀。
Kubernetes Controller Manager ( kube-controller-manager),為Kubernetes提供統(tǒng)一的自動化控制服務(wù)幔嫂。
Kubernetes Scheduler (kube-scheduler)辆它,為Kubernetes提供資源調(diào)度的服務(wù),統(tǒng)一分配資源對象履恩。
Etcd Server(etcd)锰茉,為Kubernetes保存所有對象的鍵值對數(shù)據(jù)信息。
?1.2.2 Node
????在Kubernetes集群中切心,除了Master之外其它運(yùn)行Kubernetes服務(wù)的主機(jī)稱之為Node飒筑,在早期Kubernetes中稱其為Minion。Node也可以是物理機(jī)或虛擬機(jī)昙衅。Node是Kubernetes集群中任務(wù)的負(fù)載節(jié)點(diǎn)扬霜,Master經(jīng)過特殊設(shè)置后也可以作為Node負(fù)載任務(wù)定鸟。Kubernetes一般是由多個Node組成的而涉,我們建議Node的數(shù)量是N+2的。
????Node節(jié)點(diǎn)通過kubelet服務(wù)向Master注冊联予,可以實現(xiàn)動態(tài)的在Kubernetes集群中添加和刪除負(fù)載節(jié)點(diǎn)啼县。已加入Kubernetes集群中的Node節(jié)點(diǎn)還會通過kubelet服務(wù)動態(tài)的向Master提交其自身的資源信息。
1.2.3 Pod
????在Kubenetes中所有的容器均在Pod中運(yùn)行沸久,一個Pod可以承載一個或者多個相關(guān)的容器季眷。同一個Pod中的容器會部署在同一個物理機(jī)器上并且能夠共享資源,Pod是Kubernetes的基本操作單元,把相關(guān)的一個或多個容器構(gòu)成一個Pod卷胯,通常Pod里的容器運(yùn)行相同的應(yīng)用子刮,在Kubernetes集群中,一個Pod中的容器可以和另一個Node上的Pod容器直接通訊。
1.2.4 Service
Kubernetes Service定義了外界訪問一組特定Pod的方式挺峡,Service有自己的I和端口號葵孤,Service為Pod提供了負(fù)載均衡。
1.2.5 Replication Controller
????Replication Controller確保任何時候Kubernetes集群中有指定數(shù)量的Pod副本(replicas)在運(yùn)行橱赠, 如果少于指定數(shù)量的Pod副本(replicas)尤仍,Replication Controller會啟動新的容器(Container),反之會殺死多余的以保證數(shù)量不變狭姨。Replication Controller使用預(yù)先定義的Pod模板創(chuàng)建pods宰啦,一旦創(chuàng)建成功,Pod模板和創(chuàng)建的Pod沒有任何關(guān)聯(lián)饼拍,可以修改Pod模板而不會對已創(chuàng)建Pod有任何影響赡模。也可以直接更新通過Replication Controller創(chuàng)建的pod。對于利用pod模板創(chuàng)建的pod师抄,Replication Controller根據(jù)標(biāo)簽選擇器(Label Selector)來關(guān)聯(lián)纺裁,通過修改Pod的Label可以刪除對應(yīng)的Pod。
Replication Controller的定義包含如下的部分:
Pod的副本數(shù)目(Replicas)
用于篩選Pod的標(biāo)簽選擇器(Label Selector)
用于創(chuàng)建Pod的標(biāo)準(zhǔn)配置模板(Template)
1.2.6 Label
????Label用來給Kubernetes中的對象分組司澎。Label通過設(shè)置鍵值對(key-value)方式在創(chuàng)建Kubernetes對象的時候附屬在對象之上欺缘。一個Kubernetes對象可以定義多個Labels(key=value),并且key和value均由用戶自己指定挤安,同一組Label(key=value)可以指定到多個Kubernetes對象谚殊,Label可以在創(chuàng)建Kubernetes對象時設(shè)置,也可以在對象創(chuàng)建后通過kubectl或kubernetes api添加或刪除蛤铜。其他Kubernetes對象可以通過標(biāo)簽選擇器(Label Selector)選擇作用對象嫩絮。你可以把標(biāo)簽選擇器(Lebel Selector)看作關(guān)系查詢語言(SQL)語句中的where條件限定詞。
????Lable實現(xiàn)的是將指定的資源對象通過不同的Lable進(jìn)行捆綁围肥,靈活的實現(xiàn)多維度的資源分配剿干、調(diào)度、配置和部署穆刻。
2. Kubernetes集群
2.1 Master
2.1.1 etcd
[root@dpan ~]# vim /usr/lib/systemd/system/etcd.service
[Unit] Description=Etcd Server After=network.target [Service] Type=simple WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf # set GOMAXPROCS to number of processors ExecStart=/usr/bin/etcd Restart=on-failure [Install] WantedBy=multi-user.target
[root@dpan ~]# systemctl daemon-reload
[root@dpan ~]# systemctl? enable etcd.service
[root@dpan ~]# mkdir -p /var/lib/etcd/
[root@dpan ~]# systemctl start etcd.service
[root@dpan ~]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379
cluster is healthy
2.1.2?apiserver?
vi /etc/kubernetes/apiserver
KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=169.169.0.0/16 --servicce-node-port-range=1-65535 --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,DefaultStorageClass,ResourceQuota --logtostderr=true --log-dir=/var/log/kubernetes --v=2
[root@dpan ~]# systemctl enable kube-apiserver.service
[root@dpan ~]# systemctl start kube-apiserver
2.1.3??controller-manager?
vi /etc/kubernetes/controller-manager?
KUBE_CONTROLLER_MANAGER_ARGS="--master=http://192.168.0.23:8080 --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
[root@dpan ~]# systemctl enable kube-controller-manager.service
[root@dpan ~]# systemctl start kube-controller-manager.service
2.1.4? scheduler
vi /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="--master=http://192.168.0.23:8080 --logtostderr=true --log-dir=/var/log/kubernetes --v=2" ~ KUBE_SCHEDULER_ARGS="--master=http://192.168.0.23:8080 --logtostderr=true --log-dir=/var/log/kubernetes --v=2" ~
[root@dpan ~]# systemctl enable kube-scheduler.service [root@dpan ~]# systemctl start kube-scheduler.service
2.2 Node
2.2.1?kubelet
vi /usr/lib/systemd/system/kubelet.service
[Unit] Description=Kubernetes Kubelet Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=-/etc/kubernetes/kubelet ExecStart=/usr/bin/kubelet $KUBELET_ARGS Restart=on-failure KillMode=process [Install] WantedBy=multi-user.target
mkdir /var/lib/kubelet
mkdir /etc/kubernetes
vi /etc/kubernetes/kubelet
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=192.168.0.24 --logtostderr=false --log-dir=/var/log/kubernetes --v=2 "
[root@epan ~]# vi /etc/kubernetes/kubeconfig?
[root@epan ~]# systemctl enable kubelet
[root@epan ~]# systemctl start kubelet
2.2.2??proxy?
vi /usr/lib/systemd/system/kube-proxy.service
[Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.service Requires=network.service [Service] EnvironmentFile=-/etc/kubernetes/proxy ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 KillMode=process [Install] WantedBy=multi-user.target ~
[root@epan ~]# vi /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--master=http://192.168.0.23:8080 --hostname-override=192.168.0.24 --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
[root@epan ~]# systemctl enable kube-proxy
[root@epan ~]# systemctl start kube-proxy
2.2.3 Node啟動
[root@epan ~]# systemctl daemon-reload
[root@epan ~]# systemctl enable kubelet
[root@epan ~]# systemctl start kubelet
[root@epan ~]# systemctl status kubelet
[root@epan ~]# systemctl enable kube-proxy
[root@epan ~]# systemctl start kube-proxy
[root@epan ~]# systemctl status kube-proxy