Docker Manager for Kubernetes

1、Kubernetes介紹

Kubernets是Google開源的容器集羣系統,是基於Docker構建一個容器的調度服務,提供資源調度,均衡容災,服務註冊,動態伸縮等功能套件;node

Kubernets提供應用部署,維護,擴展機制等功能,利用Kubernetes能方便地管理跨主機運行容器化的應用,其主要功能以下:python

  1. 使用Docker對應用程序包裝(package),實例化(instantiate),運行(run);
  2. 將多臺Docker主機抽象爲一個資源,以集羣的方式運行,管理跨機器的容器,包括任務調度,彈性伸縮,滾動升級等功能。
  3. 使用編排系統(YAML file)快速構建容器集羣,提供負載均衡,解決容器直接關聯及通訊問題;
  4. 解決Docker跨主機容器之間的通訊問題。
  5. 自動管理和修復容器,簡單說,好比建立一個集羣,裏面有十個容器,若是某個容器異常關閉,那麼,會嘗試重啓或從新分配容器,始終保證會有十個容器在運行,反而殺死多餘的。

Kubernetes的我修復機制使得容器集羣老是運行在用戶指望的狀態當前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。docker

2、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給了你一個減壓閥。

3、Kubernetes詳解

kubernetes角色組成

  1. Pod

在kubernetes系統中,調度的最小顆粒不是單純的容器,而是抽象一個Pod,Pod是一個能夠被建立,銷燬,調度,管理的最小的部署單元,好比一個或一組容器。Pod是kubernetes的最小操做單元,一個pod能夠由一個或多個容器組成;同一個Pod只能運行在同一個主機上,共享相同的volumes、network、namespace;shell

  1. ReplicationController(RC)

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

  1. Service

Service定義了一個Pod邏輯集合的抽象資源,Pod集合彙總的容器提供相同的功能。集合根據定義的Label和selector完成,當建立一個Service後,會分配一個Cluster ip,這個IP與定義的端口提供這個集合一個統一的訪問接口,而且實現負載均衡後端

Services是Kubernetes最外圍的單元,經過虛擬一個訪問IP及服務端口,能夠訪問咱們定義好的Pod資源,目前的版本是經過iptables的nat轉發來實現,
轉發的目標端口爲Kube_proxy生成的隨機端口,目前只提供GOOGLE雲上的訪問調度,如GCE。centos

  1. Label

Label是用於區分Pod、Service、RC的key/value鍵值對;僅使用在Pod、Service、Replication Controller之間的關係識別,但對這些單元自己進行操做時得使用name標籤。Pod、Service、RC能夠有多個label,可是每一個label的key只能對應一個;主要是將Service的請求經過lable轉發給後端提供服務的Pod集合;api

kubernetes組件組成

  1. kubectl

客戶端命令行工具,將接受的命令格式化後發送給kube-apiserver,做爲整個系統的操做入口。網絡

  1. kube-apisrver

做爲整個系統的控制入口,以REST API服務提供接口

  1. kube-controller-manager

用來執行整改系統的後臺任務,包括節點狀態情況,pod個數,pods和service的關聯等。

  1. kube-scheduler

負責節點資源管理,接受來自kube-apiserver建立Pods任務,並分配到某個節點

  1. etcd

負責節點間的服務發現和配置共享

  1. kube-proxy

運行在每一個計算節點上,負責Pod網絡代理。定時從etcd獲取到service信息來作相應的策略

  1. kubelet

運行在每一個計算節點上,做爲agent,接受分配該節點的Pods任務及管理容器,週期性獲取容器狀態,反饋給kube-apiserver。

  1. 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 Worders,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. 在容器中運行命令

4、Kubernetes部署

基本環境

主機名               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

部署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

部署node

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

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.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

建立覆蓋網絡——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.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通!
相關文章
相關標籤/搜索