


部署一个简单的应用
使用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
也不一定非要删除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
这样可能会出现只能localhost访问无法外部访问的问题,可以使用下面的方法解决
无法访问虚拟机8080问题
虚拟机跑上了,本地能使用curl访问,但是宿主机使用虚拟机的ip+端口访问不到。
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 变了,名字也变了
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)