K8S集群java项目上云部署

一、项目流程拓扑:

1、项目主机规划

编号

主机名

主机ip

服务

域名

1

Master01

192.168.8.15

K8s集群master

2

Worker01

192.168.8.16

K8s集群worker01

3

Worker02

192.168.8.17

K8s集群worker02

4

公共服务

(public-server)

192.168.8.18

Dns

Nginx

Harbor

nfs

域名1:

dns.test.com

域名2:

yaml.test.com

域名3:

harbor.test.com

域名4:

nfs.test.com

2、项目拓扑

二、部署公共服务

1、部署DNS域名解析

[root@localhost ~]# hostnamectl set-hostname public-server

[root@localhost ~]# bash

[root@public-server ~]# systemctl disable firewalld;systemctl stop firewalld

[root@public-server~]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

[root@public-server ~]# setenforce 0

[root@public-server ~]# yum -y install bind bind-chroot

[root@public-server ~]# vim /etc/named.conf

配置:

options {

        listen-on port 53 { 127.0.0.1;any; };

        listen-on-v6 port 53 { ::1; };

        directory       "/var/named";

        dump-file       "/var/named/data/cache_dump.db";

        statistics-file "/var/named/data/named_stats.txt";

        memstatistics-file "/var/named/data/named_mem_stats.txt";

        recursing-file  "/var/named/data/named.recursing";

        secroots-file   "/var/named/data/named.secroots";

        allow-query     { localhost;any; };

保存退出

[root@public-server ~]# vim /etc/named.rfc1912.zones

配置:

最后一行添加

zone "test.com" IN {

        type master;

        file "test.com";

        allow-update { none; };

};

[root@public-server ~]# cd /var/named/

[root@public-server named]#  ls

chroot  data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves

[root@public-server named]# cp -p named.localhost test.com

[root@public-server named]# vim test.com

修改:

$TTL 1D

@       IN SOA  test.com. admin.test.com. (

                                        0       ; serial

                                        1D      ; refresh

                                        1H      ; retry

                                        1W      ; expire

                                        3H )    ; minimum

        NS      dns.test.com.

dns     A       192.168.8.18

yaml    A       192.168.8.18   

harbor  A       192.168.8.18

nfs     A       192.168.8.18

保存

启动dns服务

[root@public-server named]# systemctl enable named

[root@public-server named]# systemctl start named

所有节点修改dns指定dns服务器

[root@所有节点r ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

DNS1=192.168.8.18

[root@所有节点~]# systemctl restart network

安装域名解析工具

[root@public-server named]# yum -y  install bind-utils

域名解析 DNS解析验证

[root@public-server named]#  nslookup dns.test.com

[root@public-server named]#  nslookup harbor.test.com

[root@public-server named]#  nslookup yaml.test.com

[root@public-server named]#  nslookup nfs.test.com

2、YAML资源清单文件托管服务nginx配置

Yum安装nginx

[root@public-server ~]# yum -y install nginx

修改nginx配置文件

[root@public-server ~]# vim /etc/nginx/nginx.conf

修改

    server {

        listen       81;

        listen       [::]:81;

        server_name  _;

        root         /usr/share/nginx/html;

        autoindex on;

        index index;

启动nginx并设置开机自动启动

[root@public-server ~]# systemctl enable nginx

[root@public-server ~]# systemctl restart nginx

测试服务可用性

3、安装镜像仓库harbor

安装docker-ce

托包本地安装

[root@public-server ~]# cd docker-26/

[root@public-server docker-26]# yum -y localinstall *.rpm

以下操作不执行

安装docker-ce

[root@public-server ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

[root@public-server ~]# yum -y install docker-ce

注意:yum直接安装会出现Error downloading packages: docker-compose-plugin-2.27.1-1.el7.x86_64: [Errno 256] No more mirrors to try.

启动docker

[root@public-server ~]# systemctl enable docker

[root@public-server ~]# systemctl start docker

查看docker版本

[root@public-server ~]# docker version

安装docker-compose

托包docker-compose和harbor

[root@public-server~]#mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

[root@public-server ~]# chmod +x /usr/local/bin/docker-compose

[root@public-server ~]# docker-compose -v


将harbor包解压到/usr/local/下

[root@public-server ~]# tar xf harbor-offline-installer-v2.3.5.tgz -C /usr/local/

[root@public-server ~]# cd /usr/local/harbor/

[root@public-server harbor]# cp harbor.yml.tmpl harbor.yml

[root@public-server harbor]# vim harbor.yml

修改:

注释https模块

hostname: harbor.test.com

# http related config

http:

  # port for http, default is 80. If https enabled, this port will redirect to https port

  port: 80

# https related config

#https:

  # https port for harbor, default is 443

  #port: 443

  # The path of cert and key files for nginx

  #certificate: /your/certificate/path

  #private_key: /your/private/key/path

保存退出

导入镜像

[root@public-server harbor]# docker load -i harbor.v2.3.5.tar.gz

[root@public-server harbor]# docker images

[root@public-server harbor]# ./prepare

[root@public-server harbor]# ./install.sh

查看容器是否启动

[root@public-server harbor]# docker ps -a

测试harbor可用性

所有节点

[root@所有节点 ~]# vim /etc/docker/daemon.json

"insecure-registries": ["http://harbor.test.com"],

重载docker

[root@所有节点 ~]# systemctl reload docker

登录harbor

[root@public-server harbor]# docker login -uadmin -pHarbor12345 harbor.test.com

4、配置nfs

所有节点安装nfs-utils

[root@所有节点 ~]#  yum -y install nfs-utils

配置nfs

[root@public-server harbor]#  mkdir /data/nfs

[root@public-server ~]# vim /etc/exports

添加

/data/nfs *(rw,sync,no_root_squash)

重启服务并设置开机自启

[root@public-server ~]# systemctl restart nfs

[root@public-server ~]# systemctl enable nfs

所有节点测试是否能挂载nfs

[root@public-server ~]# showmount -e nfs.test.com

[root@master01 ~]# showmount -e nfs.test.com

[root@worker01 ~]# showmount -e nfs.test.com

[root@worker02 ~]# showmount -e nfs.test.com

三、配置nfs动态供给storageclass

1、下载并创建storageclass存储类

[root@master01 ~]#  wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/class.yaml

如果没有vpn可以复制内容到这个yaml文件

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  name: nfs-client

provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'

parameters:

  archiveOnDelete: "false"

[root@master01 ~]# mv class.yaml storageclass-nfs.yml

[root@master01 ~]#  kubectl apply -f storageclass-nfs.yml

[root@master01 ~]# kubectl get storageclasses.storage.k8s.io

2、下载资源清单文件,创建rbac账号并授权

没有vpn可以复制内容跟上面一样的操作

[root@master01 ~]#  wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/rbac.yaml

[root@master01 ~]# mv rbac.yaml storageclass-nfs-rbac.yaml

3、创建动态供给的deployment

通过中间件将访问账号与共享存储关联

[root@master01 ~]# vim deploy-nfs-client-provisioner.yml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nfs-client-provisioner

spec:

  replicas: 1

  strategy:

    type: Recreate

  selector:

    matchLabels:

      app: nfs-client-provisioner

  template:

    metadata:

      labels:

        app: nfs-client-provisioner

    spec:

      serviceAccount: nfs-client-provisioner

      containers:

        - name: nfs-client-provisioner

          image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0

          volumeMounts:

            - name: nfs-client-root

              mountPath: /persistentvolumes

          env:

            - name: PROVISIONER_NAME

              value: k8s-sigs.io/nfs-subdir-external-provisioner

            - name: NFS_SERVER

              value: 192.168.8.18

            - name: NFS_PATH

              value: /data/nfs

      volumes:

        - name: nfs-client-root

          nfs:

            server: 192.168.8.18

            path: /data/nfs

在工作节点worker01和worker02导镜像

[root@worker01 ~]# docker load -i nfs-provisioner.tar

[root@worker02 ~]# docker load -i nfs-provisioner.tar

执行资源清单文件

[root@master01 ~]# kubectl apply -f deploy-nfs-client-provisioner.yml

如果出现ContainerCreating情况可以使用如下命令查看

[root@master01 ~]# kubectl describe pod nfs-client-provisioner-7b77cfb575-689bc

如果是calico故障执行如下命令

[root@master01 ~]# kubectl delete pod -n calico-system –all

四、部署metallb

1、修改kube-proxy工作模式

[root@master01 ~]# kubectl edit configmap kube-proxy -n kube-system

修改:

[root@master01 ~]# kubectl rollout restart daemonset -n kube-system kube-proxy

查看工作模式

[root@master01 ~]# kubectl describe configmaps -n kube-system kube-proxy |grep mode

2、部署metallb

复制下面镜像备份文件复制到所有节点

[root@master01 ~]# docker load -i metallb.tar

[root@worker01 ~]# docker load -i metallb.tar

[root@worker02 ~]# docker load -i metallb.tar

将metallb-native.yaml复制到master

运行pod

[root@master01 ~]# kubectl apply -f metallb-native.yaml

[root@master01 ~]# kubectl get pod -n metallb-system

3、ip地址池准备

[root@master01 ~]# vim ippool.yaml
apiVersion: metallb.io/v1beta1

kind: IPAddressPool

metadata:

  name: ippool

  namespace: metallb-system

spec:

  addresses:

  - 192.168.8.240-192.168.8.250

[root@master01 ~]# kubectl apply -f ippool.yaml

[root@master01 ~]# kubectl get ipaddresspools.metallb.io -n metallb-system

4、开启二层通告

[root@master01 ~]# vim L2.yaml

apiVersion: metallb.io/v1beta1

kind: L2Advertisement

metadata:

  name: example

  namespace: metallb-system

[root@master01 ~]# kubectl apply -f L2.yaml

五、部署ingress nginx代理

1、导入ingress.tar镜像到所有工作节点,将资源清单复制到master

[root@worker01 ~]# docker load -i ingress.tar

[root@worker02 ~]# docker load -i  ingress.tar

[root@master01 ~]# kubectl apply -f deploy.yaml

[root@master01 ~]# kubectl get pod -n ingress-nginx

六、项目基础镜像准备

本次发布一个java项目,以war包方式发布,需要使用tomcat做为项目基础镜像,然后定制。

1、定制tomcat镜像(在公共服务器上做)

[root@public-server ~]#  mkdir /root/tomcat

[root@public-server ~]# cd /root/tomcat/

[root@public-server tomcat]# vim Dockerfile

FROM centos:7

MAINTAINER "admin<admin@test.com>"

ENV VERSION=9.0.91

ENV JAVA_HOME=/usr/local/jdk

COPY ./apache-tomcat-${VERSION}.tar.gz /

RUN tar xf /apache-tomcat-${VERSION}.tar.gz

RUN mv /apache-tomcat-${VERSION} /usr/local/tomcat

RUN rm -rf /apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/*

RUN mkdir /usr/local/tomcat/webapps/ROOT

ADD ./jdk /usr/local/jdk

RUN echo "export TOMCAT_HOME=/usr/local/tomcat" >> /etc/profile

RUN echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile

RUN echo "export PATH=$TOMCAT_HOME/bin:$JAVA_HOME/bin:$PATH" >> /etc/profile

RUN echo "export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/profile

RUN source /etc/profile

EXPOSE 8080

CMD ["/usr/local/tomcat/bin/catalina.sh","run"]

保存退出

可提前导入centos:7的镜像,然后将jdk解压移动到/root/tomcat

[root@public-server tomcat]# docker load -i centos7.tar

[root@public-server ~]#  mkdir /root/tomcat

[root@public-server ~]# cd /root/tomcat/

[root@public-server tomcat]# vim Dockerfile

[root@public-server tomcat]# cd

[root@public-server ~]# tar xf jdk-8u191-linux-x64.tar.gz

[root@public-server ~]#  mv jdk1.8.0_191/ tomcat/jdk

[root@public-server ~]# cd tomcat/

[root@public-server tomcat]# ls

apache-tomcat-9.0.91.tar.gz  Dockerfile  jdk

2、开启路由转发

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@public-server tomcat]# sysctl -p

3、构建镜像并推送到harbor

[root@public-server tomcat]#  docker build -t harbor.test.com/java-project/tomcat:9102 .

windows浏览器访问harbor服务器

并创建java-project项目

[root@public-server tomcat]# docker push harbor.test.com/java-project/tomcat:9102

将mysql镜像推送到harbor仓库

[root@public-server ~]# docker load -i mysql5.7.tar

[root@public-server ~]# docker tag mysql:5.7 harbor.test.com/java-project/mysql:5.7

[root@public-server ~]# docker push harbor.test.com/java-project/mysql:5.7

将busybox镜像推送到harbor仓库

[root@public-server ~]# docker load -i busybox.1.28.tar

[root@public-server ~]# docker tag busybox:1.28.4 harbor.test.com/java-project/busybox:1.28.4

[root@public-server ~]# docker push harbor.test.com/java-project/busybox:1.28.4

在harbor验证tomcat镜像是否上传

七、存储准备

[root@master01 ~]# kubectl get storageclass

[root@master01 ~]#  kubectl get pod

八、项目容器镜像仓库及项目源码准备

1、项目源码准备

复制java源码包javaproject.tar.gz到当前位置,并解包

[root@public-server ~]# tar xf javaproject.tar.gz

[root@public-server ~]# cd /root/javaproject/

main 源代码目录

[root@public-server java-project]# cd /root/javaproject/project-source/pro-source/java-project

[root@public-server java-project]# vim Dockerfile

修改:

FROM harbor.test.com/java-project/tomcat:9102

LABEL maintainer "admin <admin@test.com>"

RUN rm -rf /usr/local/tomcat/webapps/*

ADD target/*.war /usr/local/tomcat/webapps/ROOT.war

[root@public-server java-project]#  cat /root/javaproject/project-source/pro-source/java-

[root@public-server java-project]#  cat /root/javaproject/project-source/pro-source/java-project/src/main/resources/application.yml

2、项目编译环境准备 jdk & maven

用于对java项目代码进行编译打包代码

下载maven,可以托包

[root@public-server java-project]# cd

安装maven

[root@public-server ~]# tar xf jdk-8u191-linux-x64.tar.gz

[root@public-server ~]# mv jdk1.8.0_191/ /usr/local/jdk

[root@public-server ~]# tar xf apache-maven-3.8.8-bin.tar.gz

[root@public-server ~]#  mv apache-maven-3.8.8 /usr/local/maven

[root@public-server ~]# vim /etc/profile.d/maven.sh

添加

export JAVA_HOME=/usr/local/jdk

export MAVEN_HOME=/usr/local/maven

export PATH=${MAVEN_HOME}/bin:${JAVA_HOME}/bin:$PATH

[root@public-server ~]# source /etc/profile

九、项目部署

  1. 本项目部署思路
  1. 本次部署的应用
  • 数据库 MySQL
  • Web应用 Tomcat
  1. 有状态应用与无状态应用部署规划

Mysql

      • statefulset控制器
      • headless service
      • pv,pvc 存储资源动态供给

tomcat(java应用)

      • deployment控制器
      • ClusterIP Service
      • Ingress 服务暴露实现集群外访问

2、项目资源清单文件准备

[root@public-server ~]# mkdir /usr/share/nginx/html/java_project

[root@public-server ~]# cd /usr/share/nginx/html/java_project/

1.namespace资源清单文件(用于实现项目隔离)

[root@public-server java_project]# vim 01_ns.yaml

apiVersion: v1

kind: Namespace

metadata:

  name: javaproject

 2. 部署java项目资源清单文件(用于部署java项目)

[root@public-server java_project]# vim 02_deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: java-project

  namespace: javaproject

spec:

  replicas: 2

  selector:

    matchLabels:

      project: www

      app: java-demo

  template:

    metadata:

      labels:

        project: www

        app: java-demo

    spec:

      containers:

      - name: tomcat

        image: harbor.test.com/java-project/java-project:v1 #镜像

        imagePullPolicy: IfNotPresent

        ports:

        - containerPort: 8080

          name: web

          protocol: TCP

        resources:

          requests:

            cpu: 0.5

            memory: 1Gi

          limits:

            cpu: 1

            memory: 2Gi

        livenessProbe:

          httpGet:

            path: /

            port: 8080

          initialDelaySeconds: 60

          timeoutSeconds: 20

        readinessProbe:

          httpGet:

            path: /

            port: 8080

          initialDelaySeconds: 60

          timeoutSeconds: 20

3. 项目服务(service)资源清单文件(用于创建service)

[root@public-server java_project]# vim 03_service.yaml

apiVersion: v1

kind: Service

metadata:

  name: java-project

  namespace: javaproject

spec:

  selector:

    project: www

    app: java-demo

  ports:

  - name: web

    port: 80

    targetPort: 8080

4.Ingress对象资源清单文件(需要提前部署 ingress控制器)

[root@public-server java_project]# vim 04_ingress.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: java-project

  namespace: javaproject

  annotations:

    ingressclass.kubernetes.io/is-default-class: "true"

spec:

  ingressClassName: nginx

  rules:

    - host: javaweb.test.com

      http:

        paths:

        - pathType: Prefix

          path: /

          backend:

            service:

              name: java-project

              port:

                number: 80

5.mysql部署资源清单文件

[root@public-server java_project]# vim 05_mysql.yaml

apiVersion: v1

kind: Service

metadata:

  name: mysql

  namespace: javaproject

spec:

  ports:

  - port: 3306

    name: mysql

  clusterIP: None

  selector:

    app: mysql-public

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: db

  namespace: javaproject

spec:

  selector:

    matchLabels:

      app: mysql-public

  serviceName: "mysql"

  template:

    metadata:

      labels:

        app: mysql-public

    spec:

      containers:

      - name: mysql

        image: harbor.test.com/java-project/mysql:5.7

        env:

        - name: MYSQL_ROOT_PASSWORD

          value: "123456"

        - name: MYSQL_DATABASE

          value: test

        ports:

        - containerPort: 3306

        volumeMounts:

        - mountPath: "/var/lib/mysql"

          name: nfsdata

  volumeClaimTemplates:

  - metadata:

      name: nfsdata

    spec:

      accessModes: ["ReadWriteMany"]

      storageClassName: "nfs-client"

      resources:

        requests:

          storage: 5Gi

6. mysql访问测试pod

[root@public-server java_project]# vim 06_create_pod_busybox.yaml

apiVersion: v1

kind: Pod

metadata:

  name: busybox-pod

spec:

  containers:

  - name: busybox-container

    image: harbor.test.com/java-project/busybox:1.28.4  #此镜像nslookup及ping命令都没有问题,不要下载最新版本和1.31。

    imagePullPolicy: IfNotPresent

    command:

    - sleep

    - "3600"

  restartPolicy: Always

查看资源清单

 

十、项目数据库 Mysql部署

1、创建命名空间

[root@master01 ~]# kubectl apply -f http://yaml.test.com:81/java_project/01_ns.yaml

2、部署数据库

[root@master01 ~]# kubectl apply -f http://yaml.test.com:81/java_project/05_mysql.yaml

查看持久化存储

3、导入数据库

[root@public-server java_project]# scp /root/javaproject/project-source/db/test.sql 192.168.8.15:/root

[root@master01 ~]# kubectl cp test.sql db-0:/ -n javaproject

[root@master01 ~]#  kubectl exec -it db-0 -n javaproject -- bash

root@db-0:/# ls

bin  boot  dev    docker-entrypoint-initdb.d  entrypoint.sh  etc       home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test.sql  tmp  usr      var

root@db-0:/# mysql -uroot -p123456

mysql> show databases;

mysql> use test

mysql> source /test.sql

mysql> show tables;

mysql> desc user;

4、验证数据库可用性

[root@master01~]#kubectl apply -f http://yaml.test.com:81/java_project/06_create_pod_busybox.yaml

[root@master01 ~]# kubectl get pod

NAME                                      READY   STATUS    RESTARTS   AGE

busybox-pod                               1/1     Running   0          8s

nfs-client-provisioner-7b77cfb575-689bc   1/1     Running   0          101m

[root@master01 ~]# kubectl exec -it busybox-pod -- sh

/ # nslookup db-0.mysql.javaproject

/ # nslookup db-0.mysql.javaproject.svc.cluster.local.

十一、项目源码编译打包

1、修改项目连接数据库地址

[root@public-server ~]# cd javaproject/project-source/pro-source/java-project/

[root@public-server java-project]# pwd

/root/javaproject/project-source/pro-source/java-project

[root@public-server java-project]# ls

Dockerfile  LICENSE  pom.xml  README.md  src

[root@public-server java-project]# cd src/

[root@public-server src]# cd main/

[root@public-server main]# cd resources/

[root@public-server resources]# vim application.yml (不用修改)
server:

  port: 8080

spring:

  datasource:

    url: jdbc:mysql://db-0.mysql.javaproject:3306/test?characterEncoding=utf-8

    username: root

    password: 123456

    driver-class-name: com.mysql.jdbc.Driver

  freemarker:

    allow-request-override: false

    cache: true

    check-template-location: true

    charset: UTF-8

    content-type: text/html; charset=utf-8

    expose-request-attributes: false

    expose-session-attributes: false

    expose-spring-macro-helpers: false

    suffix: .ftl

    template-loader-path:

      - classpath:/templates/

2、使用maven编译项目源码

[root@public-server java-project]# pwd

/root/javaproject/project-source/pro-source/java-project

[root@public-server java-project]# mvn clean package


过程慢长需等待

[root@public-server java-project]# ls

Dockerfile  LICENSE  pom.xml  README.md  src  target

[root@public-server java-project]# ls target/

[root@public-server java-project]# docker build -t harbor.test.com/java-project/java-project:v1 .

[root@public-server java-project]#  docker login harbor.test.com

Login Succeeded

[root@public-server java-project]# docker push harbor.test.com/java-project/java-project:v1

登录web查看

十二、部署项目

[root@master01 ~]# kubectl apply -f http://yaml.test.com:81/java_project/02_deployment.yaml

[root@master01 ~]# kubectl get pod -n javaproject

[root@master01 ~]#  kubectl apply -f http://yaml.test.com:81/java_project/03_service.yaml

[root@master01 ~]# kubectl apply -f http://yaml.test.com:81/java_project/04_ingress.yaml

ingress.networking.k8s.io/java-project created

[root@master01 ~]# kubectl get ingress -n javaproject

[root@master01 ~]# kubectl get svc -n ingress-nginx

[root@master01 ~]# kubectl get ingress -n javaproject

十三、访问测试

windows浏览器访问:javaweb.test.com

需要设置hosts文件

C:\Windows\System32\drivers\etc\hosts

  

更多推荐