原文网址:https://blog.csdn.net/Erica_java/article/details/128041969
之前用docker-compose部署微服务项目,但是只能单节点的(那你用微服务架构干啥?),所以想搞一下k8s集群,网上找了下资料没有视频专门讲这一块,自己找了很多资料,搞了蛮长时间的,所以记录一下
1.安装k8s和管理界面kuboard
高版本的k8s已经抛弃了docker,容器使用的话要安装1.19版本的 链接地址
安装好之后执行命令查看所有node节点
kubectl get nodes
1
访问ip:30080 进入kuboard管理界面 登录进去
2.概念
namespace:命名空间,所有操作都要先选择一个命名空间
ingress:nginx做了一层封装,用域名代替ip访问
service:暴露给外网访问的端口(Nodeport),因为创建的应用只能集群内访问到
deployment:应用负载,下面有多个pod,一个pod宕机了,可以立马创建新的pod,也可以扩缩容
pod:容器组,里面可以创建多个容器
3.命令
kubectl 动词 类别 名称
例如 创建命名空间 kubectl create namespace namespace名
后面的操作部署都是指定yml文件运行 kubectl apply -f yml文件名 (用的最多的命令,项目部署都是用yml文件)
4.部署应用
三个简单服务 nginx gateway , order , product 注册中心nacos 数据库mysql,redis
mysql ,nacos,redis这些有状态的应用放到k8s外部 ,gateway , order , product这三个服务放k8s中部署
4.1 将jar包打成镜像传到harbor仓库中(可以在idea中使用docker-maven-plugin插件打包上传镜像),Dockerfile以gateway为例
FROM moxm/java:1.8-full
MAINTAINER levi
EXPOSE 38080
ARG JAR_FILE=target/k8s-gateway.jar
COPY $JAR_FILE app.jar
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
CMD java -jar app.jar $JAVA_OPTS
三个镜像都上传上去之后,开始编写三个服务的yml文件进行部署
gateway.yml gateway创建了service,可以被外网访问到
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: test
name: gateway-dp
labels:
app: gateway-dp
spec:
replicas: 3
selector:
matchLabels:
app: gateway-dp
template:
metadata:
labels:
app: gateway-dp
spec:
containers:
- name: gateway
image: 192.168.3.152/test/k8s-gateway:1.0.0
---
#暴露service
apiVersion: v1
kind: Service
metadata:
namespace: test
name: gateway-dp #service的名称
labels:
app: gateway-dp #标签
spec:
selector:
app: gateway-dp #选择的deploy
ports:
- nodePort: 30008 #配置可以外网访问的端口
port: 38080 #集群内访问的端口
protocol: TCP
targetPort: 38080 #pod容器内的端口
type: NodePort
order.yml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: test
name: order-dp
labels:
app: order #为该Deployment设置key为app,value为order的标签
spec:
replicas: 2 #指定集群数,即pod的数量
selector: #标签选择器,与上面的标签共同作用
matchLabels: #选择包含标签app:order的资源
app: order
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:order的Pod
app: order
spec: #期望Pod实现的功能(即在pod中部署)
containers: #如果要创建多个容器,继续往下面加-name
- name: k8s-order #容器名称
image: 192.168.3.152/test/k8s-order:1.0.0 #镜像
product.yml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: test
name: product-dp
labels:
app: product #为该Deployment设置key为app,value为product的标签
spec:
replicas: 2 #指定集群数,即pod的数量
selector: #标签选择器,与上面的标签共同作用
matchLabels: #选择包含标签app:product的资源
app: product
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:product的Pod
app: product
spec: #期望Pod实现的功能(即在pod中部署)
containers: #如果要创建多个容器,继续往下面加-name
- name: k8s-product #容器名称
image: 192.168.3.152/test/k8s-product:1.0.0 #镜像
nginx.yml nginx创建deployment ,service和ingress
注意nginx挂载的目录和文件要在worker节点上提前创建好,因为到时候容器会运行在worker节点上
目录如下
idnex.html里面随便写点内容
nginx.conf配置文件内容如下
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://gateway-dp:38080/; #gateway-dp是网关的deployment名称
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#创建应用负载
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx #为该Deployment设置key为app,value为nginx的标签
name: k8s-nginx-dp
namespace: test
spec:
replicas: 2 #副本数量
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: k8s-nginx
image: nginx:latest #使用镜像nginx: 创建container,该container默认80端口可访问
ports:
- containerPort: 80 # 开启本容器的80端口可访问
volumeMounts: #挂载持久存储卷
- name: html #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /usr/share/nginx/html #挂载到容器的某个路径下
- name: conf #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /etc/nginx/conf.d #挂载到容器的某个路径下
volumes:
- name: html #和上面保持一致 这是本地的文件路径,上面是容器内部的路径
hostPath:
path: /home/nginx/html #此路径需要实现创建
- name: conf #和上面保持一致 这是本地的文件路径,上面是容器内部的路径
hostPath:
path: /home/nginx/conf #此路径需要实现创建
---
#创建service
apiVersion: v1
kind: Service
metadata:
namespace: test
name: k8s-nginx-dp
labels:
app: k8s-nginx-dp
spec:
selector:
app: nginx
ports:
- nodePort: 30010 #配置可以外网访问的端口
port: 8888 #集群内访问的端口
protocol: TCP
targetPort: 80 #pod容器内的端口
type: NodePort
---
#创建ingress
apiVersion: networking.k8s.io/v1 #固定写法
kind: Ingress
metadata:
namespace: test
name: nginx-ingress #ingress的名称
spec:
ingressClassName: ingress #kuboard上配置的ingress的名称,这个要先在kuboard上配置好
rules:
- host: levi.nginx.com #自己配置的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: k8s-nginx-dp #上面service上配置的name
port:
number: 8888 #上面配置的port
使用 kubectl apply -f yml文件名称 启动所有的yml,可以在kuboard界面上看到
点k8s-nginx-dp进去,选择服务,黄色的就是对外暴露的端口号
查看容器组
把levi.nginx.com 配到电脑hosts里面
使用apifox访问
————————————————
版权声明:本文为CSDN博主「Erica_java」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Erica_java/article/details/128041969