更新时间:2022-12-21 10:27:32 来源:极悦 浏览904次
kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署.
K8s 的 Apiserver 是集群控制的入口,k8s 集群管理要在 master 节点进行,即访问部署的 Apiserver。kubectl 命令默认访问本机的 Apiserver 的 8080 端口。假如在 k8s 启动了 kubelet 服务的node 节点,想使用 k8s 集群管理命令操作。会提示如下:
1.node 节点管理
(1)查看节点
$ kubectl get no/nodes
(2)删除一个节点前,先驱赶掉上面的pod
$ kubectl drain slave2 --delete-local-data
(3)删除slave2节点,这个节点如果从新启动kubelet服务的话,在master节点还是可以看到的该节点的
$ kubectl delete node slave2
k8s删除一个节点使用以下命令
其实以上命令是通用的,可以进行任何资源的删除:
kubectl delete [type] [typename],type 是资源类型,可以是 node, pod, rs, rc, deployment, service 等等,typename是这个资源的名称
(4)查看资源概况
$ kubectl describe nodes
$ kubectl describe node slave1
2.namespace 命名空间管理
命名空间是一个抽象出来的概念,在一个命名空间中,pod名称不允许重复。这个命名空间如果我们把他想象成我们的环境可能更好理解。我们的微服务项目需要部署到开发、测试、生产环境等。那这时候我们就可以定义3个命名空间为 dev、test、product。每个环境都要部署一套微服务容器。Pod名称在不同的 namespace 中是相同的。或者也可以把 Namespace 和 Pod 理解成数据库和表的关系。
(1)查看命名空间
(2)创建命名空间
方式1:使用命令创建
[root@master local]# kubectl create namespace esign-dev
namespace "esign-dev" created
方式2:配置文件创建命名空间
编辑配置文件:namespace-test.yaml
apiVersion: v1 #api版本号
kind: Namespace #指定类型为Namespace
metadata: #元数据描述
name: test #指定namespace名称
创建namespace
[root@master local]# kubectl apply -f ./namespace-test.yaml
namespace "test" created
(3)删除命名空间
删除命名空间时会同时删除该空间下所有资源,就好像数据库和表的关系。开发中要谨慎操作,同时系统命名空间不会被删除
3.pod 资源管理
(1)Pod 生命周期
pod生命周期:
Pending:API Server已经创建了该Pod,但Pod中的一个或多个容器的镜像还没有创建,包括镜像下载过程
Running:Pod内所有容器已创建,且至少一个容器处于运行状态、正在启动状态或正在重启状态
Completed:Pod内所有容器均成功执行退出,且不会再重启
Failed :Pod内所有容器均已退出,但至少一个容器退出失败
Unknown:由于某种原因无法获取Pod状态,例如网络通信不畅
pod失效时的重启策略:
Always:当容器失效时,立马由kubelet自动重启该容器
OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器
Never:不论容器运行状态如何,kubelet都不会重启该容器
*对于Always这种策略,容器只要挂了,就会立即重启,这样是很耗费资源的。所以Always重启策略会这么做:第一次容器挂了立即重启,如果再挂了就要延时10s重启,第三次挂了就等20s重启...... 依次类推
(2)创建 pod 容器
编辑 demo-rc/yaml 文件:
镜像192.168.56.104:5000/nginx,是我基于Nginx镜像重新tag,并上传到docker私服的。这样做是因为 k8s 会把构建的 Pod 随机分配到 node节点去处理,无论是哪个 node去构建 Pod都要能保证能拉到镜像,所以必须用私服统一管理镜像。
镜像拉取策略 imagePullPolicy:
Always - 每次都要从私服pull
IfNotPresent - 本地有就不从私服拉(这是默认值)
Never - 从不pull
关于镜像拉取,Pod 构建 docker 容器时,会执行docker pull 将镜像从私服拉到本地。且其默认执行策略是如果本地有就不再pull。所以如果我们用jenkins构建应用服务时,首先需要将镜像上传到私服,且 Pod 的执行策略也必须是每次都要从私服Pull,否则它Pull 一次之后。将不再拉取最新构建的镜像。
apiVersion: v1 #描述的是Api版本
kind: Pod #指定的是Pod类型
metadata: #描述该Pod的元数据信息
name: nginx #Pod名称
namespace: esign-dev #指定该Pod所属的命名空间,这个命名空间需要提前创建好。否则报错
labels:
owner: jpjinga #给Pod添加自定义标签,key、value都是自定义
spec:
containers:
- name: nginx
image: 192.168.56.104:5000/nginx:latest
imagePullPolicy: Always #一直从远程仓库拉取
ports:
- containerPort: 80 #容器端口
hostPort: 8081 #映射的主机端口
name: web
protocol: TCP
创建并启动 pod
获取Pod
kubectl get po -n esign-dev #获取指定命名空间的Pod资源
kubectl get po --all-namespaces -o wide #获取所有命名空间的Pod资源
我们看一下Pod启动后的具体信息:
kubectl describe pod nginx -n esign-dev
我们切换到主机名为 slave1(192.168.56.102)的节点,查看运行容器。可以发现 k8s 运行的是一个Pod基础容器,我们在上一篇搭建k8s集群node节点时,配置过这个Pod基础镜像。Pod是K8s管理的最小单元。在这个Pod里运行的是Nginx容器。主机对Pod内部容器的端口映射是:8081->80。
我们用浏览器来访问一下这个Nginx,可以看到访问正常。
(3)查看容器运行状态
ready:Pod准备情况,准备就绪/Pod包含容器的总数目
restarts:Pod重启次数
age:Pod存活时间
(4)查看Pod详细信息
说明:查看的pod所属命名空间namespace != dufault 时,需要-n 指定其命名空间才可以看到
kubectl describe pod [podname] -n [namespace]
(5)更新Pod
更新:
kubectl replace -f demo-rc.yaml
由于Pod的很多属性没办法修改,比如容器镜像,这时候可以采用--force参数
kubectl replace --force -f demo-ng.yaml
看运行效果,就相当于删掉后重新构建了一个Pod:
(6)进入Pod中的容器
命名空间非默认时需要-n 指定
如果Pod内部只有一个容器,不需要指定 -c ,默认进入第一个容器。
kubectl exec -it [pod-name] -n [namespace] -c [container-name] /bin/bash
(7)Pod与标签
添加标签
kubectl label pod [podname] -n [namespace] key=value #指定pod,添加自定义标签
查询Pod时,展示标签内容:
(8)删除Pod
-n 删除指定命名空间下的Pod容器
如不指定,则删除的是 namespace=default 下的Pod容器
kubectl delete pod [podname] -n [namespace] # 删除一个Pod
kubectl delete pod --all -n [namespace] # 删除所有Pod
(9)查看容器日志,参数-f 可以监控实时日志
kubectl logs [-f] -n [namespace] [podName] -c [containerName]
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习