1.1 Kubernetes簡介
1.1.1 什麼是Kubernetes
Kubernetes (通常稱為K8s,K8s是將8個字母“ubernete”替換為“8”的縮寫) 是用於自動部署、擴充套件和管理容器化(containerized)應用程式的開源系統。Google設計並捐贈給Cloud Native Computing Foundation(今屬Linux基金會)來使用的。
它旨在提供“跨主機叢集的自動部署、擴充套件以及執行應用程式容器的平臺”。它支援一系列容器工具, 包括Docker等。CNCF於2017年宣佈首批Kubernetes認證服務提供商(KCSPs),包含IBM、MIRANTIS、華為、inwinSTACK迎棧科技等服務商。
1.1.2 Kubernetes發展史
Kubernetes (希臘語"舵手" 或 "飛行員") 由Joe Beda,Brendan Burns和Craig McLuckie創立,並由其他谷歌工程師,包括Brian Grant和Tim Hockin進行加盟創作,並由谷歌在2014年首次對外宣佈 。它的開發和設計都深受谷歌的Borg系統的影響,它的許多頂級貢獻者之前也是Borg系統的開發者。在谷歌內部,Kubernetes的原始代號曾經是Seven,即星際迷航中友好的Borg(博格人)角色。Kubernetes標識中舵輪有七個輪輻就是對該專案代號的致意。
Kubernetes v1.0於2015年7月21日釋出。隨著v1.0版本釋出,谷歌與Linux 基金會合作組建了Cloud Native Computing Foundation (CNCF)並把Kubernetes作為種子技術來提供。
Rancher Labs在其Rancher容器管理平臺中包含了Kubernetes的釋出版。Kubernetes也在很多其他公司的產品中被使用,比如Red Hat在OpenShift產品中,CoreOS的Tectonic產品中, 以及IBM的IBM雲私有產品中。
1.1.3 Kubernetes 特點
1、可移植: 支援公有云,私有云,混合雲,多重雲(multi-cloud)
2、可擴充套件: 模組化, 外掛化, 可掛載, 可組合
3、自動化: 自動部署,自動重啟,自動複製,自動伸縮/擴充套件
4、快速部署應用,快速擴充套件應用
5、無縫對接新的應用功能
6、節省資源,優化硬體資源的使用
1.1.4 Kubernetes規劃元件
參考文件:http://docs.kubernetes.org.cn/249.html
Kubernetes定義了一組構建塊,它們可以共同提供部署、維護和擴充套件應用程式的機制。組成Kubernetes的元件設計為鬆耦合和可擴充套件的,這樣可以滿足多種不同的工作負載。可擴充套件性在很大程度上由Kubernetes API提供——它被作為擴充套件的內部元件以及Kubernetes上執行的容器等使用。
Pod
Kubernetes的基本排程單元稱為“pod”。它可以把更高階別的抽象內容增加到容器化元件。一個pod一般包含一個或多個容器,這樣可以保證它們一直位於主機上,並且可以共享資源。Kubernetes中的每個pod都被分配一個唯一的(在叢集內的)IP地址這樣就可以允許應用程式使用埠,而不會有衝突的風險。
Pod可以定義一個卷,例如本地磁碟目錄或網路磁碟,並將其暴露在pod中的一個容器之中。pod可以通過Kubernetes API手動管理,也可以委託給控制器來管理。
標籤和選擇器
Kubernetes使客戶端(使用者或內部元件)將稱為“標籤”的鍵值對附加到系統中的任何API物件,如pod和節點。相應地,“標籤選擇器”是針對匹配物件的標籤的查詢。
標籤和選擇器是Kubernetes中的主要分組機制,用於確定操作適用的元件。
例如,如果應用程式的Pods具有系統的標籤 tier ("front-end", "back-end", for example) 和一個 release_track ("canary", "production", for example),那麼對所有"back-end" 和 "canary" 節點的操作可以使用如下所示的標籤選擇器:
tier=back-end AND release_track=canary
控制器
控制器是將實際叢集狀態轉移到所需叢集狀態的對帳迴圈。它通過管理一組pod來實現。一種控制器是一個“複製控制器”,它通過在叢集中執行指定數量的pod副本來處理複製和縮放。如果基礎節點出現故障,它還可以處理建立替換pod。
其它控制器,是核心Kubernetes系統的一部分包括一個“DaemonSet控制器”為每一臺機器(或機器的一些子集)上執行的恰好一個pod,和一個“作業控制器”用於執行pod執行到完成,例如作為批處理作業的一部分。控制器管理的一組pod由作為控制器定義的一部分的標籤選擇器確定。
服務
Kubernetes服務是一組協同工作的pod,就像多層架構應用中的一層。構成服務的pod組通過標籤選擇器來定義。
Kubernetes通過給服務分配靜態IP地址和域名來提供服務發現機制,並且以輪詢排程的方式將流量負載均衡到能與選擇器匹配的pod的IP地址的網路連線上(即使是故障導致pod從一臺機器移動到另一臺機器)。預設情況下,一個服務會暴露在叢集中(例如,多個後端pod可能被分組成一個服務,前端pod的請求在它們之間負載平衡);但是,一個服務也可以暴露在叢集外部(例如,從客戶端訪問前端pod)。
1.1.5 Kubernetes核心元件
Kubernetes遵循master-slave architecture。Kubernetes的元件可以分為管理單個的 node 元件和控制平面的一部分的元件。
Kubernetes Master是叢集的主要控制單元,用於管理其工作負載並指導整個系統的通訊。Kubernetes控制平面由各自的程式組成,每個元件都可以在單個主節點上執行,也可以在支援high-availability clusters的多個主節點上執行。
Kubernetes主要由以下幾個核心元件組成:
元件名稱 |
說明 |
etcd |
儲存了整個叢集的狀態; |
apiserver |
提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制; |
controller manager |
負責維護叢集的狀態,比如故障檢測、自動擴充套件、滾動更新等; |
scheduler |
負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上; |
kubelet |
負責維護容器的生命週期,同時也負責Volume(CVI)和網路(CNI)的管理; |
Container runtime |
負責映象管理以及Pod和容器的真正執行(CRI); |
kube-proxy |
負責為Service提供cluster內部的服務發現和負載均衡; |
核心元件結構圖
除了核心元件,還有一些推薦的Add-ons:
元件名稱 |
說明 |
kube-dns |
負責為整個叢集提供DNS服務 |
Ingress Controller |
為服務提供外網入口 |
Heapster |
提供資源監控 |
Dashboard |
提供GUI |
Federation |
提供跨可用區的叢集 |
Fluentd-elasticsearch |
提供叢集日誌採集、儲存與查詢 |
1.1.6 分層架構
Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,如下圖所示:
分層說明:
分層結構 |
說明 |
|
核心層 |
Kubernetes最核心的功能,對外提供API構建高層的應用,對內提供外掛式應用執行環境 |
|
應用層 |
部署(無狀態應用、有狀態應用、批處理任務、叢集應用等)和路由(服務發現、DNS解析等) |
|
管理層 |
系統度量(如基礎設施、容器和網路的度量),自動化(如自動擴充套件、動態Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等) |
|
介面層 |
kubectl命令列工具、客戶端SDK以及叢集聯邦 |
|
生態系統 |
在介面層之上的龐大容器叢集管理排程的生態系統,可以劃分為兩個範疇 |
|
Kubernetes外部 |
日誌、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps等 |
|
Kubernetes內部 |
CRI、CNI、CVI、映象倉庫、Cloud Provider、叢集自身的配置和管理等 |
1.2 部署Kubernetes叢集
1.2.1 主機環境說明
系統版本說明
[root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@k8s-master ~]# uname -r 3.10.0-327.el7.x86_64 [root@k8s-master ~]# getenforce Disabled [root@k8s-master ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead)
主機IP規劃
主機名 |
IP |
功能 |
k8s-master |
10.0.0.11/172.16.1.11 |
Master、etcd、registry |
k8s-node-1 |
10.0.0.12/172.16.1.12 |
node1 |
k8s-node-2 |
10.0.0.13/172.16.1.13 |
node2 |
設定hosts解析
[root@k8s-master ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.11 k8s-master 10.0.0.12 k8s-node-1 10.0.0.13 k8s-node-2
1.2.2 安裝軟體包
在三個節點上分別操作
[root@k8s-master ~]# yum install etcd docker kubernetes flannel -y [root@k8s-node-1 ~]# yum install docker kubernetes flannel -y [root@k8s-node-2 ~]# yum install docker kubernetes flannel -y
安裝的軟體版本說明
[root@k8s-master ~]# rpm -qa etcd docker kubernetes flannel flannel-0.7.1-2.el7.x86_64 docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64 kubernetes-1.5.2-0.7.git269f928.el7.x86_64 etcd-3.2.11-1.el7.x86_64
1.2.3 修改配置etcd
yum安裝的etcd預設配置檔案在/etc/etcd/etcd.conf。
最終配置檔案
[root@k8s-master ~]# grep -Ev '^$|#' /etc/etcd/etcd.conf ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_NAME="default" ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"
啟動etcd
[root@k8s-master ~]# systemctl enable etcd [root@k8s-master ~]# systemctl start etcd
測試etcd
etcdctl set testdir/testkey0 0 etcdctl set testdir/testkey0 0 [root@k8s-master ~]# etcdctl -C http://10.0.0.11:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.11:2379 cluster is healthy
1.2.4 配置並啟動kubernetes
/etc/kubernetes/apiserver配置檔案內容
[root@k8s-master ~]# grep -Ev '^$|#' /etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" KUBE_API_ARGS=""
/etc/kubernetes/config配置檔案
[root@k8s-master ~]# grep -Ev '^$|#' /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://10.0.0.11:8080"
啟動服務
systemctl enable kube-apiserver.service systemctl start kube-apiserver.service systemctl enable kube-controller-manager.service systemctl start kube-controller-manager.service systemctl enable kube-scheduler.service systemctl start kube-scheduler.service
1.2.5 部署配置node
/etc/kubernetes/config配置檔案
[root@k8s-node-1 ~]# grep -Ev '^$|#' /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://10.0.0.11:8080" [root@k8s-node-1 ~]# grep -Ev '^$|#' /etc/kubernetes/kubelet KUBELET_ADDRESS="--address=0.0.0.0" KUBELET_HOSTNAME="--hostname-override=10.0.0.12" KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS=""
/etc/kubernetes/config配置檔案
[root@k8s-node-2 ~]# grep -Ev '^$|#' /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://10.0.0.11:8080" [root@k8s-node-2 ~]# grep -Ev '^$|#' /etc/kubernetes/kubelet KUBELET_ADDRESS="--address=0.0.0.0" KUBELET_HOSTNAME="--hostname-override=10.0.0.13" KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS=""
啟動
systemctl enable kubelet.service systemctl start kubelet.service systemctl enable kube-proxy.service systemctl start kube-proxy.service
在master上檢視叢集中節點及節點狀態
# kubectl -s http://10.0.0.11:8080 get node [root@k8s-master ~]# kubectl -s http://10.0.0.11:8080 get node NAME STATUS AGE 10.0.0.12 Ready 49s 10.0.0.13 Ready 56s [root@k8s-master ~]# kubectl get nodes NAME STATUS AGE 10.0.0.12 Ready 1m 10.0.0.13 Ready 1m
至此Kubernetes基礎部署完成
1.2.6 Kubernetes其他安裝方法
二進位制安裝
kubuadm 安裝
minikube 安裝
ansible部署:https://github.com/gjmzj/kubeasz
1.3 建立覆蓋網路--Flannel
1.3.1 配置Flannel(所有節點操作)
安裝軟體包
yum install flannel -y
修改配置檔案
[root@k8s-master ~]# grep "^[a-Z]" /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379" FLANNEL_ETCD_PREFIX="/atomic.io/network"
1.3.2 配置etcd中關於flannel的key
Flannel使用Etcd進行配置,來保證多個Flannel例項之間的配置一致性,所以需要在etcd上進行如下配置:(‘/atomic.io/network/config’這個key與上文/etc/sysconfig/flannel中的配置項FLANNEL_ETCD_PREFIX是相對應的,錯誤的話啟動就會出錯)
配置網路範圍
etcdctl mk /atomic.io/network/config '{ "Network": "172.16.0.0/16" }'
操作建立網路
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "172.16.0.0/16" }' { "Network": "172.16.0.0/16" }
master節點操作
systemctl enable flanneld.service systemctl start flanneld.service service docker restart systemctl restart kube-apiserver.service systemctl restart kube-controller-manager.service systemctl restart kube-scheduler.service
node節點操作
systemctl enable flanneld.service systemctl start flanneld.service service docker restart systemctl restart kubelet.service systemctl restart kube-proxy.service
修改配置檔案
[root@k8s-master ~]# cat /etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" KUBE_API_ARGS=""
至此Flannel網路配置完成
1.4 建立一個簡單的pod
Pod是K8s叢集中所有業務型別的基礎
Pod是在K8s叢集中執行部署應用或服務的最小單元,它是可以支援多容器的。
Pod的設計理念是支援多個容器在一個Pod中共享網路地址和檔案系統。
POD控制器Deployment、Job、DaemonSet和PetSet
1.4.1 寫一個編排yaml格式
kubenetes裡面的建立service、rc、pod都是這種形式(另外一種是json)
關於yaml參考:http://t.cn/RK0Jlwu
[root@k8s-master ~]# cat /etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" KUBE_API_ARGS=""
1.4.2 啟動一個pod
[root@k8s-master ~]# kubectl create -f hello.yaml pod "hello-world" created
檢視預設namespace下的pods
[root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE hello-world 0/1 ContainerCreating 0 8s
檢視pod的詳細資訊
[root@k8s-master ~]# kubectl describe pod hello-world Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 4m 4m 1 {default-scheduler} Normal Scheduled Successfully assigned hello-world to 10.0.0.13 4m 1m 5 {kubelet 10.0.0.13} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" 3m 14s 13 {kubelet 10.0.0.13} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
該錯誤的解決方法: yum install python-rhsm* -y
獲取指定pods詳細資訊
kubectl describe pods yourpodname
獲取已執行pod狀態
kubectl get pods -o wide
下載pod-infrastructure映象包
docker tag docker.io/tianyebj/pod-infrastructure:latest registry.access.redhat.com/rhel7/pod-infrastructure:lates
1.4.3 pod其他操作
刪除pod,重新建立
[root@k8s-master ~]# kubectl delete -f hello.yaml pod "hello-world" deleted [root@k8s-master ~]# kubectl create -f hello.yaml pod "hello-world" created
檢視狀態
[root@k8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-web 1/1 ImagePullBackOff 0 1m 172.16.53.2 10.0.0.13
1.5 Replication Controller
RC是K8s叢集中最早的保證Pod高可用的API物件。通過監控執行中的Pod來保證叢集中執行指定數目的Pod副本。指定的數目可以是多個也可以是1個;少於指定數目,RC就會啟動執行新的Pod副本;多於指定數目,RC就會殺死多餘的Pod副本。
即使在指定數目為1的情況下,通過RC執行Pod也比直接執行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有1個Pod在執行。
1.5.1 簡單rc配置
[root@k8s-master ~]# kubectl get rc
始終保證有一個在活著
更新rc檔案
[root@k8s-master ~]# kubectl replace -f nginx.yml
nginx.yml檔案資訊
[root@k8s-master ~]# vim nginx.yml apiVersion: v1 kind: Pod metadata: name: nginx-2 spec: restartPolicy: Never containers: - name: nginx image: "docker.io/nginx:latest"
對現有已建立資源直進行修改
[root@k8s-master ~]# kubectl edit rc nginx
可以調整數量即使生效
1.5.2 rs實現灰度釋出
RS是新一代RC,提供同樣的高可用能力,區別主要在於RS後來居上,能支援更多中的匹配模式。副本集物件一般不單獨使用,而是作為部署的理想狀態引數使用。
是K8S 1.2中出現的概念,是RC的升級。一般和Deployment共同使用。
部署表示使用者對K8s叢集的一次更新操作。部署是一個比RS應用模式更廣的API物件,可以是建立一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是建立一個新的RS,然後逐漸將新RS中副本數增加到理想狀態,將舊RS中的副本數減小到0的複合操作;
這樣一個複合操作用一個RS是不太好描述的,所以用一個更通用的Deployment來描述。
以K8s的發展方向,未來對所有長期伺服型的的業務的管理,都會通過Deployment來管理。
Deployment是對RC的升級,與RC的相似度超過90%。
web-rc.yaml檔案內容
[root@k8s-master ~]# cat web-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 3 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql' - name: MYSQL_SERVICE_PORT value: '3306'
建立叢集
[root@k8s-master ~]# kubectl create -f web-rc.yaml
對叢集進行升級操作
將叢集內容器自動升級到新版本的容器
[root@k8s-master ~]# kubectl rolling-update myweb -f web-rc2.yaml
web-rc2.yaml配置檔案內容
[root@k8s-master ~]# cat web-rc2.yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb-2 spec: replicas: 3 selector: app: myweb-2 template: metadata: labels: app: myweb-2 spec: containers: - name: myweb-2 image: kubeguide/tomcat-app:v2 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql' - name: MYSQL_SERVICE_PORT value: '3306'
升級後的回滾
使用新的檔案,進行升級操作可達到回滾的目的,參考:https://github.com/kubeguide/samplecode
[root@k8s-master ~]# kubectl rolling-update myweb-2 -f web-rc.yaml
1.5.3 rc小結
? RC裡包括完整的POD定義模板
? RC通過Label Selector機制實現對POD副本的自動控制。
? 通過改變RC裡的POD副本以實現POD的擴容和縮容
? 通過改變RC裡POD模組中的映象版本,可以實現POD的滾動升級。
1.6 服務(Service)
1.6.1 Service作用
RC、RS和Deployment只是保證了支撐服務的POD的數量,但是沒有解決如何訪問這些服務的問題。一個Pod只是一個執行服務的例項,隨時可能在一個節點上停止,在另一個節點以一個新的IP啟動一個新的Pod,因此不能以確定的IP和埠號提供服務。
要穩定地提供服務需要服務發現和負載均衡能力。服務發現完成的工作,是針對客戶端訪問的服務,找到對應的的後端服務例項。
在K8叢集中,客戶端需要訪問的服務就是Service物件。每個Service會對應一個叢集內部有效的虛擬IP,叢集內部通過虛擬IP訪問一個服務。
在K8s叢集中微服務的負載均衡是由Kube-proxy實現的。Kube-proxy是K8s叢集內部的負載均衡器。它是一個分散式代理伺服器,在K8s的每個節點上都有一個;這一設計體現了它的伸縮性優勢,需要訪問服務的節點越多,提供負載均衡能力的Kube-proxy就越多,高可用節點也隨之增多。
1.6.2 測試service
[root@k8s-master ~]# vim myweb-svc.yaml apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
啟動叢集
[root@k8s-master ~]# kubectl create -f myweb-svc.yaml service "myweb" created [root@k8s-master ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 6h myweb 10.254.247.21 <nodes> 8080:30001/TCP 12s
瀏覽器訪問測試
1.6.3 service原理圖
網訪問node ip 轉到cluster ip上 在進行pod 分發 rr輪詢
kubectl create -f web-svc.yaml [root@k8s-master ~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 4h myweb 10.254.168.71 <nodes> 8080:30001/TCP 15s
1.6.4 K8S三種IP
型別 |
說明 |
Node IP |
節點裝置的IP,如物理機,虛擬機器等容器宿主的實際IP。 |
Pod IP |
Pod 的IP地址,是根據docker0網格IP段進行分配的。 |
Cluster IP |
Service的IP,是一個虛擬IP,僅作用於service物件,由k8s管理和分配,需要結合service port才能使用,單獨的IP沒有通訊功能,叢集外訪問需要一些修改。 |
1.7 部署DashBoard
參考文件:http://www.cnblogs.com/zhenyuyaodidiao/p/6500897.html
1.7.1 修改配置檔案
編輯dashboard.yaml,注意或更改以下部分:
image: index.tenxcloud.com/google_containers/kubernetes-dashboard-amd64:v1.4.1
args:
- --apiserver-host=http://10.0.0.11:8080
編輯dashboardsvc.yaml檔案:
apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard namespace: kube-system labels: k8s-app: kubernetes-dashboard kubernetes.io/cluster-service: "true" spec: selector: k8s-app: kubernetes-dashboard ports: - port: 80 targetPort: 9090
1.7.2 映象準備
在dashboard.yaml中定義了dashboard所用的映象
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1(當然你可以選擇其他的版本)
下載地址
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kubernetes-dashboard-amd64:v1.4.1
1.7.3 啟動dashboard
在master執行如下命令:
kubectl create -f dashboard.yaml
kubectl create -f dashboardsvc.yaml
到此dashboard搭建完成
1.7.4 驗證
命令驗證,master上執行如下命令:
[root@k8s-master ~]# kubectl get deployment --all-namespaces NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kube-system kubernetes-dashboard-latest 1 1 1 1 42m [root@k8s-master ~]# kubectl get svc --all-namespaces NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes 10.254.0.1 <none> 443/TCP 5h default myweb 10.254.168.71 <nodes> 8080:30001/TCP 1h kube-system kubernetes-dashboard 10.254.90.78 <none> 80/TCP 41m [root@k8s-master ~]# kubectl get pod -o wide --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE default myweb-c2dfj 1/1 Running 0 1h 172.16.57.2 10.0.0.13 default myweb-h7rkb 1/1 Running 0 1h 172.16.76.2 10.0.0.12 default myweb-l48b3 1/1 Running 0 1h 172.16.57.3 10.0.0.13 kube-system kubernetes-dashboard-latest-1395490986-1t37v 1/1 Running 0 43m 172.16.76.3 10.0.0.12
1.7.5 瀏覽器訪問:http://10.0.0.11:8080/ui
1.7.6 銷燬應用(測試)
在master上執行:
kubectl delete deployment kubernetes-dashboard-latest --namespace=kube-system
kubectl delete svc kubernetes-dashboard --namespace=kube-system