Docker集群管理工具-Kubernetes部署記錄
阿新 • • 發佈:2018-01-04
kafka 並發 direct 操作 airbnb 127.0.0.1 engine address uri
Kubernetes介紹
Kubernetes是Google開源的容器集群管理系統,是基於Docker構建一個容器的調度服務,提供資源調度、均衡容災、服務註冊、動態擴縮容等功能套件。 Kubernetes提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用,其主要功能如下: 1) 使用Docker對應用程序包裝(package)、實例化(instantiate)、運行(run)。 2) 將多臺Docker主機抽象為一個資源,以集群的方式運行、管理跨機器的容器,包括任務調度、資源管理、彈性伸縮、滾動升級等功能。 3)使用編排系統(YAML File)快速構建容器集群,提供負載均衡,解決容器直接關聯及通信問題 4) 解決Docker跨機器容器之間的通訊問題。 5)自動管理和修復容器,簡單說,比如創建一個集群,裏面有十個容器,如果某個容器異常關閉,那麽,會嘗試重啟或重新分配容器,始終保證會有 十個容器在運行,反而殺死多余的。 Kubernetes的自我修復機制使得容器集群總是運行在用戶期望的狀態當前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。
Kubernetes和Mesos的區別
1)Mesos是Apache下的開源分布式資源管理框架,它被稱為是分布式系統的內核; Kubernetes是Google開源的容器集群管理系統,實現基於Docker構建容器,利用Kubernetes能很方面管理多臺Docker主機中的容器。 2)Mesos負責管理集群管資源(動態運行時,某機器有額外的資源,通知master來分配); Kubernetes抽象出新的容器組合模型並且對其編排管理(把容器自由組合提供服務這事兒搞定了,從而微服務,serverless等才真 正的優雅地在開發和運維之間不吵架地被實現),而且kubernetes把以前運維的很多很難搞的東西都變得容易了。比如OpenStack, Kubernetes是把OpenStack裏面的VM換成了容器,但是實現地更漂亮,更精簡,更抽象和本質化,用起來也更容易。 3)Mesos相比Kubernetes發展的時間更久,總體情況更成熟,在生產環境有更多的使用經驗,國外使用Mesos的公司有Twitter,Apple, Airbnb,Uber等,國內也有大批知名公司在使用Mesos,比如:小米、當當、豆瓣、去哪兒、攜程、唯品會、知乎、新浪微博、愛奇藝、 七牛、唯品會、bilibili、中國聯通、中國移動、中國電信、華為、數人雲等等。中大型公司會更傾向於使用Mesos, 因為本身這些公司有一定的開發能力,Mesos提供了良好的API而且有非常多成熟的Framework跑在Mesos上,Mesos+Marathon+Zookeeper 正常情況可以滿足絕大部分需求,只需要寫JSON或者DSL定義好service/application就好,只有一些特殊情況才確實需要寫自己的Framework。 而kubernetes(k8s)現在也正在慢慢成熟起來,它在生產環境顯然還需要更多時間來驗證。京東目前已經在kubernetes上跑15W+容器了。 Mesos現在越來越適應並且被添加上了很多Kubernete的概念同時支持了很多Kubernetes的API。因此如果你需要它們的話,它將是對你的 Kubernetes應用去獲得更多能力的一個便捷方式(比如高可用的主幹、更加高級的調度命令、去管控很大數目結點的能力),同時能夠很好的 適用於產品級工作環境中(畢竟Kubernetes任然還是一個初始版本)。 4)如果你是一個集群世界的新手,Kubernetes是一個很棒的起點。它是最快的、最簡單的、最輕量級的方法去擺脫束縛,同時開啟面向集群開發的實踐。 它提供了一個高水平的可移植方案,因為它是被一些不同的貢獻者所支持的( 例如微軟、IBM、Red Hat、CoreOs、MesoSphere、VMWare等等)。 如果你已經有已經存在的工作任務(Hadoop、Spark、Kafka等等),Mesos給你提供了一個可以讓你將不同工作任務相互交錯的框架,然後混合進一個 包含Kubernetes 應用的新的東西。 如果你還沒有用Kubernetes 系列框架完成項目的能力,Mesos給了你一個減壓閥。
Kubernetes結構圖
kubernetes角色組成
1)Pod 在Kubernetes系統中,調度的最小顆粒不是單純的容器,而是抽象成一個Pod,Pod是一個可以被創建、銷毀、調度、管理的最小的部署單元。 比如一個或一組容器。Pod是kubernetes的最小操作單元,一個Pod可以由一個或多個容器組成;同一個Pod只能運行在同一個主機上,共享相 同的volumes、network、namespace; 2)ReplicationController(RC) RC用來管理Pod,一個RC可以由一個或多個Pod組成,在RC被創建後,系統會根據定義好的副本數來創建Pod數量。在運行過程中,如果Pod數量 小於定義的,就會重啟停止的或重新分配Pod,反之則殺死多余的。當然,也可以動態伸縮運行的Pods規模或熟悉。RC通過label關聯對應的Pods, 在滾動升級中,RC采用一個一個替換要更新的整個Pods中的Pod。 Replication Controller是Kubernetes系統中最有用的功能,實現復制多個Pod副本,往往一個應用需要多個Pod來支撐,並且可以保證其復制的 副本數,即使副本所調度分配的宿主機出現異常,通過Replication Controller可以保證在其它主宿機啟用同等數量的Pod。Replication Controller 可以通過repcon模板來創建多個Pod副本,同樣也可以直接復制已存在Pod,需要通過Label selector來關聯。 3)Service Service定義了一個Pod邏輯集合的抽象資源,Pod集合中的容器提供相同的功能。集合根據定義的Label和selector完成,當創建一個Service後, 會分配一個Cluster IP,這個IP與定義的端口提供這個集合一個統一的訪問接口,並且實現負載均衡。 Services是Kubernetes最外圍的單元,通過虛擬一個訪問IP及服務端口,可以訪問我們定義好的Pod資源,目前的版本是通過iptables的nat轉發來實現, 轉發的目標端口為Kube_proxy生成的隨機端口,目前只提供GOOGLE雲上的訪問調度,如GCE。 4)Label Label是用於區分Pod、Service、RC的key/value鍵值對;僅使用在Pod、Service、Replication Controller之間的關系識別,但對這些單元本身進行操 作時得使用name標簽。Pod、Service、RC可以有多個label,但是每個label的key只能對應一個;主要是將Service的請求通過lable轉發給後端提供服務的Pod集合; 說說個人一點看法,目前Kubernetes保持一周一小版本、一個月一大版本的節奏,叠代速度極快,同時也帶來了不同版本操作方法的差異,另外官網文檔更新速度 相對滯後及欠缺,給初學者帶來一定挑戰。在上遊接入層官方側重點還放在GCE(Google Compute Engine)的對接優化,針對個人私有雲還未推出一套可行的接入 解決方案。在v0.5版本中才引用service代理轉發的機制,且是通過iptables來實現,在高並發下性能令人擔憂。但作者依然看好Kubernetes未來的發展,至少目前 還未看到另外一個成體系、具備良好生態圈的平臺,相信在V1.0時就會具備生產環境的服務支撐能力。
kubernetes組件組成
1)kubectl 客戶端命令行工具,將接受的命令格式化後發送給kube-apiserver,作為整個系統的操作入口。 2)kube-apiserver 作為整個系統的控制入口,以REST API服務提供接口。 3)kube-controller-manager 用來執行整個系統中的後臺任務,包括節點狀態狀況、Pod個數、Pods和Service的關聯等。 4)kube-scheduler 負責節點資源管理,接受來自kube-apiserver創建Pods任務,並分配到某個節點。 5)etcd 負責節點間的服務發現和配置共享。 6)kube-proxy 運行在每個計算節點上,負責Pod網絡代理。定時從etcd獲取到service信息來做相應的策略。 7)kubelet 運行在每個計算節點上,作為agent,接受分配該節點的Pods任務及管理容器,周期性獲取容器狀態,反饋給kube-apiserver。 8)DNS 一個可選的DNS服務,用於為每個Service對象創建DNS記錄,這樣所有的Pod就可以通過DNS訪問服務了。
Kubelet
根據上圖可知Kubelet是Kubernetes集群中每個Minion和Master API Server的連接點,Kubelet運行在每個Minion上,是Master API Server和Minion之間的橋梁, 接收Master API Server分配給它的commands和work,與持久性鍵值存儲etcd、file、server和http進行交互,讀取配置信息。Kubelet的主要工作是管理Pod和容 器的生命周期,其包括Docker Client、Root Directory、Pod Workers、Etcd Client、Cadvisor Client以及Health Checker組件,具體工作如下: 1) 通過Worker給Pod異步運行特定的Action。 2) 設置容器的環境變量。 3) 給容器綁定Volume。 4) 給容器綁定Port。 5) 根據指定的Pod運行一個單一容器。 6) 殺死容器。 7) 給指定的Pod創建network 容器。 8) 刪除Pod的所有容器。 9) 同步Pod的狀態。 10) 從Cadvisor獲取container info、 pod info、root info、machine info。 11) 檢測Pod的容器健康狀態信息。 12) 在容器中運行命令
kubernetes基本部署步驟
1)minion節點安裝docker 2)minion節點配置跨主機容器通信 3)master節點部署etcd、kube-apiserver、kube-controller-manager和kube-scheduler組件 4)minion節點部署kubelet、kube-proxy組件 溫馨提示: 如果minion主機沒有安裝docker,啟動kubelet時會報如下錯誤: Could not load kubeconfig file /var/lib/kubelet/kubeconfig: stat /var/lib/kubelet/kubeconfig: no such file or directory. Trying auth path instead. Could not load kubernetes auth path /var/lib/kubelet/kubernetes_auth: stat /var/lib/kubelet/kubernetes_auth: no such file or directory. Continuing with defaults. No cloud provider specified.
kubernetes集群環境部署過程記錄
主機名 IP 節點及功能 系統版本 K8S-master 10.10.172.202 Master、etcd、registry CentOS7.2 K8S-node-1 10.10.172.203 Node1 CentOS7.2 K8S-node-2 10.10.172.204 Node2 CentOS7.2
1)設置三臺機器的主機名
Master上執行: [root@localhost ~]# hostnamectl --static set-hostname k8s-master Node1上執行: [root@localhost ~]# hostnamectl --static set-hostname k8s-node-1 Node2上執行: [root@localhost ~]# hostnamectl --static set-hostname k8s-node-2 在三臺機器上都要設置hosts,均執行如下命令: [root@k8s-master ~]# vim /etc/hosts 10.10.172.202 k8s-master 10.10.172.202 etcd 10.10.172.202 registry 10.10.172.203 k8s-node-1 10.10.172.204 k8s-node-2
2)關閉三臺機器上的防火墻
[root@k8s-master ~]# systemctl disable firewalld.service [root@k8s-master ~]# systemctl stop firewalld.service
3)現在開始部署Master
1)先安裝docker環境 [root@k8s-master ~]# yum install -y docker 配置Docker配置文件,使其允許從registry中拉取鏡像 [root@k8s-master ~]# vim /etc/sysconfig/docker #添加下面一行內容 ...... OPTIONS='--insecure-registry registry:5000' [root@k8s-master ~]# systemctl start docker 2)安裝etcd k8s運行依賴etcd,需要先部署etcd,下面采用yum方式安裝: [root@k8s-master ~]# yum install etcd -y yum安裝的etcd默認配置文件在/etc/etcd/etcd.conf,編輯配置文件: [root@k8s-master ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak [root@k8s-master ~]# cat /etc/etcd/etcd.conf #[member] ETCD_NAME=master #節點名稱 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #數據存放位置 #ETCD_WAL_DIR="" #ETCD_SNAPSHOT_COUNT="10000" #ETCD_HEARTBEAT_INTERVAL="100" #ETCD_ELECTION_TIMEOUT="1000" #ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" #監聽客戶端地址 #ETCD_MAX_SNAPSHOTS="5" #ETCD_MAX_WALS="5" #ETCD_CORS="" # #[cluster] #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380" # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..." #ETCD_INITIAL_CLUSTER="default=http://localhost:2380" #ETCD_INITIAL_CLUSTER_STATE="new" #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379,http://etcd:4001" #通知客戶端地址 #ETCD_DISCOVERY="" #ETCD_DISCOVERY_SRV="" #ETCD_DISCOVERY_FALLBACK="proxy" #ETCD_DISCOVERY_PROXY="" 啟動etcd並驗證狀態 [root@k8s-master ~]# systemctl start etcd [root@k8s-master ~]# ps -ef|grep etcd etcd 28145 1 1 14:38 ? 00:00:00 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379,http://0.0.0.0:4001 root 28185 24819 0 14:38 pts/1 00:00:00 grep --color=auto etcd [root@k8s-master ~]# lsof -i:2379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME etcd 28145 etcd 6u IPv6 1283822 0t0 TCP *:2379 (LISTEN) etcd 28145 etcd 18u IPv6 1284133 0t0 TCP localhost:53203->localhost:2379 (ESTABLISHED) ........ [root@k8s-master ~]# etcdctl set testdir/testkey0 0 0 [root@k8s-master ~]# etcdctl get testdir/testkey0 0 [root@k8s-master ~]# etcdctl -C http://etcd:4001 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379 cluster is healthy [root@k8s-master ~]# etcdctl -C http://etcd:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379 cluster is healthy 3)安裝kubernets [root@k8s-master ~]# yum install kubernetes 配置並啟動kubernetes 在kubernetes master上需要運行以下組件:Kubernets API Server、Kubernets Controller Manager、Kubernets Scheduler [root@k8s-master ~]# cp /etc/kubernetes/apiserver /etc/kubernetes/apiserver.bak [root@k8s-master ~]# vim /etc/kubernetes/apiserver ### # kubernetes system config # # The following values are used to configure the kube-apiserver # # The address on the local server to listen to. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" # The port on the local server to listen on. KUBE_API_PORT="--port=8080" # Port minions listen on # KUBELET_PORT="--kubelet-port=10250" # Comma separated list of nodes in the etcd cluster KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379" # Address range to use for services KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" # default admission control policies #KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" # Add your own! KUBE_API_ARGS="" [root@k8s-master ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak [root@k8s-master ~]# vim /etc/kubernetes/config ### # kubernetes system config # # The following values are used to configure various aspects of all # kubernetes services, including # # kube-apiserver.service # kube-controller-manager.service # kube-scheduler.service # kubelet.service # kube-proxy.service # logging to stderr means we get it in the systemd journal KUBE_LOGTOSTDERR="--logtostderr=true" # journal message level, 0 is debug KUBE_LOG_LEVEL="--v=0" # Should this cluster be allowed to run privileged docker containers KUBE_ALLOW_PRIV="--allow-privileged=false" # How the controller-manager, scheduler, and proxy find the apiserver KUBE_MASTER="--master=http://k8s-master:8080" 啟動服務並設置開機自啟動 [root@k8s-master ~]# systemctl enable kube-apiserver.service [root@k8s-master ~]# systemctl start kube-apiserver.service [root@k8s-master ~]# systemctl enable kube-controller-manager.service [root@k8s-master ~]# systemctl start kube-controller-manager.service [root@k8s-master ~]# systemctl enable kube-scheduler.service [root@k8s-master ~]# systemctl start kube-scheduler.service
4)接著部署Node(在兩臺node節點機器上都要操作)
1)安裝docker [root@k8s-node-1 ~]# yum install -y docker 配置Docker配置文件,使其允許從registry中拉取鏡像 [root@k8s-node-1 ~]# vim /etc/sysconfig/docker #添加下面一行內容 ...... OPTIONS='--insecure-registry registry:5000' [root@k8s-node-1 ~]# systemctl start docker 2)安裝kubernets [root@k8s-node-1 ~]# yum install kubernetes 配置並啟動kubernetes 在kubernetes master上需要運行以下組件:Kubelet、Kubernets Proxy [root@k8s-node-1 ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak [root@k8s-node-1 ~]# vim /etc/kubernetes/config ### # kubernetes system config # # The following values are used to configure various aspects of all # kubernetes services, including # # kube-apiserver.service # kube-controller-manager.service # kube-scheduler.service # kubelet.service # kube-proxy.service # logging to stderr means we get it in the systemd journal KUBE_LOGTOSTDERR="--logtostderr=true" # journal message level, 0 is debug KUBE_LOG_LEVEL="--v=0" # Should this cluster be allowed to run privileged docker containers KUBE_ALLOW_PRIV="--allow-privileged=false" # How the controller-manager, scheduler, and proxy find the apiserver KUBE_MASTER="--master=http://k8s-master:8080" [root@k8s-node-1 ~]# cp /etc/kubernetes/kubelet /etc/kubernetes/kubelet.bak [root@k8s-node-1 ~]# vim /etc/kubernetes/kubelet ### # kubernetes kubelet (minion) config # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=0.0.0.0" # The port for the info server to serve on # KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname-override=k8s-node-1" #特別註意這個,在另一個node2節點上,要改為k8s-node-2 # location of the api-server KUBELET_API_SERVER="--api-servers=http://k8s-master:8080" # pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" # Add your own! KUBELET_ARGS="" 啟動服務並設置開機自啟動 [root@k8s-node-1 ~]# systemctl enable kubelet.service [root@k8s-node-1 ~]# systemctl start kubelet.service [root@k8s-node-1 ~]# systemctl enable kube-proxy.service [root@k8s-node-1 ~]# systemctl start kube-proxy.service
查看狀態
[root@k8s-master ~]# kubectl -s http://k8s-master:8080 get node NAME STATUS AGE k8s-node-1 Ready 29s k8s-node-2 Ready 28s [root@k8s-master ~]# kubectl get nodes NAME STATUS AGE k8s-node-1 Ready 44s k8s-node-2 Ready 43s
kubernetes常用命令
查看node主機 [root@k8s-master ~]# kubectl get node //有的環境是用monion,那麽查看命令就是"kubectl get minions" 查看pods清單 [root@k8s-master ~]# kubectl get pods 查看service清單 [root@k8s-master ~]# kubectl get services //或者使用命令"kubectl get services -o json" 查看replicationControllers清單 [root@k8s-master ~]# kubectl get replicationControllers 刪除所有pods(同理將下面命令中的pods換成services或replicationControllers,就是刪除所有的services或replicationContronllers) [root@k8s-master ~]# for i in `kubectl get pod|tail -n +2|awk '{print $1}'`; do kubectl delete pod $i; done -------------------------------------------------------------------------- 除了上面那種查看方式,還可以通過Server api for REST方式(這個及時性更高) 查看kubernetes版本 [root@k8s-master ~]# curl -s -L http://10.10.172.205:8080/api/v1beta1/version | python -mjson.tool 查看pods清單 [root@k8s-master ~]# curl -s -L http://10.10.172.205:8080/api/v1beta1/pods | python -mjson.tool 查看replicationControllers清單 [root@k8s-master ~]# curl -s -L http://10.10.172.205:8080/api/v1beta1/replicationControllers | python -mjson.tool 查查看node主機(或者是minion主機,將下面命令中的node改成minion) [root@k8s-master ~]# curl -s -L http://10.10.172.205:8080/api/v1beta1/node | python -m json.tool 查看service清單 [root@k8s-master ~]# curl -s -L http://10.10.172.205:8080/api/v1beta1/services | python -m json.tool 溫馨提示: 在新版Kubernetes中,所有的操作命令都整合至kubectl,包括kubecfg、kubectl.sh、kubecfg.sh等
5)創建覆蓋網絡——Flannel
1)安裝Flannel(在master、node上均執行如下命令,進行安裝) [root@k8s-master ~]# yum install flannel 2)配置Flannel(在master、node上均編輯/etc/sysconfig/flanneld) [root@k8s-master ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak [root@k8s-master ~]# vim /etc/sysconfig/flanneld # Flanneld configuration options # etcd url location. Point this to the server where etcd runs FLANNEL_ETCD_ENDPOINTS="http://etcd:2379" # etcd config key. This is the configuration key that flannel queries # For address range assignment FLANNEL_ETCD_PREFIX="/atomic.io/network" # Any additional options that you want to pass #FLANNEL_OPTIONS="" 3)配置etcd中關於flannel的key(這個只在master上操作) Flannel使用Etcd進行配置,來保證多個Flannel實例之間的配置一致性,所以需要在etcd上進行如下配置:('/atomic.io/network/config'這個key與上文/etc/sysconfig/flannel中的配置項FLANNEL_ETCD_PREFIX是相對應的,錯誤的話啟動就會出錯) [root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "10.10.0.0/16" }' { "Network": "10.10.0.0/16" } 4)啟動Flannel 啟動Flannel之後,需要依次重啟docker、kubernete。 在master執行: [root@k8s-master ~]# systemctl enable flanneld.service [root@k8s-master ~]# systemctl start flanneld.service [root@k8s-master ~]# service docker restart [root@k8s-master ~]# systemctl restart kube-apiserver.service [root@k8s-master ~]# systemctl restart kube-controller-manager.service [root@k8s-master ~]# systemctl restart kube-scheduler.service 在node上執行: [root@k8s-node-1 ~]# systemctl enable flanneld.service [root@k8s-node-1 ~]# systemctl start flanneld.service [root@k8s-node-1 ~]# service docker restart [root@k8s-node-1 ~]# systemctl restart kubelet.service [root@k8s-node-1 ~]# systemctl restart kube-proxy.service 然後通過ifconfig命令查看maste和node節點,發現docker0網橋網絡的ip已經是上面指定的10.10.0.0網段了。並且在master和node節點上創建的容器間都是可以相互通信的,能相互ping通! 在master上執行: [root@k8s-master ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 10.10.34.1 netmask 255.255.255.0 broadcast 0.0.0.0 ether 02:42:e1:c2:b5:88 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.10.172.202 netmask 255.255.255.0 broadcast 10.10.172.255 inet6 fe80::250:56ff:fe86:6833 prefixlen 64 scopeid 0x20<link> ether 00:50:56:86:68:33 txqueuelen 1000 (Ethernet) RX packets 87982 bytes 126277968 (120.4 MiB) RX errors 0 dropped 40 overruns 0 frame 0 TX packets 47274 bytes 6240061 (5.9 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472 inet 10.10.34.0 netmask 255.255.0.0 destination 10.10.34.0 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 91755 bytes 38359378 (36.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 91755 bytes 38359378 (36.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@k8s-master ~]# 在node上執行 [root@k8s-node-1 ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 10.10.66.1 netmask 255.255.255.0 broadcast 0.0.0.0 ether 02:42:2c:1d:19:14 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.10.172.203 netmask 255.255.255.0 broadcast 10.10.172.255 inet6 fe80::250:56ff:fe86:3ed8 prefixlen 64 scopeid 0x20<link> ether 00:50:56:86:3e:d8 txqueuelen 1000 (Ethernet) RX packets 69554 bytes 116340717 (110.9 MiB) RX errors 0 dropped 34 overruns 0 frame 0 TX packets 35925 bytes 2949594 (2.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472 inet 10.10.66.0 netmask 255.255.0.0 destination 10.10.66.0 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 24 bytes 1856 (1.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 24 bytes 1856 (1.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@k8s-node-1 ~]# [root@k8s-node-2 ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 10.10.59.1 netmask 255.255.255.0 broadcast 0.0.0.0 ether 02:42:08:8b:65:48 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.10.172.204 netmask 255.255.255.0 broadcast 10.10.172.255 inet6 fe80::250:56ff:fe86:22d8 prefixlen 64 scopeid 0x20<link> ether 00:50:56:86:22:d8 txqueuelen 1000 (Ethernet) RX packets 69381 bytes 116036521 (110.6 MiB) RX errors 0 dropped 27 overruns 0 frame 0 TX packets 35545 bytes 2943130 (2.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472 inet 10.10.59.0 netmask 255.255.0.0 destination 10.10.59.0 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 24 bytes 1856 (1.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 24 bytes 1856 (1.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@k8s-node-2 ~]#
6)部署nginx pod 和 ×××
以下面的圖來安裝一個簡單的靜態內容的nginx應用:
用×××啟動一個2個備份的nginx Pod,然後在前面掛Service,一個service只能被集群內部訪問,一個能被集群外的節點訪問。下面所有的命令都是在master管理節點上運行的。
1)首先部署nginx pod 和×××--------------------------------------------------------------------- [root@k8s-master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/nginx latest 3448f27c273f 8 days ago 109.4 MB 通過下面命令發現apiVersion版本是v1 [root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/version | python -mjson.tool { "apiVersion": "v1", ....... } 開始創建pod單元 [root@k8s-master ~]# mkdir -p /home/kubermange && cd /home/kubermange [root@k8s-master kubermange]# vim nginx-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: nginx-controller spec: replicas: 2 #即2個備份 selector: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: docker.io/nginx ports: - containerPort: 80 [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 create -f nginx-rc.yaml replicationcontroller "nginx-controller" created 由於kubernetes要去gcr.io下載gcr.io/google_containers/pause鏡像,然後下載nginx鏡像,所以所創建的Pod需要等待一些時間才能處於running狀態。 然後查看pods清單 [root@k8s-master kubermange]# kubectl -s http://k8s-master:8080 get pods NAME READY STATUS RESTARTS AGE nginx-controller-f0j9c 0/1 ContainerCreating 0 1m nginx-controller-v219k 0/1 ContainerCreating 0 1m 可以使用describe 命令查看pod所分到的節點: [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe pod nginx-controller-f0j9c Name: nginx-controller-f0j9c Namespace: default Node: k8s-node-1/182.48.115.238 ....... 同理,查看另一個pod [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe pod nginx-controller-v219k Name: nginx-controller-v219k Namespace: default Node: k8s-node-2/182.48.115.239 ....... 由上可以看出,這個×××啟動了兩個Pod,分別運行在182.48.115.238和182.48.115.239這兩個節點上了。到這兩個節點上查看,發現已經有nginx應用容器創建了。 2)部署節點內部可訪問的nginx service------------------------------------------------------------------------ Service的type有ClusterIP和NodePort之分,缺省是ClusterIP,這種類型的Service只能在集群內部訪問。配置文件如下: [root@k8s-master kubermange]# vim nginx-service-clusterip.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-clusterip spec: ports: - port: 8001 targetPort: 80 protocol: TCP selector: name: nginx 然後執行下面的命令創建service: [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 create -f ./nginx-service-clusterip.yaml service "nginx-service-clusterip" created [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 2h nginx-service-clusterip 10.254.163.249 <none> 8001/TCP 24s 驗證service的可訪問性(訪問節點): 上面的輸出告訴我們這個Service的Cluster IP是10.254.163.249,端口是8001。那麽我們就來驗證這個PortalNet IP的工作情況: ssh登錄到節點機上驗證(可以提前做ssh無密碼登錄的信任關系,當然也可以不做,這樣驗證時要手動輸入登錄密碼) [root@k8s-master kubermange]# ssh 182.48.115.238 curl -s 10.254.163.249:8001 //或者直接到節點機上執行"curl -s 10.254.163.249:8001" The authenticity of host '182.48.115.238 (182.48.115.238)' can't be established. ECDSA key fingerprint is 4c:24:35:e0:35:00:86:05:94:a2:9e:f9:22:b0:90:b7. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '182.48.115.238' (ECDSA) to the list of known hosts. [email protected]'s password: <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> 同理驗證到另外一個節點機上的service的可訪問性也是ok的 [root@k8s-master kubermange]# ssh 182.48.115.239 curl -s 10.254.163.249:8001 由此可見,從前面部署×××的部分可以知道nginx Pod運行在182.48.115.238和182.48.115.239這兩個節點上。 從這兩個節點上訪問我們的服務來體現Service Cluster IP在所有集群節點的可到達性。 3)部署外部可訪問的nginx service------------------------------------------------------------------- 下面我們創建NodePort類型的Service,這種類型的Service在集群外部是可以訪問。下表是本文用的配置文件: [root@k8s-master kubermange]# vim nginx-service-nodeport.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-nodeport spec: ports: - port: 8000 targetPort: 80 protocol: TCP type: NodePort selector: name: nginx 執行下面的命令創建service: [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 create -f ./nginx-service-nodeport.yaml service "nginx-service-nodeport" created [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 2h nginx-service-clusterip 10.254.163.249 <none> 8001/TCP 13m nginx-service-nodeport 10.254.146.68 <nodes> 8000:31298/TCP 22s 使用下面的命令獲得這個service的節點級別的端口: [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe service nginx-service-nodeport 2>/dev/null | grep NodePort Type: NodePort NodePort: <unset> 31298/TCP 驗證service的可訪問性(訪問節點): 上面的輸出告訴我們這個Service的節點級別端口是31298。下面我們驗證這個Service的工作情況: [root@k8s-master kubermange]# curl 182.48.115.238:31298 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> 同理驗證到另外一個節點機上的service的可訪問性也是ok的 [root@k8s-master kubermange]# curl 182.48.115.239:31298 ---------------------------------------------------------- 登錄另外兩個節點機上,發現已經創建了nginx應用容器 [root@k8s-node-1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 620d9171a42c docker.io/nginx "nginx -g 'daemon off" 19 minutes ago Up 19 minutes k8s_nginx.3d610115_nginx-controller-f0j9c_default_eaa0497b-3be5-11e7-a8a1-52540030ba6d_a6cde2e2 01facbbbe7cb registry.access.redhat.com/rhel7/pod-infrastructure:latest "/pod" 19 minutes ago Up 19 minutes k8s_POD.a8590b41_nginx-controller-f0j9c_default_eaa0497b-3be5-11e7-a8a1-52540030ba6d_d2dd947d [root@k8s-node-2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 308749352e55 docker.io/nginx "nginx -g 'daemon off" 30 minutes ago Up 30 minutes k8s_nginx.3d610115_nginx-controller-v219k_default_eaa02644-3be5-11e7-a8a1-52540030ba6d_7d54d433 cde94e406f9a registry.access.redhat.com/rhel7/pod-infrastructure:latest "/pod" 30 minutes ago Up 30 minutes
Docker集群管理工具-Kubernetes部署記錄