当前位置:   article > 正文

Docker集群管理工具-Kubernetes部署记录_服务镜像集群配置工具

服务镜像集群配置工具

Kubernetes介绍

  1. Kubernetes是Google开源的容器集群管理系统,是基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件。
  2. Kubernetes提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:
  3. 1) 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。
  4. 2) 将多台Docker主机抽象为一个资源,以集群的方式运行、管理跨机器的容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。
  5. 3)使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题
  6. 4) 解决Docker跨机器容器之间的通讯问题。
  7. 5)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有
  8. 十个容器在运行,反而杀死多余的。
  9. Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。
  10. Kubernetes和Mesos的区别
  11. 1)Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核;
  12. Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。
  13. 2)Mesos负责管理集群管资源(动态运行时,某机器有额外的资源,通知master来分配);
  14. Kubernetes抽象出新的容器组合模型并且对其编排管理(把容器自由组合提供服务这事儿搞定了,从而微服务,serverless等才真
  15. 正的优雅地在开发和运维之间不吵架地被实现),而且kubernetes把以前运维的很多很难搞的东西都变得容易了。比如OpenStack,
  16. Kubernetes是把OpenStack里面的VM换成了容器,但是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。
  17. 3)Mesos相比Kubernetes发展的时间更久,总体情况更成熟,在生产环境有更多的使用经验,国外使用Mesos的公司有Twitter,Apple,
  18. Airbnb,Uber等,国内也有大批知名公司在使用Mesos,比如:小米、当当、豆瓣、去哪儿、携程、唯品会、知乎、新浪微博、爱奇艺、
  19. 七牛、唯品会、bilibili、中国联通、中国移动、中国电信、华为、数人云等等。中大型公司会更倾向于使用Mesos,
  20. 因为本身这些公司有一定的开发能力,Mesos提供了良好的API而且有非常多成熟的Framework跑在Mesos上,Mesos+Marathon+Zookeeper
  21. 正常情况可以满足绝大部分需求,只需要写JSON或者DSL定义好service/application就好,只有一些特殊情况才确实需要写自己的Framework。
  22. 而kubernetes(k8s)现在也正在慢慢成熟起来,它在生产环境显然还需要更多时间来验证。京东目前已经在kubernetes上跑15W+容器了。
  23. Mesos现在越来越适应并且被添加上了很多Kubernete的概念同时支持了很多Kubernetes的API。因此如果你需要它们的话,它将是对你的
  24. Kubernetes应用去获得更多能力的一个便捷方式(比如高可用的主干、更加高级的调度命令、去管控很大数目结点的能力),同时能够很好的
  25. 适用于产品级工作环境中(毕竟Kubernetes任然还是一个初始版本)。
  26. 4)如果你是一个集群世界的新手,Kubernetes是一个很棒的起点。它是最快的、最简单的、最轻量级的方法去摆脱束缚,同时开启面向集群开发的实践。
  27. 它提供了一个高水平的可移植方案,因为它是被一些不同的贡献者所支持的( 例如微软、IBM、Red Hat、CoreOs、MesoSphere、VMWare等等)。
  28. 如果你已经有已经存在的工作任务(Hadoop、Spark、Kafka等等),Mesos给你提供了一个可以让你将不同工作任务相互交错的框架,然后混合进一个
  29. 包含Kubernetes 应用的新的东西。
  30. 如果你还没有用Kubernetes 系列框架完成项目的能力,Mesos给了你一个减压阀。


Kubernetes结构图

kubernetes角色组成

  1. 1)Pod
  2. 在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个可以被创建、销毁、调度、管理的最小的部署单元。
  3. 比如一个或一组容器。Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;同一个Pod只能运行在同一个主机上,共享相
  4. 同的volumes、network、namespace;
  5. 2)ReplicationController(RC)
  6. RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。在运行过程中,如果Pod数量
  7. 小于定义的,就会重启停止的或重新分配Pod,反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。RC通过label关联对应的Pods,
  8. 在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。
  9. Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的
  10. 副本数,即使副本所调度分配的宿主机出现异常,通过Replication Controller可以保证在其它主宿机启用同等数量的Pod。Replication Controller
  11. 可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Label selector来关联。
  12. 3)Service
  13. Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,
  14. 会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。
  15. Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源,目前的版本是通过iptables的nat转发来实现,
  16. 转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。
  17. 4)Label
  18. Label是用于区分Pod、Service、RC的key/value键值对;仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元本身进行操
  19. 作时得使用name标签。Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;主要是将Service的请求通过lable转发给后端提供服务的Pod集合;
  20. 说说个人一点看法,目前Kubernetes保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不同版本操作方法的差异,另外官网文档更新速度
  21. 相对滞后及欠缺,给初学者带来一定挑战。在上游接入层官方侧重点还放在GCE(Google Compute Engine)的对接优化,针对个人私有云还未推出一套可行的接入
  22. 解决方案。在v0.5版本中才引用service代理转发的机制,且是通过iptables来实现,在高并发下性能令人担忧。但作者依然看好Kubernetes未来的发展,至少目前
  23. 还未看到另外一个成体系、具备良好生态圈的平台,相信在V1.0时就会具备生产环境的服务支撑能力。
  24. kubernetes组件组成
  25. 1)kubectl
  26. 客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。
  27. 2)kube-apiserver
  28. 作为整个系统的控制入口,以REST API服务提供接口。
  29. 3)kube-controller-manager
  30. 用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。
  31. 4)kube-scheduler
  32. 负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。
  33. 5)etcd
  34. 负责节点间的服务发现和配置共享。
  35. 6)kube-proxy
  36. 运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。
  37. 7)kubelet
  38. 运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。
  39. 8)DNS
  40. 一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。

Kubelet

  1. 根据上图可知Kubelet是Kubernetes集群中每个Minion和Master API Server的连接点,Kubelet运行在每个Minion上,是Master API Server和Minion之间的桥梁,
  2. 接收Master API Server分配给它的commands和work,与持久性键值存储etcd、file、server和http进行交互,读取配置信息。Kubelet的主要工作是管理Pod和容
  3. 器的生命周期,其包括Docker Client、Root Directory、Pod Workers、Etcd Client、Cadvisor Client以及Health Checker组件,具体工作如下:
  4. 1) 通过Worker给Pod异步运行特定的Action。
  5. 2) 设置容器的环境变量。
  6. 3) 给容器绑定Volume。
  7. 4) 给容器绑定Port。
  8. 5) 根据指定的Pod运行一个单一容器。
  9. 6) 杀死容器。
  10. 7) 给指定的Pod创建network 容器。
  11. 8) 删除Pod的所有容器。
  12. 9) 同步Pod的状态。
  13. 10) 从Cadvisor获取container info、 pod info、root info、machine info。
  14. 11) 检测Pod的容器健康状态信息。
  15. 12) 在容器中运行命令。
  16. kubernetes基本部署步骤
  17. 1)minion节点安装docker
  18. 2)minion节点配置跨主机容器通信
  19. 3)master节点部署etcd、kube-apiserver、kube-controller-manager和kube-scheduler组件
  20. 4)minion节点部署kubelet、kube-proxy组件
  21. 温馨提示:
  22. 如果minion主机没有安装docker,启动kubelet时会报如下错误:
  23. Could not load kubeconfig file /var/lib/kubelet/kubeconfig: stat /var/lib/kubelet/kubeconfig: no such file or directory. Trying auth path instead.
  24. 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.
  25. No cloud provider specified.


kubernetes集群环境部署过程记录

  1. 1)设置三台机器的主机名
  2. Master上执行:
  3. [root@localhost ~]# hostnamectl --static set-hostname k8s-master
  4. Node1上执行:
  5. [root@localhost ~]# hostnamectl --static set-hostname k8s-node-1
  6.   
  7. Node2上执行:
  8. [root@localhost ~]# hostnamectl --static set-hostname k8s-node-2
  9. 在三台机器上都要设置hosts,均执行如下命令:
  10. [root@k8s-master ~]# vim /etc/hosts
  11. 182.48.115.233 k8s-master
  12. 182.48.115.233 etcd
  13. 182.48.115.233 registry
  14. 182.48.115.235 k8s-node-1
  15. 182.48.115.236 k8s-node-2
  16. 2)关闭三台机器上的防火墙
  17. root@k8s-master ~]# systemctl disable firewalld.service
  18. [root@k8s-master ~]# systemctl stop firewalld.service
  19. 3)现在开始部署Master
  20. 1)先安装docker环境
  21. [root@k8s-master ~]# yum install -y docker
  22. 配置Docker配置文件,使其允许从registry中拉取镜像
  23. [root@k8s-master ~]# vim /etc/sysconfig/docker #添加下面一行内容
  24. ......
  25. OPTIONS='--insecure-registry registry:5000'
  26. [root@k8s-master ~]# systemctl start docker
  27. 2)安装etcd
  28. k8s运行依赖etcd,需要先部署etcd,下面采用yum方式安装:
  29. [root@k8s-master ~]# yum install etcd -y
  30. yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,编辑配置文件:
  31. [root@k8s-master ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
  32. [root@k8s-master ~]# cat /etc/etcd/etcd.conf
  33. #[member]
  34. ETCD_NAME=master #节点名称
  35. ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #数据存放位置
  36. #ETCD_WAL_DIR=""
  37. #ETCD_SNAPSHOT_COUNT="10000"
  38. #ETCD_HEARTBEAT_INTERVAL="100"
  39. #ETCD_ELECTION_TIMEOUT="1000"
  40. #ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
  41. ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" #监听客户端地址
  42. #ETCD_MAX_SNAPSHOTS="5"
  43. #ETCD_MAX_WALS="5"
  44. #ETCD_CORS=""
  45. #
  46. #[cluster]
  47. #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
  48. # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
  49. #ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
  50. #ETCD_INITIAL_CLUSTER_STATE="new"
  51. #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  52. ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379,http://etcd:4001" #通知客户端地址
  53. #ETCD_DISCOVERY=""
  54. #ETCD_DISCOVERY_SRV=""
  55. #ETCD_DISCOVERY_FALLBACK="proxy"
  56. #ETCD_DISCOVERY_PROXY=""
  57. 启动etcd并验证状态
  58. [root@k8s-master ~]# systemctl start etcd
  59. [root@k8s-master ~]# ps -ef|grep etcd
  60. 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
  61. root 28185 24819 0 14:38 pts/1 00:00:00 grep --color=auto etcd
  62. [root@k8s-master ~]# lsof -i:2379
  63. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  64. etcd 28145 etcd 6u IPv6 1283822 0t0 TCP *:2379 (LISTEN)
  65. etcd 28145 etcd 18u IPv6 1284133 0t0 TCP localhost:53203->localhost:2379 (ESTABLISHED)
  66. ........
  67. [root@k8s-master ~]# etcdctl set testdir/testkey0 0
  68. 0
  69. [root@k8s-master ~]# etcdctl get testdir/testkey0
  70. 0
  71. [root@k8s-master ~]# etcdctl -C http://etcd:4001 cluster-health
  72. member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
  73. cluster is healthy
  74. [root@k8s-master ~]# etcdctl -C http://etcd:2379 cluster-health
  75. member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
  76. cluster is healthy
  77. 3)安装kubernets
  78. [root@k8s-master ~]# yum install kubernetes
  79. 配置并启动kubernetes
  80. 在kubernetes master上需要运行以下组件:Kubernets API Server、Kubernets Controller Manager、Kubernets Scheduler
  81. [root@k8s-master ~]# cp /etc/kubernetes/apiserver /etc/kubernetes/apiserver.bak
  82. [root@k8s-master ~]# vim /etc/kubernetes/apiserver
  83. ###
  84. # kubernetes system config
  85. #
  86. # The following values are used to configure the kube-apiserver
  87. #
  88. # The address on the local server to listen to.
  89. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
  90. # The port on the local server to listen on.
  91. KUBE_API_PORT="--port=8080"
  92. # Port minions listen on
  93. # KUBELET_PORT="--kubelet-port=10250"
  94. # Comma separated list of nodes in the etcd cluster
  95. KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379"
  96. # Address range to use for services
  97. KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
  98. # default admission control policies
  99. #KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
  100. KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
  101. # Add your own!
  102. KUBE_API_ARGS=""
  103. [root@k8s-master ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak
  104. [root@k8s-master ~]# vim /etc/kubernetes/config
  105. ###
  106. # kubernetes system config
  107. #
  108. # The following values are used to configure various aspects of all
  109. # kubernetes services, including
  110. #
  111. # kube-apiserver.service
  112. # kube-controller-manager.service
  113. # kube-scheduler.service
  114. # kubelet.service
  115. # kube-proxy.service
  116. # logging to stderr means we get it in the systemd journal
  117. KUBE_LOGTOSTDERR="--logtostderr=true"
  118. # journal message level, 0 is debug
  119. KUBE_LOG_LEVEL="--v=0"
  120. # Should this cluster be allowed to run privileged docker containers
  121. KUBE_ALLOW_PRIV="--allow-privileged=false"
  122. # How the controller-manager, scheduler, and proxy find the apiserver
  123. KUBE_MASTER="--master=http://k8s-master:8080"
  124. 启动服务并设置开机自启动
  125. [root@k8s-master ~]# systemctl enable kube-apiserver.service
  126. [root@k8s-master ~]# systemctl start kube-apiserver.service
  127. [root@k8s-master ~]# systemctl enable kube-controller-manager.service
  128. [root@k8s-master ~]# systemctl start kube-controller-manager.service
  129. [root@k8s-master ~]# systemctl enable kube-scheduler.service
  130. [root@k8s-master ~]# systemctl start kube-scheduler.service
  131. 4)接着部署Node(在两台node节点机器上都要操作)
  132. 1)安装docker
  133. [root@k8s-node-1 ~]# yum install -y docker
  134. 配置Docker配置文件,使其允许从registry中拉取镜像
  135. [root@k8s-node-1 ~]# vim /etc/sysconfig/docker #添加下面一行内容
  136. ......
  137. OPTIONS='--insecure-registry registry:5000'
  138. [root@k8s-node-1 ~]# systemctl start docker
  139. 2)安装kubernets
  140. [root@k8s-node-1 ~]# yum install kubernetes
  141. 配置并启动kubernetes
  142. 在kubernetes master上需要运行以下组件:Kubelet、Kubernets Proxy
  143. [root@k8s-node-1 ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak
  144. [root@k8s-node-1 ~]# vim /etc/kubernetes/config
  145. ###
  146. # kubernetes system config
  147. #
  148. # The following values are used to configure various aspects of all
  149. # kubernetes services, including
  150. #
  151. # kube-apiserver.service
  152. # kube-controller-manager.service
  153. # kube-scheduler.service
  154. # kubelet.service
  155. # kube-proxy.service
  156. # logging to stderr means we get it in the systemd journal
  157. KUBE_LOGTOSTDERR="--logtostderr=true"
  158. # journal message level, 0 is debug
  159. KUBE_LOG_LEVEL="--v=0"
  160. # Should this cluster be allowed to run privileged docker containers
  161. KUBE_ALLOW_PRIV="--allow-privileged=false"
  162. # How the controller-manager, scheduler, and proxy find the apiserver
  163. KUBE_MASTER="--master=http://k8s-master:8080"
  164. [root@k8s-node-1 ~]# cp /etc/kubernetes/kubelet /etc/kubernetes/kubelet.bak
  165. [root@k8s-node-1 ~]# vim /etc/kubernetes/kubelet
  166. ###
  167. # kubernetes kubelet (minion) config
  168. # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
  169. KUBELET_ADDRESS="--address=0.0.0.0"
  170. # The port for the info server to serve on
  171. # KUBELET_PORT="--port=10250"
  172. # You may leave this blank to use the actual hostname
  173. KUBELET_HOSTNAME="--hostname-override=k8s-node-1" #特别注意这个,在另一个node2节点上,要改为k8s-node-2
  174. # location of the api-server
  175. KUBELET_API_SERVER="--api-servers=http://k8s-master:8080"
  176. # pod infrastructure container
  177. KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
  178. # Add your own!
  179. KUBELET_ARGS=""
  180. 启动服务并设置开机自启动
  181. [root@k8s-node-1 ~]# systemctl enable kubelet.service
  182. [root@k8s-node-1 ~]# systemctl start kubelet.service
  183. [root@k8s-node-1 ~]# systemctl enable kube-proxy.service
  184. [root@k8s-node-1 ~]# systemctl start kube-proxy.service
  185. 查看状态
  186. 在master上查看集群中节点及节点状态
  187. [root@k8s-master ~]# kubectl -s http://k8s-master:8080 get node
  188. NAME STATUS AGE
  189. k8s-node-1 Ready 10m
  190. k8s-node-2 Ready 1m
  191. [root@k8s-master ~]# kubectl get nodes
  192. NAME STATUS AGE
  193. k8s-node-1 Ready 10m
  194. k8s-node-2 Ready 1m
  195. 到这里,就已经搭建了一个kubernetes集群,但目前该集群还不能很好的工作,请需要继续后续的操作。
  196. kubernetes常用命令
  197. 查看node主机
  198. [root@k8s-master ~]# kubectl get node //有的环境是用monion,那么查看命令就是"kubectl get minions"
  199. 查看pods清单
  200. [root@k8s-master ~]# kubectl get pods
  201. 查看service清单
  202. [root@k8s-master ~]# kubectl get services //或者使用命令"kubectl get services -o json"
  203. 查看replicationControllers清单
  204. [root@k8s-master ~]# kubectl get replicationControllers
  205. 删除所有pods(同理将下面命令中的pods换成services或replicationControllers,就是删除所有的services或replicationContronllers)
  206. [root@k8s-master ~]# for i in `kubectl get pod|tail -n +2|awk '{print $1}'`; do kubectl delete pod $i; done
  207. --------------------------------------------------------------------------
  208. 除了上面那种查看方式,还可以通过Server api for REST方式(这个及时性更高)
  209. 查看kubernetes版本
  210. [root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/version | python -mjson.tool
  211. 查看pods清单
  212. [root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/pods | python -mjson.tool
  213. 查看replicationControllers清单
  214. [root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/replicationControllers | python -mjson.tool
  215. 查查看node主机(或者是minion主机,将下面命令中的node改成minion)
  216. [root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/node | python -m json.tool
  217. 查看service清单
  218. [root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/services | python -m json.tool
  219. 温馨提示:
  220. 在新版Kubernetes中,所有的操作命令都整合至kubectl,包括kubecfg、kubectl.sh、kubecfg.sh等
  221. 5)创建覆盖网络——Flannel
  222. 1)安装Flannel(在master、node上均执行如下命令,进行安装)
  223. [root@k8s-master ~]# yum install flannel
  224. 2)配置Flannel(在master、node上均编辑/etc/sysconfig/flanneld)
  225. [root@k8s-master ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
  226. [root@k8s-master ~]# vim /etc/sysconfig/flanneld
  227. # Flanneld configuration options
  228. # etcd url location. Point this to the server where etcd runs
  229. FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"
  230. # etcd config key. This is the configuration key that flannel queries
  231. # For address range assignment
  232. FLANNEL_ETCD_PREFIX="/atomic.io/network"
  233. # Any additional options that you want to pass
  234. #FLANNEL_OPTIONS=""
  235. 3)配置etcd中关于flannel的key(这个只在master上操作)
  236. Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要在etcd上进行如下配置:('/atomic.io/network/config'这个key与上文/etc/sysconfig/flannel中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错)
  237. [root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "182.48.0.0/16" }'
  238. { "Network": "182.48.0.0/16" }
  239. 4)启动Flannel
  240. 启动Flannel之后,需要依次重启docker、kubernete。
  241. 在master执行:
  242. [root@k8s-master ~]# systemctl enable flanneld.service
  243. [root@k8s-master ~]# systemctl start flanneld.service
  244. [root@k8s-master ~]# service docker restart
  245. [root@k8s-master ~]# systemctl restart kube-apiserver.service
  246. [root@k8s-master ~]# systemctl restart kube-controller-manager.service
  247. [root@k8s-master ~]# systemctl restart kube-scheduler.service
  248. 在node上执行:
  249. [root@k8s-node-1 ~]# systemctl enable flanneld.service
  250. [root@k8s-node-1 ~]# systemctl start flanneld.service
  251. [root@k8s-node-1 ~]# service docker restart
  252. [root@k8s-node-1 ~]# systemctl restart kubelet.service
  253. [root@k8s-node-1 ~]# systemctl restart kube-proxy.service
  254. 然后通过ifconfig命令查看maste和node节点,发现docker0网桥网络的ip已经是上面指定的182.48.0.0网段了。并且在master和node节点上创建的容器间都是可以相互通信的,能相互ping通!



6)部署nginx pod 和复制器
以下面的图来安装一个简单的静态内容的nginx应用:

用复制器启动一个2个备份的nginx Pod,然后在前面挂Service,一个service只能被集群内部访问,一个能被集群外的节点访问。下面所有的命令都是在master管理节点上运行的。

  1. 1)首先部署nginx pod 和复制器---------------------------------------------------------------------
  2. [root@k8s-master ~]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. docker.io/nginx latest 3448f27c273f 8 days ago 109.4 MB
  5. 通过下面命令发现apiVersion版本是v1
  6. [root@k8s-master ~]# curl -s -L http://182.48.115.237:8080/api/v1beta1/version | python -mjson.tool
  7. {
  8. "apiVersion": "v1",
  9. .......
  10. }
  11. 开始创建pod单元
  12. [root@k8s-master ~]# mkdir -p /home/kubermange && cd /home/kubermange
  13. [root@k8s-master kubermange]# vim nginx-rc.yaml
  14. apiVersion: v1
  15. kind: ReplicationController
  16. metadata:
  17. name: nginx-controller
  18. spec:
  19. replicas: 2 #即2个备份
  20. selector:
  21. name: nginx
  22. template:
  23. metadata:
  24. labels:
  25. name: nginx
  26. spec:
  27. containers:
  28. - name: nginx
  29. image: docker.io/nginx
  30. ports:
  31. - containerPort: 80
  32. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 create -f nginx-rc.yaml
  33. replicationcontroller "nginx-controller" created
  34. 由于kubernetes要去gcr.io下载gcr.io/google_containers/pause镜像,然后下载nginx镜像,所以所创建的Pod需要等待一些时间才能处于running状态。
  35. 然后查看pods清单
  36. [root@k8s-master kubermange]# kubectl -s http://k8s-master:8080 get pods
  37. NAME READY STATUS RESTARTS AGE
  38. nginx-controller-f0j9c 0/1 ContainerCreating 0 1m
  39. nginx-controller-v219k 0/1 ContainerCreating 0 1m
  40. 可以使用describe 命令查看pod所分到的节点:
  41. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe pod nginx-controller-f0j9c
  42. Name: nginx-controller-f0j9c
  43. Namespace: default
  44. Node: k8s-node-1/182.48.115.238
  45. .......
  46. 同理,查看另一个pod
  47. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe pod nginx-controller-v219k
  48. Name: nginx-controller-v219k
  49. Namespace: default
  50. Node: k8s-node-2/182.48.115.239
  51. .......
  52. 由上可以看出,这个复制器启动了两个Pod,分别运行在182.48.115.238和182.48.115.239这两个节点上了。到这两个节点上查看,发现已经有nginx应用容器创建了。
  53. 2)部署节点内部可访问的nginx service------------------------------------------------------------------------
  54. Service的type有ClusterIP和NodePort之分,缺省是ClusterIP,这种类型的Service只能在集群内部访问。配置文件如下:
  55. [root@k8s-master kubermange]# vim nginx-service-clusterip.yaml
  56. apiVersion: v1
  57. kind: Service
  58. metadata:
  59. name: nginx-service-clusterip
  60. spec:
  61. ports:
  62. - port: 8001
  63. targetPort: 80
  64. protocol: TCP
  65. selector:
  66. name: nginx
  67. 然后执行下面的命令创建service:
  68. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 create -f ./nginx-service-clusterip.yaml
  69. service "nginx-service-clusterip" created
  70. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 get service
  71. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  72. kubernetes 10.254.0.1 <none> 443/TCP 2h
  73. nginx-service-clusterip 10.254.163.249 <none> 8001/TCP 24s
  74. 验证service的可访问性(访问节点):
  75. 上面的输出告诉我们这个Service的Cluster IP是10.254.163.249,端口是8001。那么我们就来验证这个PortalNet IP的工作情况:
  76. ssh登录到节点机上验证(可以提前做ssh无密码登录的信任关系,当然也可以不做,这样验证时要手动输入登录密码)
  77. [root@k8s-master kubermange]# ssh 182.48.115.238 curl -s 10.254.163.249:8001 //或者直接到节点机上执行"curl -s 10.254.163.249:8001"
  78. The authenticity of host '182.48.115.238 (182.48.115.238)' can't be established.
  79. ECDSA key fingerprint is 4c:24:35:e0:35:00:86:05:94:a2:9e:f9:22:b0:90:b7.
  80. Are you sure you want to continue connecting (yes/no)? yes
  81. Warning: Permanently added '182.48.115.238' (ECDSA) to the list of known hosts.
  82. root@182.48.115.238's password:
  83. <!DOCTYPE html>
  84. <html>
  85. <head>
  86. <title>Welcome to nginx!</title>
  87. <style>
  88. body {
  89. width: 35em;
  90. margin: 0 auto;
  91. font-family: Tahoma, Verdana, Arial, sans-serif;
  92. }
  93. </style>
  94. </head>
  95. <body>
  96. <h1>Welcome to nginx!</h1>
  97. <p>If you see this page, the nginx web server is successfully installed and
  98. working. Further configuration is required.</p>
  99. <p>For online documentation and support please refer to
  100. <a href="http://nginx.org/">nginx.org</a>.<br/>
  101. Commercial support is available at
  102. <a href="http://nginx.com/">nginx.com</a>.</p>
  103. <p><em>Thank you for using nginx.</em></p>
  104. </body>
  105. </html>
  106. 同理验证到另外一个节点机上的service的可访问性也是ok的
  107. [root@k8s-master kubermange]# ssh 182.48.115.239 curl -s 10.254.163.249:8001
  108. 由此可见,从前面部署复制器的部分可以知道nginx Pod运行在182.48.115.238和182.48.115.239这两个节点上。
  109. 从这两个节点上访问我们的服务来体现Service Cluster IP在所有集群节点的可到达性。
  110. 3)部署外部可访问的nginx service-------------------------------------------------------------------
  111. 下面我们创建NodePort类型的Service,这种类型的Service在集群外部是可以访问。下表是本文用的配置文件:
  112. [root@k8s-master kubermange]# vim nginx-service-nodeport.yaml
  113. apiVersion: v1
  114. kind: Service
  115. metadata:
  116. name: nginx-service-nodeport
  117. spec:
  118. ports:
  119. - port: 8000
  120. targetPort: 80
  121. protocol: TCP
  122. type: NodePort
  123. selector:
  124. name: nginx
  125. 执行下面的命令创建service:
  126. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 create -f ./nginx-service-nodeport.yaml
  127. service "nginx-service-nodeport" created
  128. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 get service
  129. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  130. kubernetes 10.254.0.1 <none> 443/TCP 2h
  131. nginx-service-clusterip 10.254.163.249 <none> 8001/TCP 13m
  132. nginx-service-nodeport 10.254.146.68 <nodes> 8000:31298/TCP 22s
  133. 使用下面的命令获得这个service的节点级别的端口:
  134. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe service nginx-service-nodeport 2>/dev/null | grep NodePort
  135. Type: NodePort
  136. NodePort: <unset> 31298/TCP
  137. 验证service的可访问性(访问节点):
  138. 上面的输出告诉我们这个Service的节点级别端口是31298。下面我们验证这个Service的工作情况:
  139. [root@k8s-master kubermange]# curl 182.48.115.238:31298
  140. <!DOCTYPE html>
  141. <html>
  142. <head>
  143. <title>Welcome to nginx!</title>
  144. <style>
  145. body {
  146. width: 35em;
  147. margin: 0 auto;
  148. font-family: Tahoma, Verdana, Arial, sans-serif;
  149. }
  150. </style>
  151. </head>
  152. <body>
  153. <h1>Welcome to nginx!</h1>
  154. <p>If you see this page, the nginx web server is successfully installed and
  155. working. Further configuration is required.</p>
  156. <p>For online documentation and support please refer to
  157. <a href="http://nginx.org/">nginx.org</a>.<br/>
  158. Commercial support is available at
  159. <a href="http://nginx.com/">nginx.com</a>.</p>
  160. <p><em>Thank you for using nginx.</em></p>
  161. </body>
  162. </html>
  163. 同理验证到另外一个节点机上的service的可访问性也是ok的
  164. [root@k8s-master kubermange]# curl 182.48.115.239:31298
  165. ----------------------------------------------------------
  166. 登录另外两个节点机上,发现已经创建了nginx应用容器
  167. [root@k8s-node-1 ~]# docker ps
  168. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  169. 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
  170. 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
  171. [root@k8s-node-2 ~]# docker ps
  172. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  173. 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
  174. cde94e406f9a registry.access.redhat.com/rhel7/pod-infrastructure:latest "/pod" 30 minutes ago Up 30 minutes


  1. 1)可以扩容nginx应用容器,依次添加对应的应用容器的pod、service-clusterip、service-nodeport的yaml文件即可。
  2. 注意yaml文件中的name名。
  3. 2)当然也可以添加其他应用容器,比如tomcat,也是依次创建pod、service-clusterip、service-nodeport的yaml文件。
  4. 注意yaml文件中的name名和port端口不要重复
  5. 3)后面应用容器的集群环境完成后(外部可访问的端口是固定的),可以考虑做下master控制机的集群环境(即做etcd集群)。
  6. 可以在控制节点做负载均衡,还可以通过keepalived做高可用。
  7. ---------------------------------------------------------
  8. 下面是tomcat应用容器创建实例中的3个yaml文件
  9. [root@k8s-master kubermange]# cat tomcat-rc.yaml
  10. apiVersion: v1
  11. kind: ReplicationController
  12. metadata:
  13. name: tomcat-controller
  14. spec:
  15. replicas: 2
  16. selector:
  17. name: tomcat
  18. template:
  19. metadata:
  20. labels:
  21. name: tomcat
  22. spec:
  23. containers:
  24. - name: tomcat
  25. image: docker.io/tomcat
  26. ports:
  27. - containerPort: 8080
  28. [root@k8s-master kubermange]# cat tomcat-service-clusterip.yaml
  29. apiVersion: v1
  30. kind: Service
  31. metadata:
  32. name: tomcat-service-clusterip
  33. spec:
  34. ports:
  35. - port: 8801
  36. targetPort: 8080
  37. protocol: TCP
  38. selector:
  39. name: tomcat
  40. [root@k8s-master kubermange]# cat tomcat-service-nodeport.yaml
  41. apiVersion: v1
  42. kind: Service
  43. metadata:
  44. name: tomcat-service-nodeport
  45. spec:
  46. ports:
  47. - port: 8880
  48. targetPort: 8080
  49. protocol: TCP
  50. type: NodePort
  51. selector:
  52. name: tomcat
  53. 查看外部可访问的tomcat service的端口
  54. [root@k8s-master kubermange]# kubectl -s http://182.48.115.237:8080 describe service tomcat-service-nodeport 2>/dev/null | grep NodePort
  55. Type: NodePort
  56. NodePort: <unset> 32095/TCP









声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/728182
推荐阅读
相关标签
  

闽ICP备14008679号