本文目录结构
容器部署方式 命令运行容器。
1 kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
Pod,编辑pod.yaml内容如下。(一切皆文件是 Unix/Linux 的基本哲学之一,K8s继承了这个传统)
1 2 3 4 5 6 7 8 9 apiVersion: v1 kind: Pod metadata: name: test-pod spec: # 定义容器,可以多个 containers: - name: test-k8s # 容器名字 image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像
Deployment,编辑Deployment.yaml内容如下。以下文件描述了运维工程师对线上服务的期望,并把线上的服务状态、副本、镜像源都转为配置文件进行描述,其优势所见即所得,且此配置文件可以分享给其他运维工程师重复利用或了解当前服务的配置情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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运行deployment.yaml文件
1 2 kubectl apply -f deployment.yaml kubectl get pods
关于kind相关参数:
Deployment:适合无状态应用,所有pod等价,可替代;
StatefulSet:有状态的应用,适合数据库这种类型;
DaemonSet:在每个节点上跑一个 Pod,可以用来做节点监控、节点日志收集等;
Job & CronJob: Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。
关于kubectl常用命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # 部署应用 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 容器终端, -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
查看资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 kubectl get pods NAME READY STATUS RESTARTS AGE djnode-7f5b68c9c5-76499 1/1 Running 0 2d21h djnode-7f5b68c9c5-9wbcp 1/1 Running 0 2d21h djnode-7f5b68c9c5-bjrz5 1/1 Running 0 2d21h djnode-7f5b68c9c5-k8hth 1/1 Running 0 2d21h djnode-7f5b68c9c5-zkdt9 1/1 Running 0 2d21h hello-minikube-ffb56594b-wsrl6 1/1 Running 0 3d1h mongodb-0 1/1 Running 0 23h mongodb-1 1/1 Running 0 23h mongodb-2 1/1 Running 0 23h test-k8s-5b8f9cd8d9-564kf 1/1 Running 0 3d test-k8s-5b8f9cd8d9-zksbw 1/1 Running 0 3d test-pod 1/1 Running 0 3d testapp 1/1 Running 0 3d
删除所有资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [root@VM-1-127-centos ~]# kubectl delete all --all pod "djnode-7f5b68c9c5-76499" deleted pod "djnode-7f5b68c9c5-9wbcp" deleted pod "djnode-7f5b68c9c5-bjrz5" deleted pod "djnode-7f5b68c9c5-k8hth" deleted pod "djnode-7f5b68c9c5-zkdt9" deleted pod "hello-minikube-ffb56594b-wsrl6" deleted pod "mongodb-0" deleted pod "mongodb-1" deleted pod "mongodb-2" deleted pod "test-k8s-5b8f9cd8d9-564kf" deleted pod "test-k8s-5b8f9cd8d9-zksbw" deleted pod "test-pod" deleted pod "testapp" deleted service "djnode" deleted service "hello-minikube" deleted service "kubernetes" deleted service "mongodb" deleted deployment.apps "djnode" deleted deployment.apps "hello-minikube" deleted deployment.apps "test-k8s" deleted replicaset.apps "hello-minikube-ffb56594b" deleted statefulset.apps "mongodb" deleted
关于Deployment的更多介绍见 https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
应用案例 部署一个 nodejs应用案例,其中app.js内容如下:
1 2 3 4 5 6 7 8 9 10 const http = require('http'); const os = require('os'); console.log("Kubia server starting..."); var handler = function(request, response) { console.log("Received request from " + request.connection.remoteAddress); response.writeHead(200); response.end("This is v1 running in pod " + os.hostname() + "\n"); }; var www = http.createServer(handler); www.listen(8080);
Dockerfile的内容如下:
1 2 3 FROM node:7 ADD app.js /app.js ENTRYPOINT ["node", "app.js"]
生成镜像。
1 2 cd ./image docker build -t djnode .
可以启动镜像测试一下。
1 docker run --name test -p 8080:8080 -d djangowang77/djnode:v1
将镜像推到远程仓库(默认推到海外仓库有时网络不稳定,所以推荐腾讯云的tcr)
1 2 3 docker tag djnode djangowang77/djnode:v1 docker push djangowang77/djnode:v1
k8s拉群镜像。
1 kubectl run djnode --image=djangowang77/djnode:v1
将端口暴露到本机。
1 kubectl port-forward pod-name 8080:8080
将端口暴露在0.0.0.0。
1 kubectl port-forward --address 0.0.0.0 pod-name 8080:8080
这时可以在浏览器访问80端口,会显示出nodejs输出的内容。