久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Docker集群管理工具-Kubernetes部署記錄

 WindySky 2018-04-02

 

之前介紹了Mesos+Marathon+Zookeeper管理Docker集群平臺的部署 ,,本篇則說下利用Kubernetes管理Docker集群環(huán)境的部署。

Kubernetes介紹

1
2
3
4
5
6
7
8
9
Kubernetes是Google開源的容器集群管理系統(tǒng),是基于Docker構(gòu)建一個(gè)容器的調(diào)度服務(wù),,提供資源調(diào)度、均衡容災(zāi),、服務(wù)注冊,、動態(tài)擴(kuò)縮容等功能套件。
Kubernetes提供應(yīng)用部署,、維護(hù),、 擴(kuò)展機(jī)制等功能,利用Kubernetes能方便地管理跨機(jī)器運(yùn)行容器化的應(yīng)用,,其主要功能如下:
1) 使用Docker對應(yīng)用程序包裝(package),、實(shí)例化(instantiate)、運(yùn)行(run),。
2) 將多臺Docker主機(jī)抽象為一個(gè)資源,,以集群的方式運(yùn)行、管理跨機(jī)器的容器,包括任務(wù)調(diào)度,、資源管理,、彈性伸縮、滾動升級等功能,。
3)使用編排系統(tǒng)(YAML File)快速構(gòu)建容器集群,,提供負(fù)載均衡,解決容器直接關(guān)聯(lián)及通信問題
4) 解決Docker跨機(jī)器容器之間的通訊問題,。
5)自動管理和修復(fù)容器,,簡單說,比如創(chuàng)建一個(gè)集群,,里面有十個(gè)容器,,如果某個(gè)容器異常關(guān)閉,那么,,會嘗試重啟或重新分配容器,,始終保證會有
   十個(gè)容器在運(yùn)行,反而殺死多余的,。
   Kubernetes的自我修復(fù)機(jī)制使得容器集群總是運(yùn)行在用戶期望的狀態(tài)當(dāng)前Kubernetes支持GCE,、vShpere、CoreOS,、OpenShift,。

Kubernetes和Mesos的區(qū)別

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1)Mesos是Apache下的開源分布式資源管理框架,它被稱為是分布式系統(tǒng)的內(nèi)核,;
  Kubernetes是Google開源的容器集群管理系統(tǒng),,實(shí)現(xiàn)基于Docker構(gòu)建容器,利用Kubernetes能很方面管理多臺Docker主機(jī)中的容器,。
  
2)Mesos負(fù)責(zé)管理集群管資源(動態(tài)運(yùn)行時(shí),,某機(jī)器有額外的資源,通知master來分配),;
   Kubernetes抽象出新的容器組合模型并且對其編排管理(把容器自由組合提供服務(wù)這事兒搞定了,,從而微服務(wù),serverless等才真
   正的優(yōu)雅地在開發(fā)和運(yùn)維之間不吵架地被實(shí)現(xiàn)),,而且kubernetes把以前運(yùn)維的很多很難搞的東西都變得容易了,。比如OpenStack,
   Kubernetes是把OpenStack里面的VM換成了容器,,但是實(shí)現(xiàn)地更漂亮,,更精簡,更抽象和本質(zhì)化,,用起來也更容易,。
  
3)Mesos相比Kubernetes發(fā)展的時(shí)間更久,,總體情況更成熟,在生產(chǎn)環(huán)境有更多的使用經(jīng)驗(yàn),,國外使用Mesos的公司有Twitter,,Apple,
   Airbnb,,Uber等,國內(nèi)也有大批知名公司在使用Mesos,,比如:小米,、當(dāng)當(dāng)、豆瓣,、去哪兒,、攜程、唯品會,、知乎,、新浪微博、愛奇藝,、
   七牛,、唯品會、bilibili,、中國聯(lián)通,、中國移動、中國電信,、華為,、數(shù)人云等等。中大型公司會更傾向于使用Mesos,,
   因?yàn)楸旧磉@些公司有一定的開發(fā)能力,,Mesos提供了良好的API而且有非常多成熟的Framework跑在Mesos上,Mesos+Marathon+Zookeeper
   正常情況可以滿足絕大部分需求,,只需要寫JSON或者DSL定義好service/application就好,,只有一些特殊情況才確實(shí)需要寫自己的Framework。
  
   而kubernetes(k8s)現(xiàn)在也正在慢慢成熟起來,,它在生產(chǎn)環(huán)境顯然還需要更多時(shí)間來驗(yàn)證,。京東目前已經(jīng)在kubernetes上跑15W+容器了。
   
   Mesos現(xiàn)在越來越適應(yīng)并且被添加上了很多Kubernete的概念同時(shí)支持了很多Kubernetes的API,。因此如果你需要它們的話,,它將是對你的
   Kubernetes應(yīng)用去獲得更多能力的一個(gè)便捷方式(比如高可用的主干、更加高級的調(diào)度命令,、去管控很大數(shù)目結(jié)點(diǎn)的能力),,同時(shí)能夠很好的
   適用于產(chǎn)品級工作環(huán)境中(畢竟Kubernetes任然還是一個(gè)初始版本),。
  
4)如果你是一個(gè)集群世界的新手,Kubernetes是一個(gè)很棒的起點(diǎn),。它是最快的,、最簡單的、最輕量級的方法去擺脫束縛,,同時(shí)開啟面向集群開發(fā)的實(shí)踐,。
   它提供了一個(gè)高水平的可移植方案,因?yàn)樗潜灰恍┎煌呢暙I(xiàn)者所支持的(    例如微軟,、IBM,、Red Hat、CoreOs,、MesoSphere,、VMWare等等)。
  
   如果你已經(jīng)有已經(jīng)存在的工作任務(wù)(Hadoop,、Spark,、Kafka等等),Mesos給你提供了一個(gè)可以讓你將不同工作任務(wù)相互交錯(cuò)的框架,,然后混合進(jìn)一個(gè)
   包含Kubernetes 應(yīng)用的新的東西,。
  
   如果你還沒有用Kubernetes 系列框架完成項(xiàng)目的能力,Mesos給了你一個(gè)減壓閥,。

Kubernetes結(jié)構(gòu)圖

kubernetes角色組成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1)Pod
在Kubernetes系統(tǒng)中,,調(diào)度的最小顆粒不是單純的容器,而是抽象成一個(gè)Pod,,Pod是一個(gè)可以被創(chuàng)建,、銷毀、調(diào)度,、管理的最小的部署單元,。
比如一個(gè)或一組容器。Pod是kubernetes的最小操作單元,,一個(gè)Pod可以由一個(gè)或多個(gè)容器組成,;同一個(gè)Pod只能運(yùn)行在同一個(gè)主機(jī)上,共享相
同的volumes,、network,、namespace;
  
2)ReplicationController(RC)
RC用來管理Pod,,一個(gè)RC可以由一個(gè)或多個(gè)Pod組成,,在RC被創(chuàng)建后,系統(tǒng)會根據(jù)定義好的副本數(shù)來創(chuàng)建Pod數(shù)量,。在運(yùn)行過程中,,如果Pod數(shù)量
小于定義的,,就會重啟停止的或重新分配Pod,反之則殺死多余的,。當(dāng)然,,也可以動態(tài)伸縮運(yùn)行的Pods規(guī)模或熟悉,。RC通過label關(guān)聯(lián)對應(yīng)的Pods,,
在滾動升級中,RC采用一個(gè)一個(gè)替換要更新的整個(gè)Pods中的Pod,。
  
Replication Controller是Kubernetes系統(tǒng)中最有用的功能,,實(shí)現(xiàn)復(fù)制多個(gè)Pod副本,往往一個(gè)應(yīng)用需要多個(gè)Pod來支撐,,并且可以保證其復(fù)制的
副本數(shù),即使副本所調(diào)度分配的宿主機(jī)出現(xiàn)異常,,通過Replication Controller可以保證在其它主宿機(jī)啟用同等數(shù)量的Pod,。Replication Controller
可以通過repcon模板來創(chuàng)建多個(gè)Pod副本,同樣也可以直接復(fù)制已存在Pod,,需要通過Label selector來關(guān)聯(lián),。
  
3)Service
Service定義了一個(gè)Pod邏輯集合的抽象資源,Pod集合中的容器提供相同的功能,。集合根據(jù)定義的Label和selector完成,,當(dāng)創(chuàng)建一個(gè)Service后,
會分配一個(gè)Cluster IP,,這個(gè)IP與定義的端口提供這個(gè)集合一個(gè)統(tǒng)一的訪問接口,,并且實(shí)現(xiàn)負(fù)載均衡。
  
Services是Kubernetes最外圍的單元,,通過虛擬一個(gè)訪問IP及服務(wù)端口,,可以訪問我們定義好的Pod資源,目前的版本是通過iptables的nat轉(zhuǎn)發(fā)來實(shí)現(xiàn),,
轉(zhuǎn)發(fā)的目標(biāo)端口為Kube_proxy生成的隨機(jī)端口,,目前只提供GOOGLE云上的訪問調(diào)度,如GCE,。
   
4)Label
Label是用于區(qū)分Pod,、Service、RC的key/value鍵值對,;僅使用在Pod,、Service、Replication Controller之間的關(guān)系識別,,但對這些單元本身進(jìn)行操
作時(shí)得使用name標(biāo)簽,。Pod,、Service、RC可以有多個(gè)label,,但是每個(gè)label的key只能對應(yīng)一個(gè),;主要是將Service的請求通過lable轉(zhuǎn)發(fā)給后端提供服務(wù)的Pod集合;
  
說說個(gè)人一點(diǎn)看法,,目前Kubernetes保持一周一小版本,、一個(gè)月一大版本的節(jié)奏,迭代速度極快,,同時(shí)也帶來了不同版本操作方法的差異,,另外官網(wǎng)文檔更新速度
相對滯后及欠缺,給初學(xué)者帶來一定挑戰(zhàn),。在上游接入層官方側(cè)重點(diǎn)還放在GCE(Google Compute Engine)的對接優(yōu)化,,針對個(gè)人私有云還未推出一套可行的接入
解決方案。在v0.5版本中才引用service代理轉(zhuǎn)發(fā)的機(jī)制,,且是通過iptables來實(shí)現(xiàn),,在高并發(fā)下性能令人擔(dān)憂。但作者依然看好Kubernetes未來的發(fā)展,,至少目前
還未看到另外一個(gè)成體系,、具備良好生態(tài)圈的平臺,相信在V1.0時(shí)就會具備生產(chǎn)環(huán)境的服務(wù)支撐能力,。

kubernetes組件組成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1)kubectl
客戶端命令行工具,,將接受的命令格式化后發(fā)送給kube-apiserver,作為整個(gè)系統(tǒng)的操作入口,。
2)kube-apiserver
作為整個(gè)系統(tǒng)的控制入口,,以REST API服務(wù)提供接口。
3)kube-controller-manager
用來執(zhí)行整個(gè)系統(tǒng)中的后臺任務(wù),,包括節(jié)點(diǎn)狀態(tài)狀況,、Pod個(gè)數(shù)、Pods和Service的關(guān)聯(lián)等,。
4)kube-scheduler
負(fù)責(zé)節(jié)點(diǎn)資源管理,,接受來自kube-apiserver創(chuàng)建Pods任務(wù),并分配到某個(gè)節(jié)點(diǎn),。
5)etcd
負(fù)責(zé)節(jié)點(diǎn)間的服務(wù)發(fā)現(xiàn)和配置共享,。
6)kube-proxy
運(yùn)行在每個(gè)計(jì)算節(jié)點(diǎn)上,負(fù)責(zé)Pod網(wǎng)絡(luò)代理,。定時(shí)從etcd獲取到service信息來做相應(yīng)的策略,。
7)kubelet
運(yùn)行在每個(gè)計(jì)算節(jié)點(diǎn)上,作為agent,,接受分配該節(jié)點(diǎn)的Pods任務(wù)及管理容器,,周期性獲取容器狀態(tài),,反饋給kube-apiserver。
8)DNS
一個(gè)可選的DNS服務(wù),,用于為每個(gè)Service對象創(chuàng)建DNS記錄,,這樣所有的Pod就可以通過DNS訪問服務(wù)了。

Kubelet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
根據(jù)上圖可知Kubelet是Kubernetes集群中每個(gè)Minion和Master API Server的連接點(diǎn),,Kubelet運(yùn)行在每個(gè)Minion上,,是Master API Server和Minion之間的橋梁,
接收Master API Server分配給它的commands和work,,與持久性鍵值存儲etcd,、file、server和http進(jìn)行交互,,讀取配置信息,。Kubelet的主要工作是管理Pod和容
器的生命周期,其包括Docker Client,、Root Directory,、Pod Workers、Etcd Client,、Cadvisor Client以及Health Checker組件,具體工作如下:
1) 通過Worker給Pod異步運(yùn)行特定的Action,。
2) 設(shè)置容器的環(huán)境變量,。
3) 給容器綁定Volume。
4) 給容器綁定Port,。
5) 根據(jù)指定的Pod運(yùn)行一個(gè)單一容器,。
6) 殺死容器。
7) 給指定的Pod創(chuàng)建network 容器,。
8) 刪除Pod的所有容器,。
9) 同步Pod的狀態(tài)。
10) 從Cadvisor獲取container info,、 pod info,、root info、machine info,。
11) 檢測Pod的容器健康狀態(tài)信息,。
12) 在容器中運(yùn)行命令。

kubernetes基本部署步驟

1
2
3
4
5
6
7
8
9
10
1)minion節(jié)點(diǎn)安裝docker
2)minion節(jié)點(diǎn)配置跨主機(jī)容器通信
3)master節(jié)點(diǎn)部署etcd,、kube-apiserver,、kube-controller-manager和kube-scheduler組件
4)minion節(jié)點(diǎn)部署kubelet、kube-proxy組件
溫馨提示:
如果minion主機(jī)沒有安裝docker,,啟動kubelet時(shí)會報(bào)如下錯(cuò)誤:
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集群環(huán)境部署過程記錄

1)設(shè)置三臺機(jī)器的主機(jī)名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Master上執(zhí)行:
[root@localhost ~]# hostnamectl --static set-hostname  k8s-master
Node1上執(zhí)行:
[root@localhost ~]# hostnamectl --static set-hostname  k8s-node-1
  
Node2上執(zhí)行:
[root@localhost ~]# hostnamectl --static set-hostname  k8s-node-2
在三臺機(jī)器上都要設(shè)置hosts,,均執(zhí)行如下命令:
[root@k8s-master ~]# vim /etc/hosts
182.48.115.233    k8s-master
182.48.115.233    etcd
182.48.115.233    registry
182.48.115.235    k8s-node-1
182.48.115.236    k8s-node-2

2)關(guān)閉三臺機(jī)器上的防火墻

1
2
[root@k8s-master ~]# systemctl disable firewalld.service
[root@k8s-master ~]# systemctl stop firewalld.service

3)現(xiàn)在開始部署Master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
1)先安裝docker環(huán)境
[root@k8s-master ~]# yum install -y docker
  
配置Docker配置文件,,使其允許從registry中拉取鏡像
[root@k8s-master ~]# vim /etc/sysconfig/docker      #添加下面一行內(nèi)容
......
OPTIONS='--insecure-registry registry:5000'
   
[root@k8s-master ~]# systemctl start docker
  
2)安裝etcd
k8s運(yùn)行依賴etcd,需要先部署etcd,,下面采用yum方式安裝:
[root@k8s-master ~]# yum install etcd -y
   
yum安裝的etcd默認(rèn)配置文件在/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                                            #節(jié)點(diǎn)名稱
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"                  #數(shù)據(jù)存放位置
#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"             #監(jiān)聽客戶端地址
#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并驗(yàn)證狀態(tài)
[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上需要運(yùn)行以下組件: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"
啟動服務(wù)并設(shè)置開機(jī)自啟動
[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節(jié)點(diǎn)機(jī)器上都要操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
1)安裝docker
[root@k8s-node-1 ~]# yum install -y docker
配置Docker配置文件,,使其允許從registry中拉取鏡像
[root@k8s-node-1 ~]# vim /etc/sysconfig/docker      #添加下面一行內(nèi)容
......
OPTIONS='--insecure-registry registry:5000'
   
[root@k8s-node-1 ~]# systemctl start docker
2)安裝kubernets
[root@k8s-node-1 ~]# yum install kubernetes
配置并啟動kubernetes
在kubernetes master上需要運(yùn)行以下組件: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"                  #特別注意這個(gè),,在另一個(gè)node2節(jié)點(diǎn)上,,要改為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=""
啟動服務(wù)并設(shè)置開機(jī)自啟動
[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

查看狀態(tài)

1
2
3
4
5
6
7
8
9
10
11
在master上查看集群中節(jié)點(diǎn)及節(jié)點(diǎn)狀態(tài)
[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
到這里,就已經(jīng)搭建了一個(gè)kubernetes集群,,但目前該集群還不能很好的工作,,請需要繼續(xù)后續(xù)的操作。

kubernetes常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
查看node主機(jī)
[root@k8s-master ~]# kubectl get node        //有的環(huán)境是用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方式(這個(gè)及時(shí)性更高)
查看kubernetes版本
[root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/version | python -mjson.tool
查看pods清單
[root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/pods | python -mjson.tool
查看replicationControllers清單
[root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/replicationControllers | python -mjson.tool
查查看node主機(jī)(或者是minion主機(jī),,將下面命令中的node改成minion)
[root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/node | python -m json.tool
查看service清單
[root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/services | python -m json.tool
溫馨提示:
在新版Kubernetes中,,所有的操作命令都整合至kubectl,包括kubecfg,、kubectl.sh,、kubecfg.sh等

5)創(chuàng)建覆蓋網(wǎng)絡(luò)——Flannel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
1)安裝Flannel(在master、node上均執(zhí)行如下命令,,進(jìn)行安裝)
[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中關(guān)于flannel的key(這個(gè)只在master上操作)
Flannel使用Etcd進(jìn)行配置,來保證多個(gè)Flannel實(shí)例之間的配置一致性,,所以需要在etcd上進(jìn)行如下配置:('/atomic.io/network/config'這個(gè)key與上文/etc/sysconfig/flannel中的配置項(xiàng)FLANNEL_ETCD_PREFIX是相對應(yīng)的,,錯(cuò)誤的話啟動就會出錯(cuò))
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "182.48.0.0/16" }'
{ "Network": "182.48.0.0/16" }
  
4)啟動Flannel
啟動Flannel之后,需要依次重啟docker,、kubernete,。
  
在master執(zhí)行:
[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上執(zhí)行:
[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節(jié)點(diǎn),發(fā)現(xiàn)docker0網(wǎng)橋網(wǎng)絡(luò)的ip已經(jīng)是上面指定的182.48.0.0網(wǎng)段了,。并且在master和node節(jié)點(diǎn)上創(chuàng)建的容器間都是可以相互通信的,,能相互ping通!

6)部署nginx pod 和復(fù)制器
以下面的圖來安裝一個(gè)簡單的靜態(tài)內(nèi)容的nginx應(yīng)用:

用復(fù)制器啟動一個(gè)2個(gè)備份的nginx Pod,,然后在前面掛Service,,一個(gè)service只能被集群內(nèi)部訪問,一個(gè)能被集群外的節(jié)點(diǎn)訪問。下面所有的命令都是在master管理節(jié)點(diǎn)上運(yùn)行的,。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
1)首先部署nginx pod 和復(fù)制器---------------------------------------------------------------------
[root@k8s-master ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              3448f27c273f        8 days ago          109.4 MB
通過下面命令發(fā)現(xiàn)apiVersion版本是v1
[root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/version | python -mjson.tool
{
    "apiVersion": "v1",
    .......
}
開始創(chuàng)建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個(gè)備份
  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鏡像,所以所創(chuàng)建的Pod需要等待一些時(shí)間才能處于running狀態(tài),。
然后查看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所分到的節(jié)點(diǎn):
[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
.......
同理,,查看另一個(gè)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
.......
由上可以看出,這個(gè)復(fù)制器啟動了兩個(gè)Pod,,分別運(yùn)行在182.48.115.238和182.48.115.239這兩個(gè)節(jié)點(diǎn)上了,。到這兩個(gè)節(jié)點(diǎn)上查看,發(fā)現(xiàn)已經(jīng)有nginx應(yīng)用容器創(chuàng)建了,。
2)部署節(jié)點(diǎn)內(nèi)部可訪問的nginx service------------------------------------------------------------------------
Service的type有ClusterIP和NodePort之分,,缺省是ClusterIP,這種類型的Service只能在集群內(nèi)部訪問,。配置文件如下:
[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
然后執(zhí)行下面的命令創(chuàng)建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
驗(yàn)證service的可訪問性(訪問節(jié)點(diǎn)):
上面的輸出告訴我們這個(gè)Service的Cluster IP是10.254.163.249,,端口是8001。那么我們就來驗(yàn)證這個(gè)PortalNet IP的工作情況:
ssh登錄到節(jié)點(diǎn)機(jī)上驗(yàn)證(可以提前做ssh無密碼登錄的信任關(guān)系,,當(dāng)然也可以不做,,這樣驗(yàn)證時(shí)要手動輸入登錄密碼)
[root@k8s-master kubermange]# ssh 182.48.115.238 curl -s 10.254.163.249:8001            //或者直接到節(jié)點(diǎn)機(jī)上執(zhí)行"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:///"></a>.<br/>
Commercial support is available at
<a href="http:///"></a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
同理驗(yàn)證到另外一個(gè)節(jié)點(diǎn)機(jī)上的service的可訪問性也是ok的
[root@k8s-master kubermange]# ssh 182.48.115.239 curl -s 10.254.163.249:8001
由此可見,從前面部署復(fù)制器的部分可以知道nginx Pod運(yùn)行在182.48.115.238和182.48.115.239這兩個(gè)節(jié)點(diǎn)上,。
從這兩個(gè)節(jié)點(diǎn)上訪問我們的服務(wù)來體現(xiàn)Service Cluster IP在所有集群節(jié)點(diǎn)的可到達(dá)性,。
3)部署外部可訪問的nginx service-------------------------------------------------------------------
下面我們創(chuàng)建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
執(zhí)行下面的命令創(chuàng)建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
使用下面的命令獲得這個(gè)service的節(jié)點(diǎn)級別的端口:
[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
驗(yàn)證service的可訪問性(訪問節(jié)點(diǎn)):
上面的輸出告訴我們這個(gè)Service的節(jié)點(diǎn)級別端口是31298,。下面我們驗(yàn)證這個(gè)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:///"></a>.<br/>
Commercial support is available at
<a href="http:///"></a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
同理驗(yàn)證到另外一個(gè)節(jié)點(diǎn)機(jī)上的service的可訪問性也是ok的
[root@k8s-master kubermange]# curl 182.48.115.239:31298
----------------------------------------------------------
登錄另外兩個(gè)節(jié)點(diǎn)機(jī)上,發(fā)現(xiàn)已經(jīng)創(chuàng)建了nginx應(yīng)用容器
[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

------------------------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
1)可以擴(kuò)容nginx應(yīng)用容器,,依次添加對應(yīng)的應(yīng)用容器的pod,、service-clusterip,、service-nodeport的yaml文件即可,。
注意yaml文件中的name名。
2)當(dāng)然也可以添加其他應(yīng)用容器,,比如tomcat,,也是依次創(chuàng)建pod、service-clusterip,、service-nodeport的yaml文件,。
注意yaml文件中的name名和port端口不要重復(fù)
3)后面應(yīng)用容器的集群環(huán)境完成后(外部可訪問的端口是固定的),可以考慮做下master控制機(jī)的集群環(huán)境(即做etcd集群),。
可以在控制節(jié)點(diǎn)做負(fù)載均衡,,還可以通過keepalived做高可用。
---------------------------------------------------------
下面是tomcat應(yīng)用容器創(chuàng)建實(shí)例中的3個(gè)yaml文件
[root@k8s-master kubermange]# cat tomcat-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: tomcat-controller
spec:
  replicas: 2                             
  selector:
    name: tomcat
  template:
    metadata:
      labels:
        name: tomcat
    spec:
      containers:
        - name: tomcat
          image: docker.io/tomcat
          ports:
            - containerPort: 8080
[root@k8s-master kubermange]# cat tomcat-service-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service-clusterip
spec:
  ports:
    - port: 8801
      targetPort: 8080
      protocol: TCP
  selector:
    name: tomcat
[root@k8s-master kubermange]# cat tomcat-service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service-nodeport
spec:
  ports:
    - port: 8880
      targetPort: 8080
      protocol: TCP
  type: NodePort
  selector:
    name: tomcat
查看外部可訪問的tomcat service的端口
[root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe service tomcat-service-nodeport 2>/dev/null | grep NodePort
Type:     NodePort
NodePort:   <unset> 32095/TCP


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多