K8S部署SpringBoot项目
环境准备
安装好K8S,没搭建K8S的可查看:kubeadm方式搭建K8S集群、RKE搭建K8S【强烈推荐】
Springboot项目打包并构建镜像,不会可查看:docker镜像生成
创建阿里云镜像仓库
`01、登录阿里云Docker Registry
$ docker login --username=benkid52 registry.cn-hangzhou.aliyuncs.com
`02、查看镜像
$ docker images
#========================================================================================
REPOSITORY TAG IMAGE ID CREATED SIZE
school latest 879af1da0d2b 35 minutes ago 748MB
#========================================================================================
`03、推送镜像
$ docker tag 879af1da0d2b registry.cn-hangzhou.aliyuncs.com/zhangzhiwei/zzwman123:school
$ docker push registry.cn-hangzhou.aliyuncs.com/zhangzhiwei/zzwman123:school
`注意阿里云仓库如果设置了私有,就得配置K8S秘钥,去配置到yaml中,最后是公开
编写schoolexam.yaml【Deployment】
vi schoolexam.yaml
#========================================================================================
apiVersion: apps/v1 #kubectl api-versions 可以通过这条指令去看版本信息
kind: Deployment # 指定资源类别
metadata: #资源的一些元数据
name: schoolexam-deployment #deloyment的名称
labels:
app: schoolexam-deployment #标签
spec:
replicas: 1 #创建pod的个数
selector:
matchLabels:
app: schoolexam-deployment #满足标签为这个的时候相关的pod才能被调度到
template:
metadata:
labels:
app: schoolexam-deployment
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zhangzhiwei/zzwman123:school
imagePullPolicy: IfNotPresent
name: schoolexam-deployment
ports:
- containerPort: 8080
#========================================================================================
运行生成Pod容器
kubectl create -f schoolexam.yaml
#查看执行结果
kubectl get pods
#========================================================================================
NAME READY STATUS RESTARTS AGE
schoolexam-deployment-dbf487b45-p6gmj 1/1 Running 1 (14d ago) 16d
配置项目Service
vi schoolexam-svc.yaml
#========================================================================================
apiVersion: v1
kind: Service
metadata:
name: schoolexam-svc
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: schoolexam-deployment
#========================================================================================
kubectl apply -f schoolexam-svc.yaml
#查看执行结果
kubectl get svc
K8S部署Nginx
编写Nginx.yaml【Deployment】
vi nginx.yaml
#========================================================================================
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx #为该Deployment设置key为app,value为nginx的标签
name: nginx
spec:
replicas: 1
selector: #标签选择器,与上面的标签共同作用
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx
image: nginx:latest #使用镜像nginx: 创建container,该container默认80端口可访问
ports:
- containerPort: 81 # 开启本容器的80端口可访问
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
volumes:
- name: config-volume
configMap:
name: nginx-conf
#========================================================================================
kubectl apply -f nginx.yaml
#查看执行结果
kubectl get pods
为nginx的配置文件创建ConfigMap
编写nginx-conf.yaml
vi nginx-conf.yaml
#========================================================================================
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-conf
data:
default.conf: |-
server {
listen 81;
server_name localhost;
location /{
proxy_pass http://10.42.0.51:8080/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
#========================================================================================
kubectl apply -f nginx-conf.yaml
#查看执行结果
kubectl get configMap
#========================================================================================
NAME DATA AGE
nginx-conf 1 14d```
#### 查看配置
```shell
kubectl exec -it nginx-646876dd8b-khp87 -- /bin/bash
cat /etc/nginx/conf.d/default.conf
配置Nginx的Service
vi nginx-svc.yaml
#========================================================================================
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
ports:
- port: 81
targetPort: 81
nodePort: 81
protocol: TCP
selector:
app: nginx
#========================================================================================
kubectl apply -f nginx-svc.yaml
#查看执行结果
kubectl get svc
出现问题:
配置完Service之后,云服务器中curl访问IP+端口正常,但外部浏览器访问则超时
原因:
这是天翼云服务器存在80、443等特殊接口,需要备案才能进行使用
简化操作:
Nginx、Nginx的ConfigMap、Nginx的Service,这些可不部署,直接将SpringBoot项目的Service改为NodePort即可进行访问。
Nginx部署的意义
当项目变多的时候,我们可以通过Nginx去配置反向代理,一个端口可以配置多个项目的访问或者使用Ingress去反向代理。