为了避免遗忘,自己在学习k8s时,部署搭建第一个小例子,踩过的坑记录一下
一、描述
创建一个简单的Java web程序,此 Java Web 应用 的 结构 比较 简单, 是一 个 运行 在 Tomcat 里 的 Web App, 如图 1. 1 所示, JSP页面通过 JDBC 直接访问 MySQL 数据库并展示数据。 为了演示和简化的目的,只要程序正确连接到了数据库上,它就会自动完成对应的 Table的创建与初始化数据的准备工作。所以,当我们通过浏览器访问此应用的时候,就会显示一个表格的页面,数据则来自数据库。
此应用需要启动两个容器: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 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
kubectl get 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 svcNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 1dmysql 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)、验证创建是否成功
-
# 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 svcNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 1dmysql 10.254.138.253 <none> 3306/TCP 34mmyweb 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数据库连接错误。
-
[root@localhost ~] # kubectl get epNAME ENDPOINTS AGEkubernetes 192.168.80.128:6443 9hmysql 172.17.0.7:3306 9hmyweb 172.17.0.2:8080,172.17.0.3:8080,172.17.0.4:8080 + 2 more... 9h
-
[root@localhost ~] # kubectl exec -ti myweb-qrjsd -- /bin/bash
-
root@myweb- qrjsd:/usr/local/tomcat# echo $MYSQL_SERVICE_HOST
-
mysql
-
root@myweb- qrjsd:/usr/local/tomcat# echo "172.17.0.7 mysql" >> /etc/hosts
-
root@myweb- qrjsd:/usr/local/tomcat#
注意: mysql 对应的 ip 地址,大家电脑上的应该不一样,根据 kubctl get ep 返回的 mysql ip信息来配置。 其实就是人肉把域名ip给加上去
附录 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