一、k8s部署ngnix
1、一些查看命令
1-1、所有命令空间
kubectl get pod --all-namespaces
kubectl get svc --all-namespaces
1-2、指定命令空间
kubectl get pod -n yabin
kubectl get svc -n yabin
2、单节点集群兼容
# 因为目前只有一个master节点,默认安装后默认不会调度pod运行在master节点上,需要执行下列命令
kubectl taint nodes --all node-role.kubernetes.io/master-
3、部署ngnix,创建pod资源
sudo tee /app/nginx/nginx-deploy.yaml <<EOF
apiVersion: apps/v1 # 指定deployment的api版本; apps所属组,版本v1
kind: Deployment # 指定创建资源的角色/类型
metadata: # 指定Deployment的元数据
name: nginx-deploy # 创建名为nginx-deploy的Deployment
namespace: yabin
labels: # 指定Deployment的标签(可自定义多个),随意自定义即可,无需匹配其他
app: nginx
spec: # Deployment的资源规格
replicas: 1 # Deployment将创建1个Pod副本(默认为 1)
selector: # 匹配标签选择器,定义Deployment要管理的Pod,必须与Pod的template模板中定义的标签保持一致
matchLabels:
app: nginx
template: # 指定Pod模板
metadata: # 指定Pod的元数据
labels: # 指定Pod的标签(可自定义多个)
app: nginx
spec: # Pod的资源规格
containers: # 指定Pod运行的容器信息
- name: nginx # 指定Pod中运行的容器名
image: nginx:1.20 # 指定Pod中运行的容器镜像与版本(不指定镜像版本号则默认为latest)
ports:
- containerPort: 80 # 指定容器的端口(即Nginx默认端口)
EOF
4、配置ngnix对外端口号(用于暴露服务)
sudo tee /app/nginx/nginx-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: nginx-service # svc名称,对应 kubectl get svc的name
namespace: yabin # 命名空间,没有可以删除,默认是default
spec:
selector:
app: nginx # 关联容器标签(选择业务容器进行发布)
ports:
- port: 8000 # 集群内部服务之间访问service的入口
targetPort: 80 # 容器的端口
protocol: TCP
nodePort: 30001 # nodeport映射为30001端口,便于外部主机访问
type: NodePort # svc类型为nodeport
EOF
5、创建资源,对资源进行配置
kubectl apply -f nginx-deploy.yaml
kubectl apply -f nginx-svc.yaml
6、访问及测试
6-1、访问地址
http://121.5.167.170:30001/
6-2、通过kubectl命令进入容器
# ############ 执行进入容器命令模板 ############
kubectl exec -it podName -c containerName -n namespace -- shell comand
kubectl exec -it Pod名称 [-c 容器名称] [-n 命名空间] -- /bin/bash
# podName:是【kubectl get pod -n yabin】对应的name(如下图)
# containerName(非必须) :查看nginx-deploy.yaml中容器设置的名称
# -n namespace 命名空间:查看配置是否有设置命名空间,有就使用
# ############ 进入容器方法 ############
kubectl exec -it nginx-deploy-6897679c4b-g7hl5 -c nginx -n yabin -- /bin/bash
kubectl exec -it nginx-deploy-6897679c4b-g7hl5 -n yabin -- /bin/bash
6-3、通过docker命令进入容器
# 容器ID:是docker ps的CONTAINER ID值
sudo docker exec -it 容器ID /bin/bash
# 进入容器方法
sudo docker exec -it 25fab27be87b /bin/bash
7、针对端口不同的处理方式
# 外部流量访问k8s集群中service入口
curl 121.5.167.170:30001
# 集群内部服务之间访问service的入口
curl 10.111.200.98:8000
二、部署springboot项目
1、创建镜像构建文件
# 设置JAVA版本:FROM <image>:<tag>
FROM openjdk:8-jdk-alpine
# 在容器内创建一个挂载点 /logs,用于存储数据(作用不大)
VOLUME /logs
# ADD和COPY 二选一
# 用于将本地文件或目录复制到容器中(对压缩包有解压拷贝):ADD <src> <dest>
ADD springboot-1.0.0.jar /app/app.jar
# 入口点, 执行JAVA运行命令(app.jar在/app目录下)
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
2、构建镜像
docker build -t ImageName:TagName [-f filename] dir
# 示例
docker build -t spring-boot:1.0.0 -f dockerfile_boot .
# 构建镜像的模版
docker build -t ImageName:TagName dir
# 选项:
# -t - 提到镜像的标签。
# ImageName - 这是您要为镜像指定的名称。
# TagName - 这是您要为镜像指定的标签。
# dir - Dockerfile所在的目录。
3、docker运行容器,指定构建的镜像springboot
3-1、模版命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# option 作用,如下部分:
# -d 守护进程,后台运行该容器
# -p 指定端口映射,格式:主机(宿主)端口:容器端口
3-2、运行容器,指定镜像、容器名、端口号的示例
# 8001:8001 -> 前者是宿主机端口(外网访问端口),后者是容器需暴露的端口(项目端口)
docker run -d -p 8001:8001 --name spring-boot --privileged=true spring-boot:1.0.0
# 执行成功后,访问
http://121.5.167.170:8001/k8s/
3-3、docker方式进入、停止和删除容器
# 进入容器(不能使用/bin/sh,制作的镜像是精简版的,只装了sh命令,未安装bash)
sudo docker exec -it e8fc82f0567f /bin/sh
# 列出运行中的容器( -n 1 指最近1个创建的容器)
docker ps -n 1
# 停止或启动容器(如下图)
docker stop 容器ID/容器名称 -> docker stop e8fc82f0567f /spring-boot
# 用来删除一个或者多个已经停止的 Docker容器
docker rm 容器ID/容器名称
# 用于删除本地一个或多个 Docker镜像
docker rmi 镜像ID(IMAGE ID)
4、k8s运行容器,指定构建的镜像springboot
4-1、springboot-deploy.yaml 配置Pod
sudo tee /app/spring/springboot-deploy.yaml <<EOF
apiVersion: apps/v1 # 指定deployment的api版本
kind: Deployment # 指定创建资源的角色/类型
metadata: # 指定Deployment的元数据
name: spring-boot-deploy # 创建名为spring-boot-deploy的Deployment
namespace: yabin
labels: # 指定Deployment的标签(可自定义多个),随意自定义即可,无需匹配其他
app: spring-boot-app
spec: # Deployment的资源规格
replicas: 1 # Deployment将创建1个Pod副本(默认为 1)
selector: # 定义Deployment管理的Pod,必须与Pod的template模板中定义的标签保持一致
matchLabels:
app: spring-boot-app # 匹配标签标识
template: # 指定Pod模板
metadata: # 指定Pod的元数据(当前标签是template下级标签)
labels: # 指定Pod的标签(可自定义多个)
app: spring-boot-app
spec: # Pod的资源规格
containers: # 指定Pod运行的容器信息
- name: spring-boot-app # 指定Pod中运行的容器名
image: spring-boot:1.0.0 # 指定Pod中运行的容器镜像与版本(不指定镜像版本号则默认为latest)
ports:
- containerPort: 80 # 指定容器的端口(即Nginx默认端口)
EOF
4-2、对资源文件进行配置
kubectl apply -f springboot-deploy.yaml
4-3、springboot-svc.yaml配置Pod
sudo tee /app/spring/springboot-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: spring-boot-service # svc名称,对应 kubectl get svc的name
namespace: yabin # 命名空间,没有可以删除,默认是default
labels:
app: spring-boot-app
spec:
selector:
app: spring-boot-app # 关联容器标签,请求发到app一样的pod中
ports:
- port: 8001 ## 容器端口(项目指定的端口号)
protocol: TCP
nodePort: 30002 # nodeport映射为30002端口,便于外部主机访问
type: NodePort # svc类型为nodeport
EOF
4-4、对资源文件进行配置
kubectl apply -f springboot-svc.yaml
4-5、访问地址
http://121.5.167.170:30002/k8s/
4-6、kubectl方式进入容器
kubectl exec -it podName -n yabin -- /bin/sh
podName:kubectl get pod -A 对应的name