古道长亭

Contact me with ixiaoqiang0011@gmail.com


  • 首页

  • 归档

  • 分类

  • 关于

  • Book

  • 搜索

Kubernetes 实战之命令行

时间: 2023-07-22   |   分类: Kubernetes   | 字数: 3899 字 | 阅读约: 8分钟 | 阅读次数:

Kubernetes 实战之命令行

1. NameSpace

中文名称:命名空间。 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 可以为你提供组织,安全甚至性能方面的帮助!

Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。

大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是4个:

  • default:你的资源默认被创建于default命名空间。
  • kube-system:kubernetes系统组件使用。
  • kube-node-lease: kubernetes集群节点租约状态,v1.13加入
  • kube-public:公共资源使用。但实际上现在并不常用。

这个默认(default)的namespace并没什么特别,但你不能删除它。这很适合刚刚开始使用kubernetes和一些小的产品系统。但不建议应用于大型生产系统。因为,这种复杂系统中,团队会非常容易意外地或者无意识地重写或者中断其他服务service。相反,请创建多个命名空间来把你的service(服务)分割成更容易管理的块

作用:
	多租户情况下,实现资源隔离
	属于逻辑隔离
	属于管理边界
	不属于网络边界
	可以针对每个namespace做资源配额

1.1 查看命令空间

kubectl get namespacs  简写: kubectl get ns

#查看所有命名空间的pod资源
kubectl get pod --all-namespaces 
kubectl get pod -A

我们看到刚初始化的只有系统命名空间组件 kube-system

说明:

default 用户创建的pod默认在此命名空间 
kube-public 所有用户均可以访问,包括未认证用户
kube-node-lease kubernetes集群节点租约状态,v1.13加入 
kube-system kubernetes集群在使用

1.2 创建NameSpace

kubectl create  namespace qiang001
简写:
kubectl create  ns qiang001

1.3 删除NameSpace

kubectl delete namespace qiang001 
简写命令 
kubectl delete ns qiang001

2. Pod

2.1 简介

Pod是kubernetes集群能够调度的最小单元。Pod是容器的封装 。

在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。

这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被同一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。

  • 2个必知道的特点

    • 网络

      每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括Ip地址和网络端口。在同一个Pod中的容器可以和localhost进行互相通信。当Pod中的容器需要与Pod外的实体进行通信时,则需要通过端口等共享的网络资源。

    • 存储

      Pod能够被指定共享存储卷的集合,在pod中所有的容器能够访问并共享存储卷,允许这些容器共享数据。存储卷也允许在一个pod持久化数据,以防止其中的容器需要被重启。

  • 工作方式

    K8s一般不直接创建Pod。 而是通过控制器和模版配置来管理和调度

    • pod模板: 后面再说

    • pod重启:

      在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。Pod支持三种重启策略,在配置文件中通过restartPolicy字段设置重启策略

      1. Always:只要退出就会重启。
      2. OnFailure:只有在失败退出(exit code不等于0)时,才会重启。
      3. Never:只要退出,就不再重启
      

      注意,这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上

    • 资源限制:Kubernetes通过cgroups限制容器的CPU和内存等计算资源源,包括requests(请求,调度器保证调度到资源充足的Node上)和limits(上限)等。

2.2 查看pod

#查看default命名空间下的pods
kubectl get pods

#查看kube-system命名空间下的pods
kubectl get pods -n kube-system

#查看所有命名空间下的pods
kubectl get pod --all-namespaces
kubectl get pod -A

2.3 创建pod

  • 下载镜像

    #在每个节点都下载以下镜像: 选择不同基础镜像,镜像大小也不同
    docker pull tomcat:9.0.20-jre8-alpine 108MB 
    docker pull tomcat:9.0.37-jdk8-openjdk-slim 305MB 
    docker pull tomcat:9.0.37-jdk8 531MB
    
  • 运行pod

    #在default命名空间中创建一个pod副本的deployment
    kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080
    
    kubectl get pod 
    kubectl get pod -o wide 
    
    #使用pod的IP访问容器 crul ***:8080
    

2.4 扩容

#将副本扩容至5个
kubectl scale --replicas=5 deployment tomcat9-test

kubectl get deployment -o wide:

kubectl get pod -o wide :

我们发现每一个pod都分配了独立的ip地址, 同一个node的pod都在同一个网段

可以通过curl ip:8080的方式访问

但如何通过宿主机访问呢?看下面的服务

2.5 创建服务

pod 由deployment管理, 通过service对外提供服务

kubectl expose deployment tomcat9-test --name=tomcat9-svc --port=8888 --target-port=8080 --protocol=TCP --type=NodePort

--port=8888 是集群内部服务间调用端口
--target-port=8080 容器的端口(最终的流量端口),如tomcat集群端口是8080
--type=NodePort 是相当于指定外部流量访问集群,如果不指定端口, 会在创建完后随机生成一个访问端口,
默认端口范围:  30000-32767
通过--service-node-port-range=20000-22767 修改默认范围

kubectl get svc 或 kubectl get svc -o wide: 查看service如下,发现生成的对外端口为30646

小插曲:启动服务后,发现不能访问,master节点通过curl ip:8080也不能访问,即我的3台k8s集群服务器之间pod不能互相通信,因为我用的是华为云服务器,采用了白名单和端口限制,于是就重新配置了白名单ip网段和端口号,这时候,需要重新初始化k8s集群,初始化前需要在每一台节点执行kubeadm reset, 执行完以后,再按前面的初始化步骤进行(注意不能落掉步骤)。

但是。。。。。。发现还是不行,各种查阅资料,仍解决不了,初入k8s的坑,网上的情况各种五花八门,不过好一点的是,借此机会熟悉了一下k8s的网络模型。 想放弃了。。。,后来重新装系统,重新配置,发现仅仅是因为端口类型只开放了TCP协议,哎。。。,想实践的话还是建议用虚拟机,完全关闭防火墙再操作。

2.6 kubectl常用命令

2.6.1 语法规则

kubectl [command] [TYPE] [NAME] [flags]
  • command: 指定要对一个或多个资源执行的操作,例如 create 、 get 、 describe 、 delete

  • type: 指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式

    kubectl get pod pod1 
    kubectl get pods pod1
    kubectl get po pod1
    
  • name: 指定资源的名称。名称区分大小写。如果省略名称,则显示所有资源的详细信息

    在对多个资源执行操作时,您可以按类型和名称指定每个资源,或指定一个或多个文件

    • 要按类型和名称指定资源:

      要对所有类型相同的资源进行分组,请执行以下操作: TYPE1 name1 name2..

      如: kubectl get pod example-pod1 example-pod2

      分别指定多个资源类型: TYPE1/name1 TYPE1/name2 TYPE2/name3.. 如:kubectl get pod/example-pod1 replicationcontroller/example-rc1

    • 用一个或多个文件指定资源: -f file1 -f file2 -f file<#>

      如: kubectl get pod -f ./pod.yaml

  • flags: 指定可选的参数。例如,可以使用 -s 或 -server 参数指定 Kubernetes API 服务器的地址和端口

2.6.2 get命令

列出一个或多个资源

# 查看集群状态信息 
kubectl cluster-info 

# 查看集群状态
kubectl get cs 

# 查看集群节点信息
kubectl get nodes

# 查看集群命名空间
kubectl get ns 

# 查看指定命名空间的服务
kubectl get svc -n kube-system 

# 以纯文本输出格式列出所有 pod。
kubectl get pods

# 以纯文本输出格式列出所有 pod,并包含附加信息(如节点名)。
kubectl get pods -o wide 

# 以纯文本输出格式列出具有指定名称的副本控制器。提示:您可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name> 

# 以纯文本输出格式列出所有副本控制器和服务。 
kubectl get rc,services

# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。 
kubectl get ds --include-uninitialized 

# 列出在节点 server01 上运行的所有 pod
kubectl get pods --field-selector=spec.nodeName=server01

2.6.3 describe命令

显示一个或多个资源的详细状态,默认情况下包括未初始化的资源

# 显示名称为 <node-name> 的节点的详细信息。  
kubectl describe nodes <node-name> 

# 显示名为 <pod-name> 的 pod 的详细信息。 
kubectl describe pods/<pod-name> 

# 显示由名为 <rc-name> 的副本控制器管理的所有 pod 的详细信息。 
# 记住:副本控制器创建的任何 pod 都以复制控制器的名称为前缀。 
kubectl describe pods <rc-name> 

# 描述所有的 pod,不包括未初始化的 pod 
kubectl describe pods --include-uninitialized=false

说明: kubectl get 命令通常用于检索同一资源类型的一个或多个资源。 它具有丰富的参数,允许您使用 -o 或 –output 参数自定义输出格式。您可以指定 -w 或 –watch 参数以开始观察特定对象的更新。 kubectl describe 命令更侧重于描述指定资源的许多相关方面。它可以调用对 API 服务器 的多个 API 调用来为用户构建视图。 例如,该 kubectl describe node 命令不仅检索有关节点的信息,还检索在其上运行的 pod 的摘要,为节点生成的事件等。

2.6.4 delete命令

从文件、stdin 或指定标签选择器、名称、资源选择器或资源中删除资源

# 使用 pod.yaml 文件中指定的类型和名称删除 pod。 
kubectl delete -f pod.yaml 

# 删除标签名= <label-name> 的所有 pod 和服务。 
kubectl delete pods,services -l name=<label-name> 

# 删除所有具有标签名称= <label-name> 的 pod 和服务,包括未初始化的那些。 
kubectl delete pods,services -l name=<label-name> --include-uninitialized 

# 删除所有 pod,包括未初始化的 pod。
kubectl delete pods --all

2.6.5 进入容器命令

kubectl exec 对 pod 中的容器执行命令。与docker的exec命令非常类似

# 从 pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> date

# 运行输出 'date' 获取在容器的 <container-name> 中 pod <pod-name> 的输出。
kubectl exec <pod-name> -c <container-name> date

# 获取一个交互 TTY 并运行 /bin/bash <pod-name >。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> /bin/bash

2.6.6 logs命令

打印 Pod 中容器的日志。

# 从 pod 返回日志快照。
kubectl logs <pod-name>

# 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>

2.6.7 格式化输出

# 将pod信息格式化输出到一个yaml文件
kubectl get pod web-pod-13je7 -o yaml

2.6.8 强制删除pod

# 强制删除一个pod
--force --grace-period=0

2.7 资源缩写

资源名缩写API分组按命名空间资源类型
configmapscmtrueConfifigMap
namespacesnsfalseNamespace
nodesnofalseNode
persistentvolumeclaimspvctruePersistentVolumeClaim
persistentvolumespvfalsePersistentVolume
podspotruePod
secretstrueSecret
serviceaccountssatrueServiceAccount
servicessvctrueService
daemonsetsdsappstrueDaemonSet
deploymentsdeployappstrueDeployment
statefulsetsstsappstrueStatefulSet
horizontalpodautoscalershpaautoscalingtrueHorizontalPodAutoscaler
cronjobscjbatchtrueCronJob
jobsbatchtrueJob
ingressesingextensionstrueIngress
poddisruptionbudgetspdbpolicytruePodDisruptionBudget
clusterrolebindingsrbac.authorization.k8s.iofalseClusterRoleBinding
clusterrolesrbac.authorization.k8s.iofalseClusterRole
rolebindingsrbac.authorization.k8s.iotrueRoleBinding
rolesrbac.authorization.k8s.iotrueRole
storageclassesstorage.k8s.iofalseStorageClass
#Kubernetes# #容器# #虚拟化#
QQ扫一扫交流

标题:Kubernetes 实战之命令行

作者:古道长亭

声明: 欢迎加群交流!

如有帮助,欢迎多多交流 ^_^

微信打赏

支付宝打赏

Kubernetes 实战之资源文件
Kubernetes 简介及快速实战
  • 文章目录
  • 站点概览
古道长亭

古道长亭

Always remember that your present situation is not your final destination. The best is yet to come.

226 日志
57 分类
104 标签
GitHub Gitee
友情链接
  • 古道长亭的BOOK
  • JAVA学习
标签云
  • Mysql
  • 搜索引擎
  • Mybatis
  • 容器
  • 架构
  • 消息队列
  • Flink
  • Sharding sphere
  • 流处理
  • 缓存
  • 1. NameSpace
    • 1.1 查看命令空间
    • 1.2 创建NameSpace
    • 1.3 删除NameSpace
  • 2. Pod
    • 2.1 简介
    • 2.2 查看pod
    • 2.3 创建pod
    • 2.4 扩容
    • 2.5 创建服务
    • 2.6 kubectl常用命令
    • 2.7 资源缩写
© 2019 - 2024 京ICP备19012088号-1
0%