kubernetes 从一个简单例子开始

参考 《kubernetes 权威指南》一节的 从一个简单例子开始,操作实录。

一、描述

创建一个简单的Java web程序,此 Java Web 应用 的 结构 比较 简单, 是一 个 运行 在 Tomcat 里 的 Web App, 如图 1. 1 所示, JSP页面通过 JDBC 直接访问 MySQL 数据库并展示数据。 为了演示和简化的目的,只要程序正确连接到了数据库上,它就会自动完成对应的 Table的创建与初始化数据的准备工作。所以,当我们通过浏览器访问此应用的时候,就会显示一个表格的页面,数据则来自数据库。
Java Web应用的架构组成
此应用需要启动两个容器:Web App容器和MySQL容器,并且Web App容器需要访问MySQL容器。 在Docker 时代,假设我们在一个宿主机上启动了这两个容器,则我们需要把MySQL容器的 IP 地址通过环境变量的方式注入Web App容器里;同时,需要将 WebApp 容器的8080 端口映射到宿主机的8080端口,以便能在外部访问。在本章的这个例子里,我们看看在Kubernetes 时代是如何完成这个目标的。

二、环境准备

1、关闭CentOS 自带防火墙服务

# systemctl disable firewalld
# systemctl stop firewalld

2、安装 etcd和Kubernetes软件(会自动安装Docker软件)

# yum install -y etcd kubernetes

3、安装好软件后,修改两个配置文件

Docker配置文件 /etc/sysconfig/docker,其中OPTIONS的内容设置为:

OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

Kubernets apiserver配置文件 /etc/kubernetes/apiserver,将 –adminssion_control参数中的ServiceAccount删除

4、按顺序启动所有服务:

# systemctl start etcd
# systemctl start docker
# systemctl start kube-apiserver
# systemctl start kube-controller-manager
# systemctl start kube-scheduler
# systemctl start kubelet
# systemctl start kube-proxy

5、Docker拉取mysql镜像和tomcat镜像

mysql镜像

docker pull daocloud.io/library/mysql:latest

rc在创建mysql时,默认从docker.io/mysql 拉取,由于墙的原因,创建rc会失败。从daocloud.io/library/mysql:latest拉取后需要创建个别名,5195076672a7 是我本地mysql的imageId

docker tag 5195076672a7 docker.io/library/mysql:latest

tomcat镜像

docker pull kubeguide/tomcat-app:v1

三、启动MySql服务

1、首先为MySql服务创建一个RC定义文件:mysql-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

2、发布到Kubernetes集群

1)、创建RC
# kubectl create -f mysql-rc.yaml
2)、验证创建是否成功
kubectl get rc

rc创建没成功

kubectl get pods

pods创建没成功

* 没创建成功 * 一直处于ContainerCreating

3)、查找kubernetes pod卡在ContainerCreating状态原因并解决

主要是通过“kubectl describe pod PodName”指令查看pod发生的事件,从事件列表中可以查找到错误信息。

# kubectl describe pod mysql

错误信息

通过最后一行错误提示,下载镜像超时,访问地址被墙了

从国内镜像下载pod-infrastructure,使用阿里镜像服务,或者国内其它镜像服务
下载地址 registry.cn-hangzhou.aliyuncs.com/sunyuki/pod-infrastructure,并且重新命名。 f66f4bd9b894 是我这里下载pod-infrastructure的imageId

# docker pull registry.cn-hangzhou.aliyuncs.com/sunyuki/pod-infrastructure
# docker tag f66f4bd9b894 registry.access.redhat.com/rhel7/pod-infrastructure:latest

删除之前创建的rc,重新创建MySql Rc

# kubectl delete -f mysql-rc.yaml
# kubectl create -f mysql-rc.yaml

使用 # kubectl describe pod mysql 查看是否创建成功
这里写图片描述
通过docker ps指令查看正在运行的容器

# docker ps | grep mysql

这里写图片描述

四、构建Mysql Kubernetes Service定义文件

文件名为 mysql-scv.yaml

内容:

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql

1、创建Service

# kubectl create -f mysql-scv.yaml

2、查看创建的service

# kubectl get svc
[root@localhost test]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes   10.254.0.1       <none>        443/TCP    1d
mysql        10.254.138.253   <none>        3306/TCP   1m

注意到MySql服务被分配了一个值为10.254.138.253的ClusterIP地址,这是一个虚地址,随后Kubernetes集群中其他新创建的Pod就可以通过Service的ClusterIP+端口号6379来连接和访问它。根据Service的唯一名字,容器可以从环境变量中获取到Service对应的ClusterIP地址和端口,从而发起TCP/IP连接请求了。

五、启动Tomcat应用

上面我们定义和启动了MySql服务,接下来我们采用同样的步骤,完成Tomcat应用的启动过程。

1、创建对应的RC文件myweb-rc.yaml

内容:

kind: ReplicationController
metadata:
  name: myweb
spec:
# Pod的数量
  replicas: 1
# spec.selector与spec.template.metadata.labels,这两个字段必须相同,否则下一步创建RC会失败。
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
#   容器组的定义
    spec:
      containers:
#       容器名称
        - name: myweb
#         容器对应的镜像
          image: kubeguide/tomcat-app:v1
          ports:
#         在8080端口上启动容器进程,PodIP与容器端口组成Endpoint,代表着一个服务进程对外通信的地址
          - containerPort: 8080
          env:
#此处如果在未安装域名解析的情况下,会无法将mysql对应的IP解析到env环境变量中,因此先注释掉!
#          - name: MYSQL_SERVICE_HOST
#            value: 'mysql'
          - name: MYSQL_SERVICE_PORT
            value: '3306'

2、发布到Kubernetes集群

1)、创建RC
# kubectl create -f myweb-rc.yaml
2)、验证创建是否成功
# kubectl get rc
# kubectl get pods

创建成功
这里写图片描述

六、构建Tomcat Kubernetes Service定义文件

文件名为 myweb-svc.yaml

内容:

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

1、创建Service

# kubectl create -f myweb-svc.yaml

2、查看创建的Service

# kubectl get svc
[root@localhost test]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          1d
mysql        10.254.138.253   <none>        3306/TCP         34m
myweb        10.254.29.1      <nodes>       8080:30001/TCP   1m

myweb可以通过30001这个端口访问myweb(对应到8080的虚端口上)

七、通过浏览器访问页面

经过上面的几个步骤,我们终于成功实现了Kubernets上第1个例子部署搭建工作,在浏览器打开,地址 http://虚拟机IP:30001/demo/
这里写图片描述

我遇到了30001端口无法打开问题,已经将centos7防火墙关了还是不行,我的解决方法
1、开启防火墙

systemctl start firewalld

2、添加端口访问权限

firewall-cmd –zone=public –add-port=30001/tcp –permanent

3、再将防火墙关闭,30001这个端口外网其它机器可以访问了

systemctl stop firewalld

systemctl disable firewalld

Logo

开源、云原生的融合云平台

更多推荐