前几天安装了 k8s 并测试了自动伸缩功能(HPA),今天来部署一个简单的 Java 应用到 k8s。

开始之前需要先安装一下 ingress 插件。ingress 作为 k8s 的流量入口,有多种实现。我知道的有 traefik,haproxy-ingress,ingress-nginx。今天以 ingress-nginx 为例来部署。

1. 部署 ingress-nginx

1.1 由于网络的原因我们还是先拉取镜像。(每个节点都要拉取)

docker pull ninejy/ingress-nginx-controller:v0.41.0
docker tag ninejy/ingress-nginx-controller:v0.41.0 k8s.gcr.io/ingress-nginx/controller:v0.41.0

1.2 下载并修改 deploy.yaml 文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.0/deploy/static/provider/baremetal/deploy.yaml
# 332 行 镜像后面的一串字符串去掉,因为我们的 docker tag 后面没跟这一串字符,(太长了 ^_^)

1.3 安装 ingress-nginx

kubectl apply -f deploy/yaml

kubectl get pod -n ingress-nginx
# 执行这个命令看到类似下图的内容就说明 ingress-nginx 安装成功了

2. 部署 Java 应用到 k8s

2.1 创建 jenkins 任务

jenkins 任务依然是 pipeline 风格的,下面是 pipeline file

pipeline {
agent any
stages {
stage('clone code from gitlab') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: "master"]],
userRemoteConfigs: [[
credentialsId: 'gitlab-robot',
refspec: "+refs/heads/*:refs/remotes/origin/*",
url: 'ssh://git@192.168.0.11:8222/examples/spring-boot-helloworld.git']]
])
}
}
stage('mvn clean package') {
steps {
sh '''
mvn clean package -Dmaven.test.skip=true
'''
} }
stage('docker build && docker push') {
steps {
script{
withDockerRegistry(credentialsId: 'docker-hub', url: 'https://index.docker.io/v1/') {
def myappImage = docker.build "ninejy/examples-helloworld", "-f Dockerfile ."
myappImage.push()
}
}
}
}
stage('deploy to k8s') {
steps {
sh '''
kubectl apply -f /data/k8s-yaml/deploy-examples-helloworld.yaml
'''
}
}
stage('clean dir') {
steps {
sh '''
echo "clean workspace"
'''
}
post {
always {
cleanDir()
}
}
}
}
}

deploy-examples-helloworld.yaml 的内容

apiVersion: apps/v1
kind: Deployment
metadata:
name: examples-helloworld
spec:
replicas: 2
selector:
matchLabels:
name: helloworld
template:
metadata:
labels:
name: helloworld
spec:
containers:
- name: helloworld
image: ninejy/examples-helloworld
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
readinessProbe:
httpGet:
port: 8080
path: /healthy
initialDelaySeconds: 20
periodSeconds: 3
livenessProbe:
httpGet:
port: 8080
path: /healthy
initialDelaySeconds: 20
periodSeconds: 3
timeoutSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: examples-helloworld-svc
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
selector:
name: helloworld
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: www.ninejy.io
spec:
rules:
- host: www.ninejy.io
http:
paths:
- path: /
backend:
serviceName: examples-helloworld-svc
servicePort: 80

说明:

1. jenkins 服务器要能够访问 k8s 集群(网络通)

2. jenkins 服务器上有可用的 kubectl 命令

3. jenkins 服务器上在运行 jenkins 进程的用户家目录有访问 k8s 的有效凭证。~/.kube/config。这里为演示简单,直接拷贝 k8s-master 节点的文件。

4. 这里使用的 docker 镜像仓库是 hub.docker.com 网络很慢,可以自己搭建 harbor。

5. readinessProbe.initialDelaySeconds 这个值的设置很关键,这是 k8s 就绪检测的设置,由这个测试程序启动需要十几秒,所以这里设置了 20s,如果设置时间太短会导致容器多次重启最终达到最大重启次数,然后启动失败。

2.2 准备工作做好之后就可以手动执行 jenkins 任务了。jenkins 任务成功执行之后到 k8s-master 节点查看

kubectl get svc
kubectl get ingress
kubectl get pod

有类似下图的输出就说明部署成功了

2.3. 配置 nginx

集群外部我们还需要安装一个 nginx 用来代理 ingress-nginx-controller

先查看 ingress-nginx-controller 的 nodePort

kubectl get svc -n ingress-nginx

nginx 配置文件,配置好之后记得重启 nginx 服务

# cat www-ninejy-io.conf
server {
listen 80;
server_name www.ninejy.io; location / {
proxy_set_header Host $host;
proxy_pass http://192.168.0.6:31901;
} access_log /var/log/nginx/www-access.log;
}

2.4 解析域名

由于我的域名没有在dns服务器上解析,所以需要绑 hosts 访问

192.168.0.61 www.ninejy.io
# 上面这一行写到 hosts 文件中,注意换成自己的 k8s 集群外 nginx 服务器的IP

2.5 访问测试

浏览器中输入:http://www.ninejy.io/hello

有下面的结果就说明所有配置都成功了。

以上实验中的 Java 程序代码在 https://github.com/ninejy-io/spring-boot-helloworld

k8s 部署 Java 项目的更多相关文章

  1. 利用Kubernetes(K8S)部署JAVA项目

    一.jar包和war包区别 首先简单介绍一下jar包和war包区别,当时就没分清,导致部署总是傻傻分不清楚. jar包:jar包就是java的类进行编译生成的class文件就行打包的压缩包.里面是一些 ...

  2. tomcat部署java项目

    tomcat部署java项目 1.启动tomcat 进入到tomcat安装目录下的bin #cd /opt/tomcat/bin #./startup.sh // 执行重启命令 2.重建一个新目录导入 ...

  3. RedHat Linux 5.5安装JDK+Tomcat并部署Java项目

    与大家分享下RedHat Linux 5.5安装JDK+Tomcat并部署Java项目的步骤,希望对大家有用. 1.下载并安装jdk 虚拟机中安装RedHat Linux 5.5 64位企业版, 这里 ...

  4. windows一键部署java项目

    windows一键部署java项目 因为公司需求,要在windows的环境上做一键部署启动java项目,同时还要支持从安装界面动态修改配置文件的IP地址.就像安装软件一样将jdk,tomcat,mys ...

  5. 关于weblogic部署Java项目的包冲突问题

    我们可能会用各种应用服务部署我们的Java应用,比如Tomcat.WAS.weblogic等.Tomcat和WAS可能会比较少遇到一些奇怪的问题,但是用weblogic部署项目则经常遇到一些比如包冲突 ...

  6. jenkins部署java项目,脚本文件放在远程仓库中 和jar一起打包(六)

    jenkins部署java项目到远程linux上,脚本文件和项目一起上传到gogs上,直接执行gogs上的脚本文件来执行项目 (1)新建maven项目 pom.xml的配置 <project x ...

  7. 通过Jenkins部署java项目

    部署java项目-创建私有仓库 Jenkins大多数情况下都是用来部署Java项目,Java项目有一个特点是需要编译和打包的,一般情况下编译和打包都是用maven完成,所以系统环境中需要安装maven ...

  8. 阿里云部署java项目

    第一步:注册阿里云账号(如果有请看第二步) 1.百度搜索阿里云,点击进入阿里云官网 2.点击右上角免费注册 3.进入注册页面,按照要求填写信息 4.注册完成后登陆 登陆之后首先购买阿里云esc与服务器 ...

  9. git jenkins 部署java项目

    1.Java项目部署基本概述:  1.什么是Java项目?  2.为什么Java项目需要使用Maven编译?  3.手动实现Java项目构建?  4.手动实现Java项目架构图? 源码包   jar包 ...

随机推荐

  1. IDEA(社区版)连接MySQL

    版本说明: MySQL 版本:8.0.20 IDEA   版本:2020.1.1(Community Edition) IDEA中安装插件: 首先在IDEA中下载DB Browser插件,安装好插件重 ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之五(五十四)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  3. CF1066F Yet another 2D Walking

    DP 由图可以知道优先级相同的点都在一个"7"字形中 所以在走当前的优先级的点时最好从右下的点走到左上的点,或从从左上的点走到右下的点 那记dp[i][0]表示在走完第i个优先级时 ...

  4. 【SpringCloud】08.客户端负载均衡器:Ribbon

    客户端负载均衡器:Ribbon Ribbon实现软负载均衡核心: 服务发现 :依据服务的名字,把该服务下所有的实例都找出来 服务选择规则:依据规则策略,如果从多个实例中,选出有效的服务 服务监听:检测 ...

  5. MSSQL 模糊搜索全文(过程、函数、触发器等)

    --SQL Server数据库查找含有某个关键字的存储过程.函数.触发器等 --SQL Server数据库查找含有某个关键字的存储过程,SQL语句如下: SELECT OBJECT_NAME(b.pa ...

  6. PyTorch-pycharm配置

    接上一篇文章: https://www.cnblogs.com/daisy-fung1314/p/soft-install-note1.html 上一篇安装好了PyTorch,Anaconda,pyc ...

  7. BPMN开源工作流编辑器bpmn-js落地实践中文文档

    BPMN是一套标准的业务流程建模符号规范,bpmn-js是基于此规范实现的一套渲染工具包和web建模器,可以实现拖拽生成工作流程图,效果大概如下 最近刚好用到,研究之后写了系列文章,分享给有需要的小伙 ...

  8. 记录一次读取hdfs文件时出现的问题java.net.ConnectException: Connection refused

    公司的hadoop集群是之前的同事搭建的,我(小白一个)在spark shell中读取hdfs上的文件时,执行以下指令 >>> word=sc.textFile("hdfs ...

  9. 还是畅通工程(最小生成树 并查集 Prim Kruskal)

    Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只 ...

  10. Springboot整合163邮箱部署项目时发送不了邮件的解决方案

    部署到腾讯云服务器时项目报错 Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: sm ...