K8s集群Python项目上云部署
实验环境
安装好k8s集群
二十章的一到七环境
实验步骤
一、项目资源及项目代码(192.168.10.14)
上传cmdb.zip包到/root目录并解压
unzip -q cmdb.zip
cd cmdb
db用于存储项目数据库
pipsource用于存储pip源
requirement用于存储python项目依赖资源清单
syscmdb用于存储项目源代码
pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。
注:pip 已内置于 Python 3.6 和 2.7 及以上版本,其他版本需另行安装。
ls db/
ls -a pipsource/
ls requirement/
ls syscmdb/
二、项目基础镜像准备(192.168.10.14)
项目基础镜像主要是为项目提供运行环境,本次采用定制基础镜像。
可以在harbor主机上准备,准备完成后,再上传到harbor仓库,以备后续使用。
1、编辑用于生成基础镜像Dockerfile
mkdir py_base
cd py_base/
cp -r ../cmdb/requirement/ .
cp -r ../cmdb/pipsource/ .
vim Dockerfile
添加:
FROM centos:7
MAINTAINER "admin<admin@test.com>"
WORKDIR /
ADD pipsource/.pip /root
ADD requirement/* /
ADD ./wget-1.14-18.el7_6.1.x86_64.rpm /wget-1.14-18.el7_6.1.x86_64.rpm
RUN rpm -i /wget-1.14-18.el7_6.1.x86_64.rpm
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN yum clean all && yum makecache
RUN yum -y install python36 gcc gcc-c++ python3-devel
RUN pip3 install -r /requirement.txt -i https://mirrors.aliyun.com/pypi/simple/
mount /dev/cdrom /media/
cp /media/Packages/wget-1.14-18.el7_6.1.x86_64.rpm ./
ls
2、登录harbor创建项目
3、使用Dockerfile生成项目基础镜像,并上传到harbor仓库或直接上传py_base_image.tar镜像包并导入
docker build -t harbor.test.com/py_project/py_base:v1 .
docker push harbor.test.com/py_project/py_base:v1
打开harbor查看
三、项目数据库部署
1、查看项目数据库文件(192.168.10.14)
cd cmdb
cd db/
2、编辑数据库部署的资源清单文件(192.168.10.14)
cd /usr/local/nginx/html/
mkdir py_project
cd py_project/
vim 01_ns.yaml
添加:
apiVersion: v1
kind: Namespace
metadata:
name: cmdb
vim 02_mysql.yaml
添加:
apiVersion: v1
kind: Service
metadata:
name: cmdbmysql
namespace: cmdb
spec:
ports:
- port: 3306
name: mysql
clusterIP: None
selector:
app: mysqlcmdb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cmdbdb
namespace: cmdb
spec:
selector:
matchLabels:
app: mysqlcmdb
serviceName: "cmdbmysql"
template:
metadata:
labels:
app: mysqlcmdb
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: syscmdb
ports:
- containerPort: 3306
volumeMounts:
- mountPath: "/var/lib/mysql"
name: mysql-cmdb
volumeClaimTemplates:
- metadata:
name: mysql-cmdb
spec:
accessModes: ["ReadWriteMany"]
storageClassName: "nfs-client"
resources:
requests:
storage: 1Gi
使用浏览器访问192.168.10.14:81
3、应用数据库部署的资源清单文件(master1)
kubectl apply -f http://yaml.test.com:81/py_project/01_ns.yaml
kubectl apply -f http://yaml.test.com:81/py_project/02_mysql.yaml
4、导入数据库
(1)将192.168.10.14中项目数据库文件拷贝到master1
192.168.10.14:
scp /root/cmdb/db/cmdbdb.sql root@192.168.10.11:/root
master1:
ls
(2)查看数据库Pod和service(master1)
kubectl get ns
kubectl get pod -n cmdb
kubectl get svc -n cmdb
进入数据库查看所有库
kubectl -n cmdb exec -it cmdbdb-0 -- sh
mysql -uroot -p123456
show databases;
测试连通性
192.168.10.14:
cd /usr/local/nginx/html/py_project/
vim 03_create_pod_busybox.yaml
添加;
apiVersion: v1
kind: Pod
metadata:
name: busybox-pod
spec:
containers:
- name: busybox-container
image: busybox:1.28.4
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
restartPolicy: Always
busybox:1.28.4 #此镜像nslookup及ping命令都没有问题,不要下载最新版本和1.31。
master1:
kubectl apply -f http://yaml.test.com:81/py_project/03_create_pod_busybox.yaml
kubectl get pod
kubectl exec -it busybox-pod -- sh
nslookup cmdbdb-0.cmdbmysql.cmdb
ping cmdbdb-0.cmdbmysql.cmdb
192.168.10.14:
查看MySQL数据持久化目录
ls /data/nfs/cmdb-mysql-cmdb-cmdbdb-0-pvc-e0e34661-77a9-4951-85d8-f9a074620ad9/syscmdb/
没有数据表
(3)导入数据表
master1:
kubectl -n cmdb exec -it cmdbdb-0 -- mysql -uroot -p123456 syscmdb < cmdbdb.sql
kubectl -n cmdb exec -it cmdbdb-0 -- sh
mysql -uroot -p123456
use syscmdb;
show tables;
192.168.10.14:
查看MySQL数据持久化目录
ls /data/nfs/cmdb-mysql-cmdb-cmdbdb-0-pvc-e0e34661-77a9-4951-85d8-f9a074620ad9/syscmdb/
已有数据表
四、项目镜像准备(192.168.10.14)
1、目录及文件准备
创建制作镜像文件目录
mkdir /root/py_project_image
cd /root/py_project_image/
cp -r /root/cmdb/syscmdb/ .
修改项目数据库连接文件
vim syscmdb/syscmdb/settings.py
修改:
将127.0.0.1改成数据库pod的主机名:cmdbdb-0.cmdbmysql.cmdb
编辑制作项目镜像Dockerfile
vim Dockerfile
添加:
FROM harbor.test.com/py_project/py_base:v1
MAINTAINER "admin<admin@test.com>"
ADD . /
WORKDIR /syscmdb
EXPOSE 8000
CMD ["python3","manage.py","runserver","0.0.0.0:8000"]
2、制作镜像
ls
docker build -t harbor.test.com/py_project/py_project_image:v1 .
3、上传镜像到harbor
docker push harbor.test.com/py_project/py_project_image:v1
五、部署Metallb、Ingress Nginx
1、准备metallb、ingress Nginx清单文件(192.168.10.14)
上传metallb_ingress.tar.gz包到/root目录
tar xf metallb_ingress.tar.gz
mkdir /usr/local/nginx/html/metallb_ingress
cp /root/metallb-ingress/* /usr/local/nginx/html/metallb_ingress/
ls /usr/local/nginx/html/metallb_ingress/
2、部署metallb(master1)
(1)修改kube-proxy代理模式(master1)
编辑 Kubernetes 中 kube-proxy 的 ConfigMap
kubectl edit configmap kube-proxy -n kube-system
修改添加:
重启 Kubernetes 中 kube-proxy DaemonSet
kubectl rollout restart daemonset kube-proxy -n kube-system
(2)部署metallb
上传metallb_speaker.tar和metallb-controller.tar镜像包到/root目录并导入镜像(master1、worker1、worker2)
docker load -i metallb_speaker.tar
docker load -i metallb-controller.tar
创建资源(master1)
kubectl apply -f http://yaml.test.com:81/metallb_ingress/metallb-native.yaml
查看指定命名空间(metallb-system)中所有 Pod
kubectl get pod -n metallb-system
(3)准备IP地址池(master1)
kubectl apply -f http://yaml.test.com:81/metallb_ingress/ippool.yaml
kubectl get ipaddresspools -n metallb-system
(4)开启二层通告(master1)
kubectl apply -f http://yaml.test.com:81/metallb_ingress/l2.yaml
3、服务代理ingress nginx部署
(1)获取ingress nginx部署文件
master1:
wget http://yaml.test.com:81/metallb_ingress/deploy.yaml
master1、worker1、worker2:
上传ingress-nginx.tar包到/root目录并导入
docker load -i ingress-nginx.tar
(2)修改部署文件deploy.yaml(master1)
vim deploy.yaml
修改:
LoadBalancer
Nginx ingress controller本身也是以一个服务的方式运行在k8s群集中
改为LoadBalancer的目的是让metallb给nginx ingress分配一个群集ip
(3)部署ingress nginx(master1)
kubectl apply -f deploy.yaml
(4)查看部署状态(master1)
kubectl get pod -n ingress-nginx
六、项目部署
1、准备部署项目清单文件(192.168.10.14)
cd /usr/local/nginx/html/py_project/
vim 04_deployment.yaml
添加:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pythoncmdb
namespace: cmdb
spec:
replicas: 2
selector:
matchLabels:
project: pythoncmdb
app: cmdb-demo
template:
metadata:
labels:
project: pythoncmdb
app: cmdb-demo
spec:
containers:
- name: cmdb
image: harbor.test.com/py_project/py_project_image:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
name: web
protocol: TCP
resources:
requests:
cpu: 0.5
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
livenessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 60
timeoutSeconds: 20
readinessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 60
timeoutSeconds: 20
2、准备服务清单文件(192.168.10.14)
vim 05_service.yaml
添加:
apiVersion: v1
kind: Service
metadata:
name: pythoncmdbsvc
namespace: cmdb
spec:
selector:
project: pythoncmdb
app: cmdb-demo
ports:
- name: web
port: 80
targetPort: 8000
由于使用ingress暴露,所以不使用NodePort,默认ClusterIP
3、准备Ingress对象清单文件(192.168.10.14)
vim 06_ingress.yaml
添加:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pythoncmdbingress
namespace: cmdb
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
ingressClassName: nginx
rules:
- host: cmdb.test.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: pythoncmdbsvc
port:
number: 80
4、项目部署资源清单文件列表(192.168.10.14)
ls
5、应用项目部署(master1)
kubectl apply -f http://yaml.test.com:81/py_project/04_deployment.yaml
kubectl apply -f http://yaml.test.com:81/py_project/05_service.yaml
kubectl apply -f http://yaml.test.com:81/py_project/06_ingress.yaml
七、项目部署验证及访问
1、验证(master1)
kubectl get deployment -n cmdb
kubectl get svc -n cmdb
kubectl get pod -n cmdb
kubectl get ingress -n cmdb
kubectl get svc -n ingress-nginx
2、修改Windows主机的hosts解析文件(Windows)
添加:
192.168.10.240 cmdb.test.com
3、使用浏览器访问cmdb.test.com