Kubenetes 权威指南 第一个小例子

为了避免遗忘,自己在学习k8s时,部署搭建第一个小例子,踩过的坑记录一下

一、描述

创建一个简单的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 自带防火墙服务

  1.   # systemctl disable firewalld
  2.   # 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、按顺序启动所有服务:

  1.  systemctl start etcd
  2.  systemctl start docker
  3.  systemctl start kube-apiserver
  4.  systemctl start kube-controller-manager
  5.  systemctl start kube-scheduler
  6.  systemctl start kubelet
  7.  systemctl start kube-proxy

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

mysql镜像

docker pull mysql:5.6

注意 这里 拉取的是 mysql:5.6   不可以是最新的版本,否则由于驱动的问题,会导致jdbc 数据库连接错误。

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database 

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:5.6
        imagePullPolicy: IfNotPresent
        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

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

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

  1.  
    # kubectl delete -f mysql-rc.yaml
  2.  
    # 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
  1.  
    [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:
  replicas: 1
  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、发布到Kubernetes集群

1)、创建RC

# kubectl create -f myweb-rc.yaml

2)、验证创建是否成功

  1.  
    # kubectl get rc
  2.  
    # 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
  1.  
    [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 8080:30001/TCP 1m

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

七、通过浏览器访问页面

可以通过本机IP/127.0.0.1:30001打开tomcat页面。

然鹅,我们使用127.0.0.1:30001/demo打开页面提示jdbc数据库连接错误。

  1.  
    [root@localhost ~] # kubectl get ep
    NAME ENDPOINTS AGE
    kubernetes 192.168.80.128:6443 9h
    mysql 172.17.0.7:3306 9h
    myweb 172.17.0.2:8080,172.17.0.3:8080,172.17.0.4:8080 + 2 more... 9h
  2. [root@localhost ~] # kubectl exec -ti myweb-qrjsd -- /bin/bash
  3.  root@myweb- qrjsd:/usr/local/tomcat# echo $MYSQL_SERVICE_HOST
  4. mysql
  5.  root@myweb- qrjsd:/usr/local/tomcat# echo "172.17.0.7 mysql" >> /etc/hosts
  6.  root@myweb- qrjsd:/usr/local/tomcat#

注意: mysql 对应的 ip 地址,大家电脑上的应该不一样,根据 kubctl get ep 返回的 mysql ip信息来配置。 其实就是人肉把域名ip给加上去 

Kubenetes 权威指南 第一个小例子_第1张图片

 

 

附录 k8s 常用用法

kubectl get po   显示所有的 pod, 准确的说是显示 default 命名空间下的所有pod

kubectl get no   显示所有的node

kubectl get svc

kubectl get rc

kubectl get svc

kubectl get po --all-namespaces   所有命名空间下的pod

kubectl get po -n kube-system   只显示 kube-system 命名空间下的所有pod

kubectl describe no node-name  显示node-name指定的 node 的详细情况

kubectl describe po pod-name     显示 pod-name 指定的 pod 的详细情况 

describe 可以用于各种 k8s 资源, 比如 rc  ns  svc

 

转载改编自:https://blog.csdn.net/wangjunsheng/article/details/85229581

 

 
   
 
 

转载于:https://www.cnblogs.com/damon-blog/p/10718097.html

你可能感兴趣的:(Kubenetes 权威指南 第一个小例子)