部署应用到k8s集群 电脑版发表于:2022/6/3 18:25 ### 部署一个简单的应用 使用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**  ### 查看pod运行状态: ``` kubectl get pod ``` 详细一点的: ``` kubectl get pod -o wide ``` 效果如下:  还可以使用如下命令查看 deployment ``` kubectl get deployment ```  如果跑起来后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运行成功效果如下  ### 进行端口映射,让外部可以访问 ``` kubectl port-forward pod/pod-name 8080:8080 ``` tn2>这样可能会出现只能localhost访问无法外部访问的问题,可以使用下面的方法解决 ### 无法访问虚拟机8080问题  虚拟机跑上了,本地能使用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  ### 部署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 变了,名字也变了