欢迎来到李先生的博客

深山的鹿,不知归处;万般皆苦,只可自渡。
扩大
缩小

单机版Kubernetes集群(一)

环境:CentOS Linux release 7.4.1708 (Core)
 
单机版Kubernetes集群的效果,如图:
1)JSP页面通过JDBC直接访问Mysql数据库并展示;这里只是为了实现,只要程序正确连接到了数据库上,它就会自动完成对应的Table的创建与初始化数据的准备工作。也就是当通过浏览器访问此应用的时候,就会显示一个表格,表格的数据来自数据库
 
 
一、基本环境
 
1、关闭防火墙(自己写的脚本)
 
 
#!/bin/bash#
 
#FileName: iptables_stop.sh
#Date: 20181029
#Author: LiLe
#Contact: 836217653@qq.com
#Version: V1.0
#Description: Centos7 stop firewalld in grain
 
install(){
    yum -y install firewalld
    yum -y install iptables-services
}
 
stop_service(){
    systemctl stop firewalld
    systemctl stop iptables
}
 
starting_stop(){
    systemctl disable firewalld.service
    systemctl disable iptables.service
}
 
main(){
    install
    stop_service
    starting_stop
}
 
main
 
 

 

 
2、安装k8s 
yum -y install etcd kubernetes
 
  
3、把Kubernetes apiserver配置文件/etc/kubernetes/apiserver里的--admission-control的ServiceAccount删除 
 
 
4、启动所有的服务 
systemctl start etcd                          master
systemctl start docker                        node  
systemctl start kube-apiserver                master
systemctl start kube-controller-manager       master
systemctl start kube-scheduler                master
systemctl start kubelet                       node
systemctl start kube-proxy                    node
 
 
二、启动Mysql服务
 
1、为Mysql创建一个RC定义文件,mysql-rc.yaml
 
 
 
 
apiVersion: v1
kind: ReplicationController     #表明此资源对象的内型,"ReplicationController表明这是一个RC"
metadata:
  name: mysql                   #RC的名称,全局唯一
spec:                           #spec是RC的相关属性定义
  replicas: 1                   #副本期待数量
  selector:                     #是RC的Pod标签选择器,监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里设置的replicas=1表明只能运行一个Mysql Pod实例,当集群中运行的Pod数量小于replicas时,RC会根据spec.template一节中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,,需要注意的是这里的labels必须匹配之前的spec.selector,否则此RC每次创建了一个无法匹配Label的Pod,就会不停地尝试创建新的Pod.
    app: mysql                  #符合目标的Pod拥有此标签
  template:                     #根据此模板创建Pod的副本(实例)
    metadata:
      labels:
        app: mysql              #Pod副本拥有的标签,对应RC的Selector
    spec:
      containers:               #Pod内容器的定义部分
      - name: mysql             #容器的名称
        image: mysql            #容器的镜像
        ports:                  #容器暴露的端口
        - containerPort: 3306
        env:                    #注入到容器内的环境变量
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
 
 
 
2、将mysql-controller发布到Kubernetes集群中 
kubectl create -f mysql-rc.yaml

 

3、查看刚刚创建的RC 
kubectl get rc

 
 
4、查看Pod的创建情况 
kubectl get pods

 
这里会出现的错误:
 
1)这里的status一直处于ContainerCreating状态,可以通过查看状态是什么问题 
kubectl describe pod mysql

 
 
 
 
可以看到这个文件不存在,下载安装
 
 
 
 
1) wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
2) rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

 

2)docker-runc没有
 
 
 
 
ln -s  /usr/libexec/docker/docker-runc-current /usr/libexec/docker/docker-runc

 

解决完上面的两个问题后,就可以看到status处于Running状态了

 
5、通过docker ps -a可以看到有一个Mysql的容器启动了 
 
 
6、创建一个与之关联的Kubernetes Service,mysql-svc.yaml 
apiVersion: v1
kind: Service    #表明是Kubernetes Service
metadata:
  name: mysql    #Service的全局唯一名称;Service 的服务名
spec:
  ports:
   - port: 3306  #Service提供服务的端口号
  selector:
   app: mysql    #service对应的Pod拥有这里定义的标签; 确定了哪些Pod副本(实例)对应到本服务

 

7、创建Service对象 
kubectl create -f mysql-svc.yaml

 

8、查看刚刚创建的service 
kubectl get svc

 

 

这里Mysql服务被分配了一个值为10.254.243.27的Cluster IP地址,这是一个虚地址,随后,Kubernetes集群中其他新创建的Pod就可以通过Service的Cluster IP + Port来连接和访问了。
通常情况下,Cluster IP是在Service创建后又Kubernetes系统自动分配的,其他的Pod无法预先知道某个Service的Cluster IP地址,因此需要一个服务发现机制来找到这个服务。Kubernetes里,根据Service的唯一名字,容器可以从环境变量中获取到Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求了。
 
 
三、启动Tomcat应用
 
1、启动Tomcat应用,创建对应的RC文件myweb-rc.yaml
 
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 5
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
       - name : myweb
         image: kubeguide/tomcat-app:v1
         ports:
         - containerPort: 8080
         env:
         - name: MYSQL_SERVICE_HOST
           value: 'mysql'
         - name: MYSQL_SERVICE_PORT
           value: '3306'

 

2、将tomcat发布到Kubernetes集群中 
kubectl create -f myweb-rc.yaml 
 
3、创建对应的Kubernetes Service 
apiVersion: v1
kind: Service
metadata: 
  name: myweb
spec:
  type: NodePort       #表明此Service开启了NodePort方式的外网访问模式
  ports:
    - port: 8080
      nodePort: 30001  #在集群之外,可以通过30001这个端口访问myweb,对应到8080的虚端口上。
  selector:
    app: myweb

 

kubectl create -f myweb-svc.yaml 

  

四、访问
 
1、通过浏览器访问IP:PORT/demo/发现如下报错: 
 
 
解决办法:
 
在Tomcat的myweb-svc.yaml文件中设置变量的时候,要写mysql集群的IP 
                  
 
 
 
2、改了yaml文件之后需要先删掉原有的rc和pods 
kubectl delete rc myweb
kubectl delete pods --grace-period=0 --force --all
 
 
3、按照上面的创建步骤创建一遍,再测试就可以了 
 

posted on 2018-11-06 13:41  Captain_Li  阅读(1165)  评论(0编辑  收藏

导航