Kubernets
是Google開源的容器集羣系統,是基於Docker構建一個容器的調度服務,提供資源調度,均衡容災,服務註冊,動態伸縮等功能套件;node
Kubernets
提供應用部署,維護,擴展機制等功能,利用Kubernetes能方便地管理跨主機運行容器化的應用,其主要功能以下:python
Kubernetes
的我修復機制使得容器集羣老是運行在用戶指望的狀態當前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。docker
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系統中,調度的最小顆粒不是單純的容器,而是抽象一個Pod,Pod是一個能夠被建立,銷燬,調度,管理的最小的部署單元,好比一個或一組容器。Pod是kubernetes的最小操做單元,一個pod能夠由一個或多個容器組成;同一個Pod只能運行在同一個主機上,共享相同的volumes、network、namespace;shell
RC用來管理Pod,一個RC能夠由一個或多個pod組成,在RC被建立後,系統會根據定義好的副本數來建立Pod數量。在運行過程當中,若是Pod數量小於定義的,就會重啓中止的或從新分配Pod,反之則殺多餘的。固然,也能夠動態伸縮運行的Pods規模或熟悉。RC經過label關聯對應的Pods,在滾動升級中,RC採用一個一個替換要更新的整個Pods中的Pod。json
Replication Controller是Kubernetes系統中最有用的功能,實現複製多個Pod副本,每每一個應用須要多個Pod來支撐,而且能夠保證其複製的
副本數,即便副本所調度分配的宿主機出現異常,經過Replication Controller能夠保證在其它主宿機啓用同等數量的Pod。Replication Controller
能夠經過repcon模板來建立多個Pod副本,一樣也能夠直接複製已存在Pod,須要經過Label selector來關聯vim
Service定義了一個Pod邏輯集合的抽象資源,Pod集合彙總的容器提供相同的功能。集合根據定義的Label和selector完成,當建立一個Service後,會分配一個Cluster ip,這個IP與定義的端口提供這個集合一個統一的訪問接口,而且實現負載均衡後端
Services是Kubernetes最外圍的單元,經過虛擬一個訪問IP及服務端口,能夠訪問咱們定義好的Pod資源,目前的版本是經過iptables的nat轉發來實現,
轉發的目標端口爲Kube_proxy生成的隨機端口,目前只提供GOOGLE雲上的訪問調度,如GCE。centos
Label是用於區分Pod、Service、RC的key/value鍵值對;僅使用在Pod、Service、Replication Controller之間的關係識別,但對這些單元自己進行操做時得使用name標籤。Pod、Service、RC能夠有多個label,可是每一個label的key只能對應一個;主要是將Service的請求經過lable轉發給後端提供服務的Pod集合;api
客戶端命令行工具,將接受的命令格式化後發送給kube-apiserver,做爲整個系統的操做入口。網絡
做爲整個系統的控制入口,以REST API服務提供接口
用來執行整改系統的後臺任務,包括節點狀態情況,pod個數,pods和service的關聯等。
負責節點資源管理,接受來自kube-apiserver建立Pods任務,並分配到某個節點
負責節點間的服務發現和配置共享
運行在每一個計算節點上,負責Pod網絡代理。定時從etcd獲取到service信息來作相應的策略
運行在每一個計算節點上,做爲agent,接受分配該節點的Pods任務及管理容器,週期性獲取容器狀態,反饋給kube-apiserver。
一個可選DNS服務,用於爲每一個Service對象建立DNS記錄,選擇全部的Pod就能夠經過DNS訪問服務來。
根據上圖可知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 Worders,Etcd Client,Cadvisor Client以及Health Checker組件,具體工做以下:
主機名 IP 節點及功能 系統版本 k8s-master 10.211.55.12 Master,etcd,registry centos 7.2 node1 10.211.55.21 Node1 centos 7.2 node2 10.211.55.22 Node1 centos 7.2
# 設置三臺機器的主機名 Master上執行: [root@localhost ~]# hostnamectl --static set-hostname k8s-master Node1上執行: [root@localhost ~]# hostnamectl --static set-hostname node1 Node2上執行: [root@localhost ~]# hostnamectl --static set-hostname node2 # 在三臺機器上都要設置hosts,均執行以下命令: [root@k8s-master ~]# vim /etc/hosts 10.211.55.12 k8s-master 10.211.55.12 etcd 10.211.55.12 registry 10.211.55.21 node1 10.211.55.22 node2 # 關閉三臺機器上的防火牆 [root@k8s-master ~]# systemctl disable firewalld.service [root@k8s-master ~]# systemctl stop firewalld.service
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
1)安裝docker [root@node1 ~]# yum install -y docker 配置Docker配置文件,使其容許從registry中拉取鏡像 [root@node1 ~]# vim /etc/sysconfig/docker #添加下面一行內容 ...... OPTIONS='--insecure-registry registry:5000' [root@node1 ~]# systemctl start docker 2)安裝kubernets [root@node1 ~]# yum install kubernetes 配置並啓動kubernetes 在kubernetes master上須要運行如下組件:Kubelet、Kubernets Proxy [root@node1 ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak [root@node1 ~]# 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@node1 ~]# cp /etc/kubernetes/kubelet /etc/kubernetes/kubelet.bak [root@node1 ~]# 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=node1" #特別注意這個,在另外一個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@node1 ~]# systemctl enable kubelet.service [root@node1 ~]# systemctl start kubelet.service [root@node1 ~]# systemctl enable kube-proxy.service [root@node1 ~]# systemctl start kube-proxy.service # 在master上查看集羣中節點及節點狀態 [root@k8s-master ~]# kubectl -s http://k8s-master:8080 get node NAME STATUS AGE k8s-node-1 Ready 10m k8s-node-2 Ready 1m [root@k8s-master ~]# kubectl get nodes NAME STATUS AGE k8s-node-1 Ready 10m k8s-node-2 Ready 1m
查看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.211.55.12:8080/api/v1beta1/version | python -mjson.tool 查看pods清單 [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/pods | python -mjson.tool 查看replicationControllers清單 [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/replicationControllers | python -mjson.tool 查查看node主機(或者是minion主機,將下面命令中的node改爲minion) [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/node | python -m json.tool 查看service清單 [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/services | python -m json.tool
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.211.55.0/24" }' { "Network": "10.211.55.0/24" } 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@node1 ~]# systemctl enable flanneld.service [root@node1 ~]# systemctl start flanneld.service [root@node1 ~]# service docker restart [root@node1 ~]# systemctl restart kubelet.service [root@node1 ~]# systemctl restart kube-proxy.service 而後經過ifconfig命令查看maste和node節點,發現docker0網橋網絡的ip已是上面指定的182.48.0.0網段了。而且在master和node節點上建立的容器間都是能夠相互通訊的,能相互ping通!