k8s及常用指令使用总结

Posted 流子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s及常用指令使用总结相关的知识,希望对你有一定的参考价值。

一、Kubernetes 是什么?

Kubernetes (K8S) 是由Google设计的用于自动化部署、大规模可伸缩、管理容器化应用程序的开源的容器编排引擎,目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。

K8S 名词解释 #
使用腾讯云容器服务 TKE,会涉及到以下基本概念:

集群(Cluster):是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等云资源。

节点(Node):节点可以是一个虚拟机或者物理机器,取决于所在的集群配置,每个节点包含运行 Pods 所需的服务。

实例(Pod):由相关的一个或多个容器构成一个实例,这些容器共享相同的存储和网络空间。

工作负载(Workloads):Kubernetes 资源对象,用于管理 Pod 副本的创建、调度以及整个生命周期的自动控制。

Service:由多个相同配置的实例(Pod)和访问这些实例(Pod)的规则组成的微服务。

Ingress:Ingress 是用于将外部 HTTP(S)流量路由到服务(Service)的规则集合。

镜像仓库:用于存放 Docker 镜像,Docker 镜像用于部署容器服务。

常用指令

# 查看所有 pod 列表,  -n 后跟 namespace, 查看指定的命名空间
kubectl get pods
kubectl get pods -n game-demo  
NAME                             READY   STATUS    RESTARTS   AGE
game-dirsvr-1-6bd769896b-9vz58    2/2     Running   0          5d1h
game-gamesvr-1-5b585b7fdc-vl7wr   2/2     Running   0          32m

一旦pod状态损坏后,CrashLoopBackOff,就进不了pod查看日志

kubectl get pods -n game-demo
NAME                           READY   STATUS             RESTARTS   AGE
game-dirsvr-77c78ddc-r85bd      0/1     CrashLoopBackOff   165        14h
game-gamesvr-6c7f448bc6-2ttnh   1/1     Running            0          14h
kubectl exec -n gamioo-demo --stdin --tty ooxxooxx  -- /bin/bash
# 通过bash获得 pod 中某个容器的TTY,相当于登录容器
kubectl exec -it <pod-name> -c <container-name> -- bash

kubectl exec -n game-demo -it cnc-gamesvr-1-7f9f9f8bfb-hrwdn  -c cnc-gamesvr-1 -- bash 
# 执行 pod 的 date 命令
kubectl exec <pod-name> -- date
kubectl exec <pod-name> -- bash
kubectl exec <pod-name> -- ping 10.24.51.9

kubectl exec  cnc-gamesvr-1-666dd5f8c8-d9lb6 -n gamioo-demo -c cnc-gamesvr-1  -- date
Sun Jul 11 23:09:08 CST 2021
# 查看 Pod 详情:
kubectl describe node 172.17.0.11


# 显示 Pod 的详细信息, 特别是查看 pod 无法创建的时候的日志
kubectl describe pod <pod-name> -n <namespace>
kubectl describe pod cnc-gamesvr-1-666dd5f8c8-d9lb6 -n gamioo-demo
# 根据 yaml 创建资源, apply 可以重复执行,create 不行
kubectl create -f pod.yaml -n <namespace>
kubectl apply -f pod.yaml -n <namespace>

patch 更新 api 对象,使用策略性合并补丁更新一个 Deployment过补丁,您可以避免定义整个对象,只需要定义您希望更改的部分。通过策略性合并补丁,您只需要定义新增的元素就可以更新一个列表。列表中已有的元素仍然保留,新增的元素和已有的元素会被合并。上述例子中,最终结果的 containers 列表中既有原先的 nginx 容器,也有新增的 redis 容器。

kubectl patch deployment <container-name> -n <namespace> -patch  "json content"
kubectl patch deployment cnc-dirsvr-1 -n gamioo-demo -p "\\"spec\\":\\"template\\":\\"metadata\\":\\"labels\\":\\"build\\":\\"$REVISION-$DEPLOY_DATE\\""

# 等价命令

kubectl patch deployment patch-demo --patch "$(cat patch-file.yaml)"
kubectl patch deployment patch-demo --patch $'spec:\\n template:\\n  spec:\\n   containers:\\n   - name: patch-demo-ctr-2\\n     image: redis'

#如何传值
kubectl patch deployment patch-demo --patch "$(cat patch-file.json)"
kubectl patch deployment patch-demo --patch '"spec": "template": "spec": "containers": ["name": "patch-demo-ctr-2","image": "redis"]'

#删除 k8s 中的 StatefulSet
kubectl delete statefulset cnc-gamesvr-1-1 -n gamioo-demo
#查看更新结果
kubectl get deployment cnc-gamesvr-1 -n gamioo-demo --output yaml

spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: cnc-gamesvr-1
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: cnc-gamesvr-1
        build: 7ac2d40-1625837884
# 查看容器的日志
kubectl logs <pod-name>
kubectl logs -f <pod-name> # 实时查看日志
kubectl logs  <pod-name>  -c <container_name> # 若 pod 只有一个容器,可以不加 -c 
#查看最近的10行日志
kubectl logs --tail  10  cnc-gamesvr-1-666dd5f8c8-d9lb6 -n gamioo-demo -c cnc-gamesvr-1 

# 仅输出pod nginx中最近的20条日志
kubectl logs --tail=20 nginx

# 输出pod nginx中最近一小时内产生的所有日志
kubectl logs --since=1h nginx

如果kubectl logs后没有任何输出,试试使用get pod,然后会发现这很有可能是一个新启动的Pod,因此可以尝试检查一些上一次挂掉的Pod的日志。

kubectl logs cnc-gamesvr-1-666dd5f8c8-d9lb6 -n gamioo-demo -c cnc-gamesvr-1  --previous
# 查看集群的所有节点信息
kubectl get node --show-labels

NAME          STATUS   ROLES    AGE    VERSION         LABELS
172.17.0.10   Ready    <none>   101d   v1.18.4-tke.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/fluentd-ds-ready=true,beta.kubernetes.io/instance-type=S5.LARGE8,beta.kubernetes.io/os=linux,cloud.tencent.com/node-instance-id=ins-8helzjev,failure-domain.beta.kubernetes.io/region=sh,failure-domain.beta.kubernetes.io/zone=200005,kubernetes.io/arch=amd64,kubernetes.io/hostname=172.17.0.10,kubernetes.io/os=linux,node.kubernetes.io/instance-type=S5.LARGE8,topology.kubernetes.io/region=sh,topology.kubernetes.io/zone=200005
172.17.0.11   Ready    <none>   101d   v1.18.4-tke.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/fluentd-ds-ready=true,beta.kubernetes.io/instance-type=S5.LARGE8,beta.kubernetes.io/os=linux,cloud.tencent.com/node-instance-id=ins-2qrbqrvz,failure-domain.beta.kubernetes.io/region=sh,failure-domain.beta.kubernetes.io/zone=200005,kubernetes.io/arch=amd64,kubernetes.io/hostname=172.17.0.11,kubernetes.io/os=linux,node.kubernetes.io/instance-type=S5.LARGE8,topology.kubernetes.io/region=sh,topology.kubernetes.io/zone=200005
172.17.0.5    Ready    <none>   101d   v1.18.4-tke.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/fluentd-ds-ready=true,beta.kubernetes.io/instance-type=S5.LARGE8,beta.kubernetes.io/os=linux,cloud.tencent.com/node-instance-id=ins-1sw1t7xn,failure-domain.beta.kubernetes.io/region=sh,failure-domain.beta.kubernetes.io/zone=200005,kubernetes.io/arch=amd64,kubernetes.io/hostname=172.17.0.5,kubernetes.io/os=linux,node.kubernetes.io/instance-type=S5.LARGE8,topology.kubernetes.io/region=sh,topology.kubernetes.io/zone=200005
172.17.0.6    Ready    <none>   101d   v1.18.4-tke.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/fluentd-ds-ready=true,beta.kubernetes.io/instance-type=S5.LARGE8,beta.kubernetes.io/os=linux,cloud.tencent.com/node-instance-id=ins-kf266cv9,failure-domain.beta.kubernetes.io/region=sh,failure-domain.beta.kubernetes.io/zone=200005,kubernetes.io/arch=amd64,kubernetes.io/hostname=172.17.0.6,kubernetes.io/os=linux,node.kubernetes.io/instance-type=S5.LARGE8,topology.kubernetes.io/region=sh,topology.kubernetes.io/zone=200005
172.17.0.8    Ready    <none>   101d   v1.18.4-tke.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/fluentd-ds-ready=true,beta.kubernetes.io/instance-type=S5.LARGE8,beta.kubernetes.io/os=linux,cloud.tencent.com/node-instance-id=ins-ifbkpk7j,failure-domain.beta.kubernetes.io/region=sh,failure-domain.beta.kubernetes.io/zone=200005,kubernetes.io/arch=amd64,kubernetes.io/hostname=172.17.0.8,kubernetes.io/os=linux,node.kubernetes.io/instance-type=S5.LARGE8,topology.kubernetes.io/region=sh,topology.kubernetes.io/zone=200005

整合两个指令:

kubectl exec -n gamioo-demo --stdin --tty $(kubectl get pods -n gamioo-demo | grep gamesvr | awk -F' ' 'print $1') -- /bin/bash

工作负载:
Deployment:启动时先启动新的pod,然后再关闭老的pod
StatefulSet:标识固定,先关闭老的pod,然后再开启新的pod

一个pod相当于一个操作系统,容器(Container)相当于一个进程,一个pod可以有好多个进程

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

以上是关于k8s及常用指令使用总结的主要内容,如果未能解决你的问题,请参考以下文章

k8s及常用指令使用总结

k8s常用指令

❤️万字总结《Linux系统常用命令》❤️——常用的Linux操作指令详解及案例!(建议收藏)

Angularjs总结指令运用及常用控件的赋值操作

k8s 常用命令

cmake用法及常用命令总结