环境:CentOS 7.6
如果在部署过程中遇到了阻碍,请先看目录【你可能会踩的坑】,他可能会帮助你快速解决问题!
环境准备
- yum安装
[root@iZbp1edddjcueeu1zw5xv2Z ~]# yum install -y etcd kubernetes
- 更改docker配置
[root@iZbp1edddjcueeu1zw5xv2Z ~]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false --insecure-registry=gcr.io --log-driver=journald --signature-verification=false'
- 修改Kubernetes配置
[root@iZbp1edddjcueeu1zw5xv2Z ~]# vim /etc/kubernetes/apiserver
#删除ServiceAccount
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
- 启动Kubernetes
[root@iZbp1edddjcueeu1zw5xv2Z ~]# systemctl start etcd
[root@iZbp1edddjcueeu1zw5xv2Z ~]# systemctl start docker
[root@iZbp1edddjcueeu1zw5xv2Z ~]# systemctl start kube-apiserver
[root@iZbp1edddjcueeu1zw5xv2Z ~]# systemctl start kube-controller-manager
[root@iZbp1edddjcueeu1zw5xv2Z ~]# systemctl start kube-scheduler
[root@iZbp1edddjcueeu1zw5xv2Z ~]# systemctl start kubelet
[root@iZbp1edddjcueeu1zw5xv2Z ~]# systemctl start kube-proxy
安装MySQL
-
创建Deployment文件(yaml配置文件)
-
为了方便归类管理,可以先创建文件夹
[root@iZbp1edddjcueeu1zw5xv2Z ~]# mkdir mysql
[root@iZbp1edddjcueeu1zw5xv2Z ~]# mkdir tomcat
[root@iZbp1edddjcueeu1zw5xv2Z ~]# cd mysql
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# vim mysql-deploy.yaml
- Deployment文件内容如下
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- 启动MySQL服务
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# kubectl apply -f mysql-deploy.yaml
deployment "mysql" created
查看MySQL启动状态
#查看deployment状态
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql 1 1 1 1 3m
#查看pod状态
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-zrh40 1/1 Running 0 13m
同时,你也可以通过docker命令来观察docker是否拉取了MySQL镜像且创建了一个容器
恭喜你,MySQL已经部署成功!接下来,我们还需要创建一个MySQL Service配置
- 创建Service
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# kubectl apply -f mysql-svc.yaml
service "mysql" created
- 查看状态
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 4h
mysql 10.254.141.101 <none> 3306/TCP 2m
至此,一个可使用的MySQL已经准备就绪了,接下来,我们创建一个Tomcat应用。
安装Tomcat应用
- 创建Deployment文件
[root@iZbp1edddjcueeu1zw5xv2Z mysql]# cd ../tomcat/
[root@iZbp1edddjcueeu1zw5xv2Z tomcat]# vim myweb-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: myweb
name: myweb
spec:
replicas: 2
selector:
matchLabels:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- image: kubeguide/tomcat-app:v1
name: myweb
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 10.254.141.101
- 创建应用
[root@iZbp1edddjcueeu1zw5xv2Z tomcat]# kubectl apply -f myweb-deploy.yaml
deployment "myweb" created
- 查看状态
# 查看Deployment
[root@iZbp1edddjcueeu1zw5xv2Z tomcat]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql 1 1 1 1 20m
myweb 2 2 2 2 30s
#查看Pod
[root@iZbp1edddjcueeu1zw5xv2Z tomcat]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-1892802124-pr7z8 1/1 Running 0 21m
myweb-3898990965-49bz9 1/1 Running 0 1m
myweb-3898990965-80pzk 1/1 Running 0 1m
可以看到,当我们在yaml配置文件中将变量replicas设置为2时,Kubernetes会创建l两个个不同名称的Pod,这个Pod我们暂且可以把它当作容器来看待。
- 创建Service
[root@iZbp1edddjcueeu1zw5xv2Z tomcat]# vim myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
- 创建Service
[root@iZbp1edddjcueeu1zw5xv2Z tomcat]# kubectl apply -f myweb-svc.yaml
service "myweb" created
- 查看状态
[root@iZbp1edddjcueeu1zw5xv2Z tomcat]# kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 1h
mysql 10.254.141.101 <none> 3306/TCP 25m
myweb 10.254.82.125 <nodes> 8080:30001/TCP 16s
至此,你应该可以通过浏览器http://物理机IP:30001/demo访问应用!
你可能会踩的坑
- 外网无法访问,但内网可以正常访问
解决方案:执行命令:iptables -P FORWARD ACCEPT
-
镜像拉取失败
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)"
解决方案:执行以下命令
cd /etc/docker/certs.d/registry.access.redhat.com/ 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
-
拉取MySQL失败
更换阿里云镜像源:
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["**改成你的镜像地址**"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker