k8s部署tomcat及web应用_kubernetes学习一:安装及部署第一个Web应用

准备工作

首先准备Kubernets的环境,使用的是centos7.5

关闭防火墙:

# systemctl disable firewalld

# systemctl stop firewalld

安装etcd和kubernetes(会自动安装Docker软件)

由于centos mini版本没有ifconfig和netstat的命令。所以安装了net-tools的工具

# yum -y install net-tools

#yum install -g etcd kubernetes

k8s、etcd和Docker软件版本查询

---------k8s信息查询-------

默认安装完成以后,看了一下k8s的版本,是v1.5.2# kubectl --version

Kubernetes v1.5.2[root@spareribs~]# kubectl version

Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}

Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}--------docker信息查询--------# docker version

Client:

Version:1.12.6API version:1.24Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64

Go version: go1.7.4Git commit: 88a4867/1.12.6Built: Mon Jul3 16:02:02 2017OS/Arch: linux/amd64

Server:

Version:1.12.6API version:1.24Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64

Go version: go1.7.4Git commit: 88a4867/1.12.6Built: Mon Jul3 16:02:02 2017OS/Arch: linux/amd64------etcd信息查询-------# etcdctl --version

etcdctl version:3.1.9API version:2

修改配置文件

修改Docker的OPTIONS配置

#vi /etc/sysconfig/docker

# OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'修改k8s APIserver的配置文件

#vi /etc/kubernetes/apiserver

# KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

注:不修改后期创建rc与pod的时候会出现pod无法创建但是rc能创建

生成rhsm证书文件

# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

# 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

注:创建容器时需要从redhat站点下载pod-infrastructure:latest镜像,如果没有此证书文件会报错,Pod会一直显示ContainerCreating状态。

配置docker阿里云镜像加速

cat > /etc/docker/daemon.json <

{"registry-mirrors": ["https://registry.docker-cn.com"]

}

EOF

启动服务

按顺序启动服务

# systemctl start etcd

# systemctl start kube-apiserver

# systemctl start kube-controller-manager

# systemctl start kube-scheduler

# systemctl start kubelet

# systemctl start kube-proxy

# systemctl start docker

查看当前启动的服务和端口

# netstat -lntp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp0 0 127.0.0.1:10250 0.0.0.0:* LISTEN 2964/kubelet

tcp0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 2728/etcd

tcp0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 2728/etcd

tcp0 0 127.0.0.1:10255 0.0.0.0:* LISTEN 2964/kubelet

tcp0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 2906/kube-apiserver

tcp0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1353/sshd

tcp0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1993/master

tcp0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 2964/kubelet

tcp0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3008/kube-proxy

tcp60 0 :::10251 :::* LISTEN 2953/kube-scheduler

tcp60 0 :::6443 :::* LISTEN 2906/kube-apiserver

tcp60 0 :::10252 :::* LISTEN 2941/kube-controlle

tcp60 0 :::22 :::* LISTEN 1353/sshd

tcp60 0 ::1:25 :::* LISTEN 1993/master

tcp60 0 :::4194 :::* LISTEN 2964/kubelet

启动Mysql服务

1、创建mysql的Deployment定义文件

mysql-dep.yaml文件内容如下:

apiVersion: extensions/v1beta1 #apiserver的版本

kind: Deployment #副本控制器deployment,管理pod和RS

metadata:

name: mysql #deployment的名称,全局唯一

spec:

replicas: 1 #Pod副本期待数量

selector:

matchLabels: #定义RS的标签

app: mysql #符合目标的Pod拥有此标签

strategy: #定义升级的策略

type: RollingUpdate #滚动升级,逐步替换的策略

template: #根据此模板创建Pod的副本(实例)

metadata:

labels:

app: mysql #Pod副本的标签,对应RS的Selector

spec:

containers: #Pod里容器的定义部分

- name: mysql #容器的名称

image: mysql:5.7 #容器对应的docker镜像

volumeMounts: #容器内挂载点的定义部分

- name: time-zone #容器内挂载点名称

mountPath: /etc/localtime #容器内挂载点路径,可以是文件或目录

- name: mysql-data

mountPath: /var/lib/mysql #容器内mysql的数据目录

- name: mysql-logs

mountPath: /var/log/mysql #容器内mysql的日志目录

ports:

- containerPort: 3306 #容器暴露的端口号

env: #写入到容器内的环境容量

- name: MYSQL_ROOT_PASSWORD #定义了一个mysql的root密码的变量

value: "123456"

volumes: #本地需要挂载到容器里的数据卷定义部分

- name: time-zone #数据卷名称,需要与容器内挂载点名称一致

hostPath:

path: /etc/localtime #挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区

- name: mysql-data

hostPath:

path: /data/mysql/data #本地存放mysql数据的目录

- name: mysql-logs

hostPath:

path: /data/mysql/logs #本地存入mysql日志的目录

apiVersion:定义使用apiserver的哪个版本,可通过kubectl api-versions命令查看apiserver有哪些版本;

kind:用来表明此资源对象的类型,比如这里的值为“Deployment”,表示这是一个deployment;

spec:RS相关属性定义,spec.selector是RS的Pod标签(Label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里设置replicas=1表示只能运行一个Mysql Pod实例。

spec.strategy:定义Pod的升级方案,Recreate表示删除所有已存在的Pod,重新创建新的;RollingUpdate表示滚动升级,逐步替换的策略,滚动升级时支持更多的附加参数,例如设置最大不可用Pod数量,最小升级间隔时间等等。

spec.template:当集群中运行的Pod数量小于replicas时,RS会根据spec.template中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,需要特别注意的是,这里的labels必须匹配之前的spec.selector。

spec.template.spec.containers:容器的定义部分,包括容器的名称、使用的docker镜像、挂载数据卷、服务的端口号、变量等内容。

spec.template.spec.volumes:需要挂载到容器里的本地数据卷的定义部分,数据卷的名称要与容器内挂载点的名称一致,path定义本地的数据卷路径。

注:mysql-dep.yaml文件会创建deployment、RS、Pod和容器,创建过程需要先下载镜像,时间会比较久。

发布Mysql

# kubectl create -f mysql-dep.yaml

deployment "mysql" created

查询Mysql信息和Pod信息

# kubectl get deployment

NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE

mysql 1 1 1 1 8s

# kubectl get rs

NAME DESIRED CURRENT READY AGE

mysql-3238461207 1 1 1 6m

#docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

5252cd76009a mysql:5.7 "docker-entrypoint..." 55 minutes ago Up 55 minutes k8s_mysql.23f88726_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_6b15dcfc

f026e79ddad9 registry.access.redhat.com/rhel7/pod-infrastructure:latest "/usr/bin/pod" 55 minutes ago Up 55 minutes k8s_POD.1d520ba5_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_668a091e

注:都是1表示运行正常,特别是第一次拉取容器的镜像需要一段时间,所以Pod的状态一开始有可能是Pending,最终才变为Running。

查看Pod里容器的时间,检查时间是否与本地时间一致

# kubectl exec mysql-3238461207-vvwt8 date

Thu Oct25 15:06:15 CST 2018

注:exec后面跟pod的名称

定义一个Service文件

mysql-svc.yaml文件内容如下:

apiVersion: v1

kind: Service #表示Kubernetes Service

metadata:

name: mysql #Service的名称

spec:

ports:

- port: 3306 #Service提供服务的端口号

selector:

app: mysql #Service对应的Pod的标签

各个字段说明

kind:标明是Kubernetes Services

metadata.name:Service的全局唯一名称

spec.ports.port:Service提供服务的端口号

spec.selector:Service对应的Pod拥有这里定义的标签

发布Mysql SVC文件到集群中

# kubectl create -f mysql-svc.yaml

service"mysql" created

查询SVC文件信息

Mysql服务被分配了一个值为10.254.209.200的虚拟IP地址(CLUSTER-IP),Kubernetes集群中创建的Pod就可以通过Services的10.254.209.200(Cluster IP)+ 3306(端口号)来链接和访问

Cluster IP由Kubenrnetes自动分配,其他的Pod无法预先知道某个Services的Cluster IP地址

Kubenrnetes利用Linux的环境变量(Environment Variable)来解决这个问题,Sevice的名字唯一,容器可以从环境变量中或i渠道Service对应的Cluster IP地址和端口,从而发起TCP/IP链接请求

# kubectl get svc

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes10.254.0.1 443/TCP 22h

mysql10.254.209.200 3306/TCP 7s

启动Tomcat应用

创建tomcat的Deployment定义文件

myweb-dep.yaml文件的内容如下:

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: myweb

spec:

replicas: 1

selector:

matchLabels:

app: myweb

strategy:

type: RollingUpdate

template:

metadata:

labels:

app: myweb

spec:

containers:

- name: myweb

image: kubeguide/tomcat-app:v1

volumeMounts:

- name: time-zone

mountPath: /etc/localtime

- name: tomcat-logs

mountPath: /usr/local/tomcat/logs

ports:

- containerPort: 8080

env:

- name: MYSQL_SERVICE_HOST

value: '10.254.144.64' #此处为mysql服务的Cluster IP,需要修改

- name: MYSQL_SERVICE_PORT

value: '3306'

volumes:

- name: time-zone

hostPath:

path: /etc/localtime

- name: tomcat-logs

hostPath:

path: /data/tomcat/logs

发布Tomcat deployment

# kubectl create -f myweb-dep.yaml

deployment "myweb" created

注:创建过程比较久,请耐心等待,pod的STATUS状态为Running时表示创建成功。

定义一个Service文件

创建tomcat的Service定义文件,myweb-svc.yaml文件的内容如下:

apiVersion: v1

kind: Service

metadata:

name: myweb

spec:

type: NodePort

ports:

- port: 8080

nodePort: 30001

selector:

app: myweb

注:此Service开启了NodePort方式的外网访问模式,端口为30001,此端口会映射到tomcat容器的8080端口上。

发布Tomcat SVC文件到集群中

# kubectl create -f myweb-svc.yaml

service "myweb" created

查询Tomcat SVC信息

# kubectl get svc

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes 10.254.0.1 443/TCP 23h

mysql 10.254.209.200 3306/TCP 1h

myweb 10.254.216.52 8080:30001/TCP 7s

可使用curl命令测试tomcat服务是否能正常访问

# curl http://192.168.77.146:30001

通过浏览器访问网页

1、如果30001端口不通的话,重新启动、关闭firewalld防火墙

# systemctl start firewalld

# systemctl stop firewalld

注:因为kubernetes会在iptables里添加一些策略,需要再重新开启关闭防火墙才会关闭掉这些策略。

2、通过浏览器访问http://192.168.77.146:30001/demo/

点击“Add...”,添加一条记录并提交

提交以后,数据就被写入mysql数据库里了。

3、登陆mysql数据库验证

[root@andyxu-test ~]# docker exec -it 5252cd76009a /bin/bash

root@mysql-3238461207-vvwt8:/# mysql -uroot -p123456

mysql> use HPE_APP

mysql> select * from T_USERS;

可以继续研究下这个例子,比如:

研究RS、Service等文件的格式。

熟悉kubectl的子命令。

手工停止某个Service对应的容器,观察有什么现象发生。

修改Deployment文件,改变pod副本的数量,重新创建,观察结果。

错误整理

在创建rc与pod时出现迟迟无发运行pods状态如下:

使用kubectl describe pods Pod_Name来查看是什么原因。

其中遇到错误为:

# kubectl describe pods mysql-ln2bl

Name:mysql-ln2bl

Namespace:default

Node:127.0.0.1/127.0.0.1

Start Time:Sat, 24 Aug 2019 17:42:13 +0800

Labels:app=mysql

Status:Pending

IP:

Controllers:ReplicationController/mysql

Containers:

mysql:

Container ID:

Image:mysql

Image ID:

Port:3306/TCP

State:Waiting

Reason:ContainerCreating

Ready:False

Restart Count:0

Volume Mounts:

Environment Variables:

MYSQL_ROOT_PASSWORD:123456

Conditions:

TypeStatus

Initialized True

Ready False

PodScheduled True

No volumes.

QoS Class:BestEffort

Tolerations:

Events:

FirstSeenLastSeenCountFromSubObjectPathTypeReasonMessage

------------------------------------------------------------

41m41m1{default-scheduler }NormalScheduledSuccessfully assigned mysql-ln2bl to 127.0.0.1

40m22s177{kubelet 127.0.0.1}WarningFailedSyncError syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

41m9s13{kubelet 127.0.0.1}WarningFailedSyncError syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

大致意思就是:未能通过ErrImagePull为“POD”启动“StartContainer”:“对于registry.access.redhat.com/rhel7/pod-infrastructure:latest,图像拉出失败,这可能是因为此请求上没有证书

检查发现:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt这个目录中是一个软连接

发现实际上并没有这个文件

网上说是因为证书导致的, 然后下载一个  yum remove *rhsm* -y  就可以解决,但发现这个rhsm文件被调换了,下载后发现是空的,然后通过下面的方法解决。

解决方法:下载rpm包安装rhsm

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

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

删除rc与pod

kubectl delete -f XXX.yaml 或者kubectl delete pods pod_name

详细使用方法查看 kubectl delete --help

重新创建之后便可已正常运行。

你可能感兴趣的:(k8s部署tomcat及web应用_kubernetes学习一:安装及部署第一个Web应用)