常用命令
2022/5/12
kubectl describe: 查看资源详细信息,包括构建状态
kubectl describe pod -l job-name=pytorchjob-horovod-waymo
kubectl create: 通过配置文件名或stdin创建一个集群资源对象。支持JSON和YAML格式的文件。
kubectl create -f https://raw.githubusercontent.com/kubeflow/training-operator/master/examples/pytorch/simple.yaml
kubectl apply: 类似create,不过创建后还可以继续更新
K8s查看集群信息及基本命令
(基本在Master节点操作):
查看当前所有的集群
kubectl config get-clusters
查看集群信息
kubectl cluster-info
查看Node状态
kubectl get nodes
kubectl get node IP //节点IP可以用空格隔开写多个
查看Service信息
kubectl get service
查看所有namespace内资源
kubectl get pods --all-namespaces
或者
kubectl get pods -A
kubectl是管理k8s集群的命令行工具,可通过kubectl进行创建、查看、管理的操作。
- 查看版本信息 client为kubectl版本, server为master节点的k8s版本信息
kubectl version -o json
错误提示:The connection to the server localhost:8080 was refused - did you specify the right host or port
解决:mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(chown命令:设置所有者,例如:把 /var/run/httpd.pid 的所有者设置 root:chown root /var/run/httpd.pid
) - kubectl run 创建资源,多副本创建
K8s介绍:
背景介绍:
三种应用部署方式:
(1)传统部署:直接部署在物理机上,机器资源分配不好控制,出现Bug时,有可能某个应用占据机器大部分资源,阻碍其他应用的正常运行。无法实现应用隔离。
(2)虚拟机部署:
单个物理机上运行多个虚拟机,每个虚拟机都是完整独立的系统,性能损耗大。
(3)容器化部署:
所有容器共享主机系统,轻量级虚拟机,资源隔离,CPU和内存按需分配,性能损耗小。
1. 什么是k8s,以及何时使用?
当应用在单台机器上运行即可时,直接docker+docker-compose就够;
当应用需要跑在3,4台机器上时,还可每台机器单独配置运行环境+负载均衡器;
当应用需要跑在十几台、上百、上千台机器时,每次加机器、软件更新、版本回滚会很麻烦(都是重复性工作),此时可用kubernetes实现。
kubernetes提供集中式管理集群机器和应用,加机器、版本升级、版本回滚,只是一个命令的事,不停机的灰度更新,确保高可用、高性能、高扩展。
k8s集群架构:
其中Master为主节点,不需要很高性能,通常一个即可,也可开多个来提高集群可用度。
worker为工作节点,可为虚拟机或物理计算机,任务在worker上运行,性能要好,有多个,由master管理。
2. 什么是pod:
k8s调度、管理的最小单位,一个pod可包含一个或多个容器,每个pod有自己的虚拟IP。一个工作节点worker可有多个pod,主节点master会考量负载自动调度pod到哪个节点运行。
对于具体应用而言,pod是他们的逻辑主机,pod包含业务相关的多个应用容器。
知识点:
(1)、每个pod都有唯一一个IP地址,在pod中的每个容器共享网络命名空间(包括IP地址和网络端口)以及IPC(inter-process communication, 进程间通信)命名空间,还是用共享卷(shared volume)。同一个pod中的多个容器可通过localhost相互通信,pod中的容器与pod外的实体进行通信时,需要通过端口等共享的网络资源。
(2)、pod中所有的容器可访问共享存储卷,允许这些容器共享数据。存储卷也允许在pod中持久化数据,防止其中的容器需要被重启。
一个容器一个进程-----更细粒度的容器可以方便团队复用。
同一pod中的容器通信
1. 同一pod中的容器共享存储卷
一个标准的同一pod内容器共享存储卷的用例是一个容器往共享存储卷里写入数据,其它的则从共享目录里读取数据
apiVersion: v1
kind: Pod
metadata:
name: mc1
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: 1st
image: nginx
volumeMounts:
- name: aaa
mountPath: /usr/share/nginx/html
- name: 2nd
image: debian
volumeMounts:
- name: html
mountPath: /html
command: ["/bin/sh", "-c"]
args:
- while true; do
date >> /aaa/index.html;
sleep 1;
done
示例定义一个名为aaa的存储卷,emptyDir类型;当一个pod在一个节点上创建时,它就被分配,只要pod一直运行在这个节点上它就一直存在(emptyDir生命周期和pod相同)。容器运行一个nginx server并挂载到/user/share/nginx/html,第二个容器使用了Debian镜像并把emptyDir挂载到/html.每一秒,第二个容器就会把当前日期写入到共享存储卷的index.html里. 当用户发起一个http请求,nginx就会读取它并响应给用户。
将nginx端口暴露出去,然后通过浏览器查看或查看共享目录里的文件来检测上述是否有效果:
2.进程间通信(IPC)
同一个pod中的容器共享IPC命名空间,可通过进程间通信的手段来进行通信,比如使用SystemV semaphores或者POSIX共享内存。
如下示例,定义一个包含两个容器的pod,容器1为生产者,创建一个标准的linux消息队列,写一些随机消息,然后写一个特殊的退出消息,容器2为消费者,打开同一个消息队列来读取数据直到读到退出消息,重启策略设为Never,当两个pod都中止的时候pod停止:
存在一个问题,就是生产者所在容器要早于消费者所在容器,我们必须处理容器的启动顺序问题。
容器的依赖关系和启动顺序
目前,同一pod中所有容器是并行启动的,因此对于IPC示例,无法总是保证第一个容器早于第二个容器启动,此时需要使用初始化容器(init container)来保证启动顺序。
同一pod的容器间网络通信
同一pod下的容器使用相同的网络名称空间,这就意味着他们可以通过’localhost’来进行通信,它们共享同一个Ip和相同的端口空间
同一个pod暴露多个容器
通常pod里的容器监听不同的端口,想要被外部访问都需要暴露出去.你可以通过在一个服务里暴露多个端口或者使用不同的服务来暴露不同的端口来实现
分布式训练:
一台机器上多个pod实现多机多卡的深度学习分布式训练