k8s基础
# k8s基础
# 链接资料
https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY (opens new window)
# 常用命令
# 部署应用
kubectl apply -f app.yaml
# 查看 deployment 中所有的信息
kubectl get deployment
# 查看 pod
kubectl get pod -o wide
# 查看 pod 详情
kubectl describe pod pod-name
kubectl describe service/
# 查看 log 加-f实时查看 # tail -f app.log 实时查看app.log文件
kubectl logs pod-name
# 进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。
kubectl exec -it pod-name -- bash
# 伸缩扩展副本,调整副本的数据,限制成5个 --replicas=5
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
# 删除部署ku
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
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
37
38
39
40
41
42
43
44
45
46
47
48
- minikube 只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起
启动命令
minikube start --kubernetes-version=v1.23.8
# 查看节点。kubectl 是一个用来跟 K8S 集群进行交互的命令行工具
kubectl get node
# 停止集群
minikube stop
# 清空集群
minikube delete --all
# 安装集群可视化 Web UI 控制台
minikube dashboard
2
3
4
5
6
7
8
9
10
11
12
13
14
https://github.com/gzyunke/test-k8s.git (opens new window)
# 1、部署pod应用 YAML 文件方式
方式一:
kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
方式二:
kubectl apply -f pod.yaml
# app.yaml 文件
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
# 定义容器,可以多个
containers:
- name: test-k8s # 容器名字
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像
2
3
4
5
6
7
8
9
10
方式三:deployment创建多个pod
Deployment 通过 label 关联起来 Pods
kubectl apply -f pod.yaml
# app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
# 部署名字
name: test-k8s
spec:
replicas: 2 # 2个pod
# 用来查找关联的 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 # 镜像
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 2、Service
特性
Service 通过 label 关联对应的 Pod
Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
提供了负载均衡功能,自动转发流量到不同 Pod
可对集群外部提供访问端口
集群内部可通过服务名字访问
其实就是通过service访问pod(因为pod要改变ip)service固定ip,通过service转发到pod提供负载均衡
创建pod,然后通过label和service关联上
# 3、StatefuSet
什么是 StatefulSet
StatefulSet 是用来管理有状态的应用,例如数据库。 前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。 而像数据库、Redis 这类有状态的,则不能随意扩充副本。 StatefulSet 会固定每个 Pod 的名字
# StatefulSet 特性
Service 的
CLUSTER-IP
是空的,Pod 名字也是固定的。Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。
Pod 重建不会改变名字,除了IP,所以不要用IP直连
# 命名空间
如果一个集群中部署了多个应用,所有应用都在一起,就不太好管理,也可以导致名字冲突等。 我们可以使用 namespace 把应用划分到不同的命名空间,跟代码里的 namespace 是一个概念,只是为了划分空间。
# 创建命名空间
kubectl create namespace testapp
# 部署应用到指定的命名空间
kubectl apply -f app.yml --namespace testapp
# 查询命名空间下的所有pod
kubectl get pod --namespace kube-system
kubectl get ns # 查看所有的命名空间
2
3
4
5
6
7
8
可以用 kubens (opens new window) 快速切换 namespace
# 切换命名空间
kubens kube-system
# 回到上个命名空间
kubens -
# 切换集群
kubectx minikube
2
3
4
5
6
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-label-k8s
# 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
# type: ClusterIP
# type: NodePort
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
# nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767
# 1、先执行上面的app.yaml文件创建pod,然后通过test-k8s标签连接
# 2、如果选择了NodePort,需要在下面加上nodePort端口,通过开放的31000端口访问
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在整个的生命周期中,Pod会出现5种状态(相位),分别如下:
● 挂起(Pending):apiserver已经创建了pod资源对象,但他尚未被调度完成或者仍处于下载镜像的过程中。
● 运行中(Running):Pod已经被调度至某节点,并且所有容器都已经被kubectl创建完成
● 成功(Succeeded):Pod中的所有容器都已经成功终止并且不会重启
● 失败(Failed):所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值得退出状态
● 未知(Unknown):apiServer无法正常获取到pod对象的状态信息,通常由网络通信失败所导致
————————————————
版权声明:本文为CSDN博主「Hud.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42309691/article/details/124134236
2
3
4
5
6
7
8
9
10
11
12
13
14
# job限制Pod的时长
apiVersion: batch/v1
kind: Job
metadata:
name: job-2
# namespace: gzqid
spec:
backoffLimit: 0 # 重试0次
activeDeadlineSeconds: 20 # 到达指定时长,Job 创建的所有的 Pod 都将被终止,然后下面的ttlSecondsAfterFinished就会删除job
ttlSecondsAfterFinished: 0 # 则 TTL 控制器在 Job 执行结束后,立刻就可以清理该 Job 及其 Pod
template:
spec:
containers:
- name: pi
# image: perl
# image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
image: xdasd123sad
# command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18