前提:已经部署镜像到Docker
在项目发布目录下新建.yaml文件,内容如下(以下仅举例出两种方式内容,可按需自由配置)
--方式一(创建deployment 、服务、指定命名空间)
# ------------------- 注意层级结构,层级不对构建会报错 ------------------- #
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-api-demo
namespace: k8s-api
labels:
k8s-app: k8s-api-demo
spec:
replicas: 1
selector:
matchLabels:
k8s-app: k8s-api-demo
template:
metadata:
labels:
k8s-app: k8s-api-demo
spec:
containers:
- name: k8s-api-demo
image: demoapifordocker # 定义Pod启动的容器镜像地址
imagePullPolicy: IfNotPresent # k8s默认值为Always,总是从远端拉取镜像,通过设置IfNotPresent或Never来使用本地镜像
ports:
- containerPort: 80
---
# ------------------- Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: k8s-api-demo
name:k8s-api-demo
namespace: k8s-api
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
k8s-app: k8s-api-demo
在发布目录按住shift+加右键打开powerShell,按顺序执行以下命令
--创建yaml文件中的命名空间
kubectl create namespace k8s-api
--根据yaml配置文件构建
kubectl create -f 文件名.yaml
到这一步如果没有报错信息,那就已经完成部署
--查看端口,http://localhost:端口号
kubectl get svc -n k8s-api
--查看容器运行状态
kubectl get pod -n k8s-api
映射到本机端口访问(port-forward 对应pod名称)
kubectl port-forward k8s-api-68bbbbc657-cqzjn -n k8s-api 8091:80
但对于外部依旧无法访问,如果需要暴露供外部直接访问,则需要创建 service
kubectl expose pod k8s-api-pod --name k8s-api-service --type=NodePort
获取服务
kubectl get service
服务会有一个CLUSTER-IP,可以在集群内使用CLUSTER-IP:80
来访问该服务,如果是在集群外部,可以使用NodeIP:端口
(节点所在服务器IP)来访问。
--方式二
直接构建pod
apiVersion: v1
kind: Pod # 定义Kubernetes资源的类型为Pod
metadata:
name: k8s-api-pod # 定义资源的名称
labels: # 为Pod贴上标签,后面会介绍其用处
app: k8s-api-pod
spec: # 定义资源的状态,对于Pod来说,最重要属性就是containers
containers: # containers一个数组类型,如果你希望部署多个容器,可以添加多项
- name: coreapi # 定义本Pod中该容器的名称
image: demofordocker # 定义Pod启动的容器镜像地址
imagePullPolicy: IfNotPresent # k8s默认值为Always,总是从远端拉取镜像,通过设置IfNotPresent或Never来使用本地镜像
ports:
- containerPort: 80 # 定义容器监听的端口(与Dockerfile中的EXPOSE类似,只是为了提供文档信息)
livenessProbe: # 存活探针定义
httpGet:
path: /swagger/index.html # 存活探针请求路径
port: 80 #存活探针请求端口
在发布目录按住shift+加右键打开powerShell,按顺序执行以下命令
kubectl create -f 文件名.yaml
(构建在默认命名空间(default)下)
kubectl get pod
映射到本机端口访问(port-forward 对应pod名称)
kubectl port-forward k8s-api-68bbbbc657-cqzjn -n k8s-api 8091:80
但对于外部依旧无法访问,如果需要暴露供外部直接访问,则需要创建 service
kubectl expose pod k8s-api-pod --name k8s-api-service --type=NodePort
获取服务
kubectl get service
服务会有一个CLUSTER-IP,可以在集群内使用CLUSTER-IP:80
来访问该服务,如果是在集群外部,可以使用NodeIP:端口
(节点所在服务器IP)来访问。
部署遇到的一些问题
--get deploymentment获取不到
后面加 -n kube-system
--命名空间查询: kubectl get namespace
--部署后运行失败,pod状态显示 ImagePullBackOff或者ErrPullOff
这种情况是因为yaml文件中未配置从本地镜像获取,导致去线上拿;需要删除后重新开始
可通过执行以下命令查看pod Events中记录的错误记录,默认命名空间下可省略 -n 命名空间名
kubectl describe pod pod名称 -n 命名空间名
--删除pod
kubectl delete pod pod名 -n 命名空间名
直接执行删除pod指令,会发现删除之后还是又会产生一个新的,实际上删除对应deployment即可
查询deployment
kubectl get deployment -n 命名空间名
删除deployment
kubectl delete deployment deployment名 -n 命名空间名
此时再查询命名空间下pod,可以看到已经没有了
参考以下文章:
.NET Core + K8S 玩转容器编排 - 「圣杰」 - 博客园 (cnblogs.com)
(二)搭建dotNetCore项目发布到k8s - 一滴雨、₯㎕ - 博客园 (cnblogs.com)
k8s中正确删除一个pod - effortsing - 博客园 (cnblogs.com)
k8s 创建删除命名空间--namespace_k8s create --names-CSDN博客