参考 《kubernetes 权威指南》一节的 从一个简单例子开始,操作实录。
创建一个简单的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 时代是如何完成这个目标的。
# systemctl disable firewalld
# systemctl stop firewalld
# yum install -y etcd kubernetes
Docker配置文件 /etc/sysconfig/docker,其中OPTIONS的内容设置为:
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
Kubernets apiserver配置文件 /etc/kubernetes/apiserver,将 –adminssion_control参数中的ServiceAccount删除
# 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
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
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"
# kubectl create -f mysql-rc.yaml
kubectl get rc
kubectl get pods
* 没创建成功 * 一直处于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-scv.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
# kubectl create -f mysql-scv.yaml
# kubectl get svc
[root@localhost test]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 443/TCP 1d
mysql 10.254.138.253 3306/TCP 1m
注意到MySql服务被分配了一个值为10.254.138.253的ClusterIP地址,这是一个虚地址,随后Kubernetes集群中其他新创建的Pod就可以通过Service的ClusterIP+端口号6379来连接和访问它。根据Service的唯一名字,容器可以从环境变量中获取到Service对应的ClusterIP地址和端口,从而发起TCP/IP连接请求了。
上面我们定义和启动了MySql服务,接下来我们采用同样的步骤,完成Tomcat应用的启动过程。
内容:
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'
# kubectl create -f myweb-rc.yaml
# kubectl get rc
# kubectl get pods
文件名为 myweb-svc.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
# kubectl create -f myweb-svc.yaml
# 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