目录

写在前面

在整个安装过程中,遇到三个问题,分别如下:

1) 在设置node节点上mysql的端口时候,如果端口太大,发现会报错,提示端口范围只允许在30000-32767之间,出现这个问题在于master的apiserver中KUBE_API_ARGS参数没设置,这个最好修改下,如下:

#这里修改端口范围,默认是30000-32767,创建service时超出会报错

KUBE_API_ARGS="--service-node-port-range=20000-65535"

2) 创建好server和pod之后,在查看状态的时候发现,死活一直是containercreationg这个状态,就是无法正常的running。按照网上部分的一些办法也一直搞不赢。

3) mysql安装成功之后,防火墙关闭了,也给用户赋权了,但是就是死活无法远程连接。

虽然安装过程中磕磕绊绊,遇到各种问题,但是回过头来看一下,发现基于docker安装mysql简直高效、快捷有神速啊,简单些两个配置文件,跑一下就OK,技术真是日新月异,大放光彩。

下面记录下安装过程以及遇到问题时候的处理方案。

1.安装mysql

在master上,切到根目录,然后新建mysql目录,cd到mysql目录后,新建mysql-rc.ymal 和mysql-svc.yaml 两个文件。内容分别如下:

vi mysql-rc.ymal
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql-rc
labels:
name: mysql-rc
spec:
replicas: 1
selector:
name: mysql-pod
template:
metadata:
labels:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "root"

其中kind我们选择ReplicationController,还可以选择Replica Set或者Deployment管理Pod,这里不展开说,具体参考这里的说明,一般情况下,我们选择ReplicationController即可,不要使用单pod模式。

vi mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
labels:
name: mysql-svc
spec:
type: NodePort
ports:
- port: 3306
protocol: TCP
targetPort: 3306
name: http
nodePort: 30306
selector:
name: mysql-pod

这里注意nodePort,我最开始设置的33306,但是在运行create的时候会报前面说的问题1,按照解决方式,修改下KUBE_API_ARGS然后重启下apiserver即可,重启命令如下:

for SERVICES in kube-proxy kubelet flanneld docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done

文件创建好之后,下面开始开始创建镜像和运行容器,操作命令如下:

[root@k8s-master ~]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql-rc" created
[root@k8s-master ~]# kubectl create -f mysql-svc.yaml
service "mysql-svc" created

然后使用如下命令进行查看

bmc镜像连接不上 为什么镜像连接不成功_mysql

这里要说一下,一般情况下,这里可能会遇到问题,在使用“kubectl describe pod mysql-rc-smjmh”命令进行查看错误信息

遇到的问题无外乎两类报错,如下:

Error syncing pod, kipping: 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)"

Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image "registry.access.redhat.com/rhel7/pod-infrastructure:latest""

第一个,是因为证书的问题,通过在node节点上使用如下命令查看,会发现是一个软连接到“/etc/rhsm/ca/redhat-uep.pem”,但是这个证书文件确实不存在。

ll /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt

解决办法,在node节点上执行如下命令

yum install *rhsm*

执行完,再去看一下这个redhat-uep.pem文件是否存在,是会出现还不存在的情况,具体原因不做深究。解决办法如下:

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

继续在node节点上执行上面两个命令,就能搞定。

最后执行如下命令,这个很重要,有些博文没有提到这个,报错2一直无法消除。这里可能会出现安装慢的情况,可以反复试几次就行了。

docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

都搞定之后,你会发现status变成Running正常状态了。

2.登录mysql

再node节点上,执行“docker ps -a”命令,显示如下:

bmc镜像连接不上 为什么镜像连接不成功_k8s linux镜像 telnet_02

红圈标注的就是mysql的containet id,通过这个,我们来进入容器,执行如下命令:

docker exec -it 2a46168598bb bash

然后,就进入到容器了,这里很神奇,因为之前没接触过docker和容器化的东西,直到这里才发现容器的真谛,此时就感觉是进入了一个新的主机一样,可以查看容器的情况,同样,可以进行mysql的登录,像正常在主机上操作一样,如下所示:

bmc镜像连接不上 为什么镜像连接不成功_bmc镜像连接不上_03

这就进入mysql了,进入之后,设置mysql可以远程访问,网上一搜有很多的方式,这里贴一个供参考,进入之后执行如下命令:

alter user 'root'@'%' identified with mysql_native_password by'root';
alter user 'root'@'%' identified by 'youpassword';

或者

use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'youpassword';
flush privileges; #一定要刷新生效

然后 exit 退出mysql  .ctrl+p ctrl+q 从容器退出返回到node主机。

3.远程访问

本地打开Navicat,准备远程连接,输入node节点的IP:192.168.1.160,端口输入:30306,输入用户名、密码,但是你会发现,私活连接不上,一直报10060 unknow error。查了各种可能情况,死活就是连接不上。

按理说,防火墙关闭了,端口应该不会被限制了才对,但是就是连接不上,在master上执行telnet 192.168.1.160 30306 发现无法连接,问题找到了,防火墙已关闭,但是端口口没有开放,后来查了下,有人说CentOS7确实是这样。需要打开防火墙,设置30306端口可以访问,然后再关闭防火墙就行了!!!!操作如下:

firewalld:systemctl start firewalld #开启防火墙
firewall-cmd --zone=public --add-port=30306/tcp --permanent #设置30306放开
firewall-cmd --reload #重新加载配置文件

之后查看防火墙状态,然后再关闭防火墙,再重新试,发现OK了!!

至此,终于安装成功了!

4.一些命令

docker ps 查看目前运行的容器

5.参考文献