TNBLOG
首页
博客
视频
资源
问答
猿趣
手机
关于
搜索
收藏
便签
笔记
消息
创作
登录
剑轩
故如虹,知恩;故如月,知明
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
CSS
15篇
微服务
41篇
Git
14篇
.NET
102篇
移动开发
33篇
软件架构
23篇
.NET Core
119篇
.NET MVC
11篇
英语
3篇
随笔
86篇
Bootstrap
3篇
Redis
21篇
编辑器
10篇
Js相关
15篇
虚拟化
8篇
更多
Oracle
7篇
Python
14篇
数据库
26篇
EF
17篇
微信
3篇
前端
151篇
消息队列
6篇
docker
41篇
多线程
1篇
Java
4篇
软件基础
2篇
C++
2篇
WCF
7篇
Linux
7篇
nginx
5篇
K8S
9篇
ABP
2篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术
原
部署应用到k8s集群
3078
人阅读
2022/6/3 18:25
总访问:
3913325
评论:
1
收藏:
0
手机
分类:
K8S
### 部署一个简单的应用 使用Deployment部署: 创建一个app.yaml ``` apiVersion: apps/v1 kind: Deployment metadata: # 部署名字 name: test-k8s spec: replicas: 2 # 用来查找关联的 Pod,所有标签都匹配才行 selector: matchLabels: app: test-k8s # 定义 Pod 相关数据 template: metadata: labels: app: test-k8s spec: # 定义容器,可以多个 containers: - name: test-k8s # 容器名字 image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像 ``` 部署: ``` kubectl apply -f app.yaml ``` **Deployment 通过 label 关联起来 Pods** ![](https://img.tnblog.net/arcimg/aojiancc2/4ae7967ad7a74ef0886125e2f64d57b2.png) ### 查看pod运行状态: ``` kubectl get pod ``` 详细一点的: ``` kubectl get pod -o wide ``` 效果如下: ![](https://img.tnblog.net/arcimg/aojiancc2/fde516c063ae4ee0afa001e9d7070f40.png) 还可以使用如下命令查看 deployment ``` kubectl get deployment ``` ![](https://img.tnblog.net/arcimg/aojiancc2/1f72249425df4e91b651a4ff03ae2625.png) 如果跑起来后ready运行状态没有启动起来可以使用下面的方法查看pod详情 ### 查看pod详情: kubectl describe pod/pod-name #### 报错:open /run/flannel/subnet.env: no such file or directory 在每个节点创建文件/run/flannel/subnet.env写入以下内容 ``` FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.0.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true ``` ##### 然后删除运行的deployment: kubectl delete deployment test-k8s ##### 删除之后重新执行命令: ``` kubectl apply -f app.yaml ``` tn2>也不一定非要删除deployment重新执行命令创建Pod,可以等一会看看状态是否正常,如果正常了,就不需要删除后,重新创建了。特别是本地虚拟机创建的测试环境,以前创建过一次这个文件,因为某些原因,重新啥的造成的文件不存在了,创建一下等一会就好了,不要删除后重新创建。还有要注意是每个节点都需要创建哦,不是单个,具体使用kubectl describe pod/pod-name查看错误详情。 #### 报错: /run/flannel/subnet.env is missing FLANNEL_NETWORK, FLANNEL_IPV6_NETWORK 其实也是subnet.env文件配置错了,复制内容的时候复制错了就会出现这种错误。具体可以查看 https://www.tnblog.net/aojiancc2/article/details/7357 ### pod运行成功效果如下 ![](https://img.tnblog.net/arcimg/aojiancc2/611d2cbf3a8b4cd489ce059f38bd83c7.png) ### 进行端口映射,让外部可以访问 ``` kubectl port-forward pod/pod-name 8080:8080 ``` tn2>这样可能会出现只能localhost访问无法外部访问的问题,可以使用下面的方法解决 ### 无法访问虚拟机8080问题 ![](https://img.tnblog.net/arcimg/aojiancc2/860f845ed8bb4b86866fb45869e241b4.png) 虚拟机跑上了,本地能使用curl访问,但是宿主机使用虚拟机的ip+端口访问不到。 tn2> localhost是只能本地端口访问,把监听地址改成0.0.0.0就可以了 **在做端口映射的时候增加一个--address 把地址加一下就可以了** ``` kubectl port-forward --address 0.0.0.0 pod/pod-name 8080:8080 ``` address 0.0.0.0 K8S会监听任何地址就没有问题了 **当然如果还不行的话可以考虑一下部署的应用本身的ip地址与端口问题** 比如下面的一个简单的nodejs服务监听。 localhost是只能本地端口访问,把监听地址改成0.0.0.0就可以外部访问了。当然一般只需要在端口映射的时候设置address 0.0.0.0就行了,不行的话才去考虑部署的应用本身的访问限制。 ``` // 监听地址不要写成127.0.0.1或者localhost var server = app.listen(8081, '127.0.0.1', function () { var host = server.address().address; var port = server.address().port; console.log("地址为 http://%s:%s", host, port); }); //监听地址写成0.0.0.0 var server = app.listen(8081, '0.0.0.0', function () { var host = server.address().address; var port = server.address().port; console.log("地址为 http://%s:%s", host, port); }); ``` ### 查看pod运行日志 kubectl logs pod/pod-name ![](https://img.tnblog.net/arcimg/aojiancc2/d90d13cf71e846de954bbf663783f25b.png) ### 部署nginx应用 部署命令: ``` kubectl run nginx --image=nginx:latest ``` 转发一下,让外部可以访问: ``` kubectl port-forward --address 0.0.0.0 pod/nginx 80:80 #将本机80端口转发至Pod的80端口 ``` ### 常用命令 ``` # 部署应用 kubectl apply -f app.yaml # 查看 deployment kubectl get deployment # 查看 pod kubectl get pod -o wide # 查看 pod 详情 kubectl describe pod pod-name # 查看 log kubectl logs pod-name # 查询pod的spec kubectl get pod nginx-deploy-7db697dfbd-2qh7v -o yaml #使用 -o 参数 加yaml,可以将资源的配置以 yaml的格式输出出来,也可以使用json,输出为json格式 # 进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。 kubectl exec -it pod-name -- bash # 伸缩扩展副本 kubectl scale deployment test-k8s --replicas=5 # 把集群内端口映射到节点 kubectl port-forward pod-name 8090:8080 # 查看历史 kubectl rollout history deployment test-k8s # 回到上个版本 kubectl rollout undo deployment test-k8s # 回到指定版本 kubectl rollout undo deployment test-k8s --to-revision=2 # 删除部署 kubectl delete deployment test-k8s ``` 更多命令 ``` # 查看全部 kubectl get all # 重新部署 kubectl rollout restart deployment test-k8s # 命令修改镜像,--record 表示把这个命令记录到操作历史中 kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record # 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置 kubectl rollout pause deployment test-k8s # 恢复 kubectl rollout resume deployment test-k8s # 输出到文件 kubectl get deployment test-k8s -o yaml >> app2.yaml # 删除全部资源 kubectl delete all --all ``` ### 现存的问题 - 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod - 访问还需要端口转发 - Pod 重创后 IP 变了,名字也变了
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}