前言
前面的教程,已经带着大家初步了解了K8S,接下来我们要通过实战,使用K8S去设计和构建常用项目。第一个项目,我选择Django,这是一个非常成熟的Web后台系统,通过Django我们可以构建一个稳健的Web业务。
前段时间去准备教案了,接下来我将会持续更新~~~
由于头条的代码显示惨不忍睹,读者也可去公众号阅读此文章。公众号见一楼评论区~~
准备
K8S
前期需要准备一个K8S环境,在前面的教程,我们已经可以通过自动化脚本搭建。可以参考这边博文
Images
django2.02
Dockerfile
FROM centos7:ssh MAINTAINER from cgls RUN yum -y install openssh* tar zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make && \ mkdir /usr/local/python3 && \ cd /usr/local/python3 && \ wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz && \ tar -zxf Python-3.6.4.tgz && \ cd Python-3.6.4 && \ ./configure --prefix=/usr/local/python3 && \ make && make install && \ cd /usr/bin && \ mv python python.bk && \ ln -s /usr/local/python3/bin/python3 /usr/bin/python && \ sed -i "s/python/python2.7/" /usr/bin/yum && \ sed -i "s/python/python2.7/" /usr/libexec/urlgrabber-ext-down && \ sed -i "s/python/python2.7/" /usr/bin/yum-config-manager && \ cd && \ python -m pip install --upgrade pip && \ python -m pip install django==2.0.2 && \ python -m pip install django-bootstrap3 && \ python -m pip install pymysql && \ python -m pip install requests && \ python -m pip install bs4 CMD ["/usr/sbin/init"]
这里我是在centos7:ssh镜像基础上构建的,这个镜像就是在官方镜像上添加了ssh服务。大家可以自行构建~~
docker build -t centos:django2.02 .
mysql:5.7
Dockerfile
FROM centos7:ssh MAINTAINER from cgls RUN yum -y install wget && \ cd /usr/local/src/ && \ wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm && \ rpm -ivh mysql57-community-release-el7-8.noarch.rpm && \ yum -y install mysql-server && \ mkdir -p /raiddisk/mysqldata && \ chown mysql:mysql /raiddisk/mysqldata && \ /usr/sbin/mysqld --initialize-insecure --datadir=/raiddisk/mysqldata --user=mysql && \ sed -i 's/datadir=\/var\/lib\/mysql/# datadir=\/var\/lib\/mysql/g' /etc/my.cnf && \ echo -e "# add\ncharacter-set-server = utf8\ndatadir = /raiddisk/mysqldata\nlower_case_table_names = 1\nexpire_logs_days = 2\ninnodb_buffer_pool_size = 512M\nmax_connections=1500\nmax_connect_errors = 50\nmax_allowed_packet = 64M\ninnodb_file_per_table=1\nkey_buffer_size = 4096M\nsort_buffer_size=64M\nmyisam_sort_buffer_size=64M\nread_buffer_size=2M\ntable_open_cache = 2048\ntmp_table_size = 128M\nmax_heap_table_size = 128M\nread_rnd_buffer_size = 128M\nthread_cache_size = 64\nbulk_insert_buffer_size = 64M\nmyisam_max_sort_file_size = 30G\nmyisam_repair_threads = 1\nquery_cache_size = 64M\nquery_cache_limit = 2M\nthread_stack = 192K\nslow_query_log" >> /etc/my.cnf && \ systemctl enable mysqld.service CMD ["/usr/sbin/init"]
create.sh
!/bin/bash mysql -uroot<<EOF alter user 'root'@'localhost' identified by '123qwe'; grant all privileges on *.* to 'cgls'@'%' identified by '123qwe'; flush privileges; exit EOF
install.sh
#!/bin/bash docker build -t centos7:mysql . sleep 3 docker run -itd --name mysql_create centos7:mysql docker cp create.sh mysql_create:/root docker -it exec mysql_create sh create.sh docker commit mysql_create centos7:mysql5.7 docker rm -f -v mysql_create
sh install.sh
设计
我们的django项目,精简版只需要2个服务,mysql服务、django服务。现在镜像已经准备好了,现在要设计服务。
之前我们学习过健康检查,如果服务不能正常运行,一切都是白搭,所以健康检查是一定要有的。除此之外,我们要考虑获取django工程,在构建django服务时,获取最新的django工程并运行。如果django工程需要正常运行,那么我们还需要mysql服务能够正常运行,mysql服务这次暂不做读写分离,仅仅固定cluster_ip即可。
mysql_deployment.yaml
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 name: mysql imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD value: 123qwe readinessProbe: exec: command: - /bin/sh - "-c" - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}" - mysql -h 127.0.0.1 -u root -e "SELECT 1" initialDelaySeconds: 10 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 3 periodSeconds: 5
mysql_service.yaml
apiVersion: v1 kind: Service metadata: name: mysql-svc spec: selector: run: mysql clusterIP: 10.101.1.1 ports: - protocol: TCP port: 3306 targetPort: 3306
django_deployment.yaml
apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: django name: django spec: replicas: 1 selector: matchLabels: app: django template: metadata: labels: app: django spec: containers: - image: centos7:django2.02 name: django args: - /bin/sh - -c - cd /root; wget http://172.16.1.150:/healthy.conf; sleep 365d readinessProbe: exec: command: - cat - /root/healthy.conf initialDelaySeconds: 10 periodSeconds: 5
django_service.yaml
apiVersion: v1 kind: Service metadata: name: django-svc spec: selector: run: django clusterIP: 10.101.1.2 ports: - protocol: TCP port: 8000 targetPort: 8000 ?
启动的时候,需要按照顺序依次执行即可~~
kubectl apply -f mysql_deployment.yaml
kubectl apply -f mysql_service.yaml
kubectl apply -f django_deployment.yaml
kubectl apply -f django_service.yaml
如果嫌麻烦,可以把所有文件整成一个
django_deploy.yaml
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 name: mysql imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD value: 123qwe readinessProbe: exec: command: - /bin/sh - "-c" - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}" - mysql -h 127.0.0.1 -u root -e "SELECT 1" initialDelaySeconds: 10 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 3 periodSeconds: 5 --- ? apiVersion: v1 kind: Service metadata: name: mysql-svc spec: selector: run: mysql clusterIP: 10.101.1.1 ports: - protocol: TCP port: 3306 targetPort: 3306 --- ? apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: django name: django spec: replicas: 1 selector: matchLabels: app: django template: metadata: labels: app: django spec: containers: - image: centos7:django2.02 name: django args: - /bin/sh - -c - cd /root; wget http://172.16.1.150:/healthy.conf; sleep 365d readinessProbe: exec: command: - cat - /root/healthy.conf initialDelaySeconds: 10 periodSeconds: 5 --- ? apiVersion: v1 kind: Service metadata: name: django-svc spec: selector: run: django clusterIP: 10.101.1.2 ports: - protocol: TCP port: 8000 targetPort: 8000
最基础的架子已经打好,接下来我们要一般般优化直至可以用于生产环境。
大家可以思考一下,如何在资源创建后立马启动django工程~~~