K8S基本使用

pod创建

K8s集群的最小单位是pod,一个pod里面可以包含多的容器,通常以yaml文件去创建pod,也可以使用run命令直接创建

  1.  
    创建pod:命令格式: kubectl create –f [yaml文件]
  2.  
     
  3.  
    使用RUN命令直接创建:命令格式:kubectl run –i –t [pod名称] –image=[镜像名称]

列1:通过ymal文件创建一个Redis-master pod

  1.  
    redis-master-controller.yaml 文件内容:
  2.  
    apiVersion: v1
  3.  
    kind: ReplicationController
  4.  
    metadata:
  5.  
    name: redis-master
  6.  
    labels:
  7.  
    name: redis-master
  8.  
    spec:
  9.  
    replicas:
  10.  
    selector:
  11.  
    name: redis-master
  12.  
    template:
  13.  
    metadata:
  14.  
    labels:
  15.  
    name: redis-master
  16.  
    spec:
  17.  
    containers:
  18.  
    - name: master
  19.  
    image: kubeguide/redis-master
  20.  
    ports:
  21.  
    - containerPort: 6379
  22.  
     
  23.  
     
  24.  
    kubectl create -f redis-master-controller.yaml

例2: 使用RUN命令直接创建

  1.  
    kubectl run -i -t busybox --image=busybox
  2.  
    kubectl run -i -t busybox --image=busybox --replicas=5
  3.  
    --replicas 指定副本数 常用参数

pod删除

命令格式: kubectl delete pod/po [pod名称]

此时虽然显示pod已经删除,但是你再次查看pod的时候会发现还是有一个名为busybox**的pod存在,这是因为k8s的安全机制,k8s保证了定义的pod副本数的恒定,加入一个pod副本数为5那么有5个pod提供服务,pod坏掉或者删除掉k8s的安全机制将检查副本数量如果pod数量少于5 那么k8s将会自动创建pod使之保持在数量为5个。

彻底删除:

  1.  
    第一种方式是重新编辑yaml文件 如果文件指定多个副本数将其改为0
  2.  
     
  3.  
    第二种方式使用 kubectl delete –f m命令

POD 查看

总体查看

命令 kubectl get pods 进行查看

相对详细信息查看

kubectl get pod -o wide

更加详细的信息

命令格式: kubectl describe [po/deploy] [名称]

pod 和deployment

pod是什么

Pod是k8s集群的最小单元,一个pod里面可以包含多的容器,那么所有属于这个pod的容器都会运行在一个节点上面。Pod封装了一个或多个应用程序的容器(比如nginx等),存储资源,唯一的网络IP以及管理容器的一些选项 Pod标示的是一个部署单元,可以理解为Kubernetes中的应用程序的单个实例,它可能由单个容器组成,也可能由少量紧密耦合并共享资源的容器组成。如果多个容器在同一Pod下他们公用一个IP所以不能出现重复的端口号,比如在一个Pod下运行两个nginx就会有一个容器异常,一个Pod下的多个容器可以使用localhost来访问对方端口应为Pod是最小的单元如果在Pod中容器出现异常终止了是不会重启,在实际使用场景下基本不会直接使用Pod而是使用Deployment部署自己的应用

deployment 是什么

在早期版本使用Replication Controller对Pod副本数量进行管理,在新的版本中官方推荐使用Deployment来代替RC,Deployment相对RC有这些好处

 特点:

Deployment拥有更加灵活强大的升级、回滚功能,并且支持滚动更新

使用Deployment升级Pod只需要定义Pod的最终状态,k8s会为你执行必要的操作(RC要自己定义如何操作)

进入到容器内部操作

K8s进入pod指令和 docker 进入容器指定类似

Docker进入容器指令为:

docker exec –it 容器ID/name sh/bash

K8s进入到pod中容器中指令:

kubectl exec –it pod-name sh/bash

拷贝一个文件到pod指定目录

命令:kubectl cp file/dir <some-pod>:某目录

service与pod or deployment

pod 与 service的关系

前面写到创建了POD,但是有了POD依然不能提供服务,此时轮到了我们service上场了,专业一点讲叫服务发布。服务发布是创建了POD或者deployment 然后还需要创建service发布出去。 关联pod和service 是通过 labels 标签实现的。为关联的准确性可以添加多个标签

例:我们创建一个redis-master的POD 然后在创建一个redis-master 的服务并发布

发布pod

  1.  
    创建pod:
  2.  
    vim redis-master-controller.yaml
  3.  
     
  4.  
    apiVersion: v1
  5.  
    kind: ReplicationController
  6.  
    metadata:
  7.  
    name: redis-master
  8.  
    labels:
  9.  
    name: redis-master
  10.  
    spec:
  11.  
    replicas:
  12.  
    selector:
  13.  
    name: redis-master
  14.  
    template:
  15.  
    metadata:
  16.  
    labels:
  17.  
    name: redis-master
  18.  
    spec:
  19.  
    containers:
  20.  
    - name: master
  21.  
    image: kubeguide/redis-master
  22.  
    ports:
  23.  
    - containerPort: 6379

发布Service

  1.  
    vim redis-master-service.yaml
  2.  
     
  3.  
    apiVersion: v1
  4.  
    kind: Service
  5.  
    metadata:
  6.  
    name: redis-master
  7.  
    labels:
  8.  
    name: redis-master
  9.  
    spec:
  10.  
    ports:
  11.  
    - port: 6379
  12.  
    targetPort: 6379
  13.  
    selector:
  14.  
    name: redis-master
  1.  
    服务的创建方式与pod相同:
  2.  
    使用 kubectl create –f [x-service.yaml]
  3.  
    kubectl create -f redis-master-service.yaml

查看服务

  1.  
    命令
  2.  
    kubectl get svc –o wide
  3.  
    服务的CLUSTER-IP 是服务的 VIP

查看详细的描述信息:

Kubectl describe svc [service-name]

销毁服务

  1.  
    service的销毁和pod的销毁方法相同
  2.  
    命令: kubectl delete –f [x-service.yaml]

注意:创建完整的容器提供服务包含 POD(Deployment)和 Services,建议Services在Pod之前创建。

Pod 副本数动态缩放

方法一 使用命令操作副本数量

例:创建一个redis-slave 应用容器 副本数量指定为2 然后通过命令进行动态扩容和缩容

  1.  
    vim redis-slave.yaml
  2.  
     
  3.  
    apiVersion: v1
  4.  
    kind: ReplicationController
  5.  
    metadata:
  6.  
    name: redis-slave
  7.  
    labels:
  8.  
    name: redis-slave
  9.  
    spec:
  10.  
    replicas: 2
  11.  
    selector:
  12.  
    name: redis-slave
  13.  
    template:
  14.  
    metadata:
  15.  
    labels:
  16.  
    name: redis-slave
  17.  
    spec:
  18.  
    containers:
  19.  
    - name: slave
  20.  
    image: kubeguide/guestbook-redis-slave
  21.  
    env:
  22.  
    - name: GET_HOSTS_FROM
  23.  
    value: env
  24.  
    ports:
  25.  
    - containerPort: 6379
  26.  
     
  27.  
    kubectl create -f redis-slave.yaml

上面的yaml文件是定义了2个pod副本,我们通过命令扩容到5个

  1.  
    使用scale命令
  2.  
    kubectl scale rc redis-slave --replicas=5

此时通过 kubectl get pod -o wide 命令去查看,你会发现有五个redis-slave pod了

缩容的方式一样 在命令里面指定  --replicas 的数量即可实现

方法2 修改配置达成缩容扩容

命令 :kubectl edit rc/deployment [rc/deployment-name]

例:修改应用配置 我们上一步将replicas 数量设置为5 现在将他改为6 保存退出验证

  1.  
    kubectl edit rc redis-slave
  2.  
     

c3adac27ae95b967199ec939c14837c8611.jpg

方法3 修改 yaml文件重构达成目的

重构命令:kubectl replace -f x.yaml

修改配置文件进行重构即可,这个是需要释放已存在的pod,然后创建新的pod的过程

查看已经构建的服务使用的端口

查看全部的包括宿主机的

命令:kubectl get endpoints

只查看rc/deploy相关的端口

kubectl get ep [rc/deploy-name]

pod的状态

使用k8s创建pod的几种状态

  1.  
    Pending:Pod已经被系统接收,准备下载镜像。
  2.  
    Running:Pod已经分配到节点,并且所有容器已创建。至少有一个容器仍在运行、正在启动或重新启动。
  3.  
    Successed:Pod中的所有容器已成功终止,不会重新启动。
  4.  
    Failed:Pod中的所有容器已终止,并且至少有一个容器已经终止。也就是说,容器退出非零状态或被系统终止。
  5.  
    Unknown:由于某种原因,无法获得Pod状态,通常是由于与Pod所在主机通信时出现错误。

Namespace

查看所有namespace

命令:kubectl get namespace/ns(ns 为简写)

注:我们的在未指定namespace创建Pod 会默认使用default 这个命名空间

给pod指定namespace

在给pod指定之前我们k8s集群默认是只有default 这个命名空间,所以我们如果使用其他命名空间需要先创建命名空间

例: 创建一个名为mynamespace的命名空间

  1.  
    cat mynamespace.yaml
  2.  
     
  3.  
    apiVersion: v1
  4.  
    kind: Namespace
  5.  
    metadata:
  6.  
    name: mynamespace
  7.  
     
  8.  
    创建命令与创建pod和service相同
  9.  
     
  10.  
     

yaml 指定namespace示子:

  1.  
    cat pod.yaml
  2.  
     
  3.  
    apiVersion: v1
  4.  
    kind: Pod
  5.  
    metadata:
  6.  
    name: busybox1
  7.  
    namespace: mynamespace
  8.  
    spec:
  9.  
    containers:
  10.  
    - image: gcr.io/google_containers/busybox
  11.  
    command:
  12.  
    - sleep
  13.  
    - "3600"
  14.  
    name: busybox1
  15.  
     
  16.  
     
  17.  
    kubectl create -f pod.yaml
  18.  
     
  19.  
     

创建完pod 此时你使用 kubectl get pod -o wide 或者 kubectl get pod  查看是看不到的,因为这些pod都是在默认空间中的

所以想要查看 mynamespace 空间的pod 需要在查看命令指定namespace空间

命令:

  1.  
    kubectl get pods –n [namespace名称]
  2.  
    或者
  3.  
    kubectl get pods -o wide –n [namespace名称]

使用run 命令创建pod指定namespace

kubectl run -i -t busybox --image=busybox --namespace=mynamespace

Kubectl命令行管理对象

4daca67ff9a1f0b935603f66572c7d5db3a.jpg

710fd7331e09c42e89f352db9ed3fc2149c.jpg

创建资源小技巧

当资源可以使用create 创建时,可以使用 -o yaml 和 --dry-run 查看yaml文件如何写

-o yaml  以yaml格式输出

--dry-run 测试创建,不会真的创建资源

例:

kubectl create serviceaccount mycount -o yaml --dry-run

另外一种方法导出摸个pod/deploy yaml文件 用于模板文件可以修改为其他的pod/deploy的yaml

kubectl get pods x-pod -o yaml --export

查看 node标签

kubectl get nodes --show-labels

给node打标签

  1.  
    kubectl label nodes node1 zone=foo
  2.  
     
  3.  
    zone 标签key
  4.  
    foo 标签值

node设置污点

  1.  
    kubectl taint node node2 node-type=dev:NoExecute
  2.  
     

node去污

kubectl taint node node2 node-type:NoExecute-

 

 

转载于:https://my.oschina.net/54188zz/blog/3021811

posted @   ianCloud  阅读(546)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示