将容器部署到集群中

本文目录结构

容器部署方式

命令运行容器。

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输出的内容。