设为首页 收藏本站
查看: 1744|回复: 0

[经验分享] 单节点k8s的一个小例子

[复制链接]

尚未签到

发表于 2018-1-6 06:05:08 | 显示全部楼层 |阅读模式
  最近开始阅读《Kubernetes权威指南》这本书,书上有一个单节点k8s的小例子,所以就跟着书上的步骤以及这篇博客http://lihaoquan.me/2017/2/25/create-kubernetes-single-node-mode.html操作了一遍,现在把这个过程记录下来,对k8s有一个较直观的认识。
  这是一个简单的Java Web应用,结构简单,是一个运行在Tomcat里的Web App,JSP页面通过JDBC直接访问MySQL数据库并展示数据。
  此应用需要启动两个容器:Web App容器和MySQL容器,并且Web App容器需要访问MySQL容器。
  1.环境准备
  这次实验使用的环境是Centos7, IP地址为10.0.0.73
  (1)yum源
  刚开始我虚拟机的yum源是清华大学的,后面换了个阿里云的yum源。我是为了和博客保持一致,不换源应该也是可以的(有待验证)。
  换源操作:
  备份
  

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup  

  

  下载新的CentOS-Base.repo到 /etc/yum.repos.d
  

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo  

  最后运行
  

yum makecache  

  (2)关闭防火墙
  centos7自带firewall的防火墙业务,而k8s的master与工作node之间会有大量的网络通信,安全的做法实在防火墙上配置各种需要相互通信的端口号,比如后面用到的3306,30001等端口。本文仅做一个学习过程,所以直接关闭防火墙服务。
  

systemctl disable firewalld.service  
systemctl stop firewalld.service
  

  2.安装和配置k8s
  (1)安装etcd和k8s软件(安装过程中会自动安装Docker软件)
  

yum install -y etcd kubernetes  

  (2)配置修改
  安装完成后,需要修改相关配置
  

nano  /etc/sysconfig/docker  

  将其中的OPTIONS的内容设置为:OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
  

nano /etc/kubernetes/apiserver  

  在KUBE_ADMISSION_CONTROL选项中去掉ServiceAccount选项。否则在后面的pod创建中,会报错。
  (3)切换docker hub镜像源
  为了稳定pull镜像,使用Daocloud的镜像服务
  

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://dbe35452.m.daocloud.io  

  (4)按顺序启动所有服务
  

systemctl start etcd  
systemctl start docker
  

  在启动docker是遇到了如下错误:

  运行命令查看docker服务
  

systemctl status docker.service  


  试了很多方法都不行后,在这个链接下面找到了答案https://segmentfault.com/q/1010000002392472。原来由于上面切换了docker hub源导致的问题。将/etc/docker/daemon.json中 {"registry-mirrors": ["http://34df6785.m.daocloud.io"],} 后面的逗号去掉就可以。
  

nano /etc/docker/daemon.json  


  继续启动剩下的服务
  

systemctl start kube-apiserver.service  
systemctl start kube
-controller-manager.service  
systemctl start kube
-scheduler.service  
systemctl start kubelet.service
  
systemctl start kube
-proxy.service  

  到目前为止,一个单机版的k8s环境就跑起来了。
  3.启动MySQL容器服务
  (1)先拉去mysql的服务镜像:
  

docker pull mysql  

  (2)启动MySQL服务
  首先为MySQL服务创建一个RC定义文件:mysql-rc.yaml。RC(Replication Controller)定义文件中有3个关键信息:


  • 目标Pod的定义。
  • 目标Pod需要运行的副本数量(Replicas)
  • 要监控的目标Pod的标签(Label),Label是Service和Pod之间的纽带
  

apiVersion: v1  
kind: ReplicationController                            #副本控制器RC
  
metadata:
  name: mysql                                          #RC的名称,全局唯一
  
spec:
  replicas:
1                                          #Pod副本的期待数量  selector:
  app: mysql                                         #符合目标的Pod拥有此标签
  template:                                            #根据此模板创建Pod的副本(实例)
  metadata:
  labels:
  app: mysql                                     #Pod副本拥有的标签,对应RC的Selector
  spec:
  containers:                                      #Pod内容器的定义部分
- name: mysql                                    #容器的名称  image: hub.c.
163.com/library/mysql              #容器对应的Docker image  ports:
- containerPort: 3306                          #容器应用监听的端口号env:                                           #注入容器内的环境变量- name: MYSQL_ROOT_PASSWORD  value:
"123456"  

  创建好mysql-rc.yaml后,在master节点使用kubectl命令将它发布到k8s集群中。
  

kubectl create -f mysql-rc.yaml  


  接下来使用kubectl命令查看刚刚创建的RC:

  使用下面命令查看Pod的创建情况:

  可见Pod的状态处于ContainerCreating,需要等到状态为Runing才算成功。我在这里碰到了一个bug,Pod一直处在ContainerCreating状态。博客http://blog.csdn.net/xts_huangxin/article/details/51130223提供了定位这种问题的方法。通过“kubectl describe pod PodName”指令查看pod发生的事件,从输出中查看错误信息。我这边的输出是:

  然后根据博客http://blog.csdn.net/learner198461/article/details/78036854提供的解决办法,安装rhsm(我也不知道这个是干什么的,就是红帽的一个软件)
  

yum install *rhsm*  

  然后再运行
  

kubectl delete -f mysql-rc.yaml  kubectl create -f mysql-rc.yaml
  kubectl get pods
  

  发现Pod已经跑起来了。

  (3)创建关联Service
  最后,我们创建一个与之关联的Kubernetes Service-MySQL的定义文件:mysql-svc.yaml
  

apiVersion: v1  
kind: Service                              #表明是K8s Service
  
metadata:
  name: mysql                              #Service的全局唯一名称
  
spec:
  ports:
- port: 3306                           #Service提供服务的端口号  selector:                                #Service对应的Pod拥有这里定义的标签
  app: mysql
  

  spec.selector确定了哪些Pod副本(实例)对应到本服务。类似地,我们通过kubectl create命令创建Service对象。
  运行kubectl命令,创建service:
  

kubectl create -f mysql-svc.yaml  

  再运行如下状态,查看刚刚创建的service:
  

kubectl get svc  


  注意到MySQL服务被分配到了一个值为10.254.152.247的Cluster IP地址,这是一个虚地址,随后,k8s集群中其他新创建的Pod就可以通过Service的Cluster IP+端口号3306来连接和访问它了。现在我们只需知道,根据Service的唯一名字,容器可以从环境变量中获取到Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求了。
  到这里,MySQL容器服务就启动了。小结下创建过程,首先,拉取服务镜像,然后创建RC定义文件,再发布到k8s中,可以看到pod被创建。最后创建一个与之关联的k8s Service,也是通过.yaml文件和kubectl create命令创建。当然,这其中还牵扯到很多概念,比如说Pod和Service之间的联系等等,这个要另起篇幅。
  4.启动Web容器服务
  有了上面启动MySQL容器服务的经验,我们来启动Web容器服务,过程是一样的。
  (1)先拉取一个测试镜像到本地
  

docker pull kubeguide/tomcat-app:v1  


  (2)创建对应的RC文件myweb-rc.yaml,内容如下:
  

apiVersion: v1  
kind: ReplicationController
  
metadata:
  name: myweb
  
spec:
  replicas:
5                                       #Pod副本期待数量为5  selector:
  app: myweb
  template:
  metadata:
  labels:
  app: myweb
  spec:
  containers:
- name: myweb  image: docker.io
/kubeguide/tomcat-app:v1  ports:
- containerPort: 8080  env:
  - name: MYSQL_SERVICE_HOST
  value: "mysql"
  - name: MYSQL_SERVICE_PORT
  value: "3306"
  

  然后通过kubectl create命令完成RC的创建和验证工作:
  

kubectl create -f myweb-rc.yaml  
kubectl get rc
  
kubectl get pods
  


  从输出看到,在RC中声明了5个Pod期待的数量,现在都已经建立并运行起来了,可以看出k8s在自动升级,扩容等方面带来的优势了。
  (3)创建对应的Service
  最后,创建对应的Service,以下是完整的yaml定义文件(myweb-svc.yaml):
  

apiVersion: v1  
kind: Service
  
metadata:
  name: myweb
  
spec:
  type: NodePort
  ports:
- port: 8080  nodePort:
30001  selector:
  app: myweb
  

  type=NodePort和nodePort=30001的两个属性,表明此Service开启了NodePort方式的外网访问模式。在k8s集群之外,比如在本机的浏览器里,可以通过30001这个端口访问myweb(对应到8080的虚端口上)。所以前面要关闭防火墙。
  运行kubectl create命令进行创建:
  

kubectl create  -f myweb-svc.yaml  

  最后,使用kubectl查看前面创建的Service
  

kubectl get services  


  5.验证与总结
  通过上面的几个步骤,我们可以成功实现了一个简单的k8s单机版例子。有两种方法验证我们的结果。
  首先,可以在本机浏览器中输入http://10.0.0.73:30001/demo/来测试我们发的web应用。然而,很不幸,报错了:

  报了一个JDBC连接的错误。如果网页能打开的话,是有一个表格并且可以进行操作的。按书上的说法,看不到网页有几个原因:比如防火墙的问题,无法访问30001端口,或者是因为通过代理上网的,浏览器错把这个虚拟机的IP地址当成远程地址了。所以有了第二种验证方法,直接运行如下命令:
  

curl http://10.0.0.73:30001  

  输出为:

  我网上看其他教程也大都是采取这种方式验证的,所以就这样吧,虽然成就感小了一点,但毕竟还是跑起来了。重要的是对k8s有一个了解,学习使用它。
  本文参考:

深入学习Kubernetes(一):单节点k8s安装
  《Kubernetes权威指南》
  http://blog.csdn.net/xts_huangxin/article/details/51130223
  https://segmentfault.com/q/1010000002392472
  http://blog.csdn.net/learner198461/article/details/78036854

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-432078-1-1.html 上篇帖子: K8S中RC与Deployment的区别 下篇帖子: K8s的POD连接数据库时报错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表