K8s 基础:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
无编辑摘要
第32行: 第32行:
=== 操作 ===
=== 操作 ===
==== 查询 ====
==== 查询 ====
  ## -o wide: 显示多的资源
  ## -o wide: 显示较多的信息
  ## -o yaml: 显示全部详细信息
  ## -o yaml: 显示全部详细信息
  # namespace, pods, service, configmap, deployments, jobs, replicasets, statefulsets, rs, rc
  # namespace, pods, service, configmap, deployments, jobs, replicasets, statefulsets, rs, rc
第50行: 第50行:
  kubectl logs <POD> -n ${NS} [-c <CONTAINER_NAME>]
  kubectl logs <POD> -n ${NS} [-c <CONTAINER_NAME>]


==== 执行 Pod 命令 ====
==== 在容器中执行命令 ====
  Format: kubectl exec [POD] -- [COMMAND] instead
  Format: kubectl exec [POD] -- [COMMAND] instead
* 命名空间:-n OR --namespace
* 命名空间:-n OR --namespace
第56行: 第56行:
* 交互模式:-it,通常与 shell 命令一起使用,如 bash
* 交互模式:-it,通常与 shell 命令一起使用,如 bash
  -- bash
  -- bash
  kubectl exec <POD> -n <NS> -- bash
  kubectl exec <POD> -n ${NS} -- bash
  --
  -- cmd
  kubectl exec <POD> -n <NS> -- cat /var/log/nginx/access.log
  kubectl exec <POD> -n ${NS} -- cat /var/log/nginx/access.log


==== 滚动重启 ====
==== 滚动重启 ====
  kubectl rollout restart deployment <DEPLOY_NAME> -n <NS>
在同 node 上将原来的 pod 改名,建立一个新的 pod,与原来同名。
  <small><small># kubectl get deployment -n <NS>
  kubectl rollout restart deployment <DEPLOY_NAME> -n ${NS}
  <small><small># kubectl get deployment -n ${NS}
  # Starting
  # Starting
  NAME        READY  UP-TO-DATE  AVAILABLE  AGE
  NAME        READY  UP-TO-DATE  AVAILABLE  AGE
第68行: 第69行:
  # finished
  # finished
  NAME        READY  UP-TO-DATE  AVAILABLE  AGE
  NAME        READY  UP-TO-DATE  AVAILABLE  AGE
  nginx-test  3/3    3            3          92m</small></small>
  nginx-test  3/3    3            3          92m
原来的 pod 名称 = nginx-test-666988cd9c-qcvnb,rollout restart 过程将原 pod 改名为 nginx-test-7f86f678c6-5x99l。如果 mount 了以 pod 名称的 node 目录,则原目录文件在改名后的目录中。
# nginx-test-666988cd9c-qcvnb/error.log
2024/06/19 07:44:52 [notice] 1#1: using the "epoll" event method
2024/06/19 07:44:52 [notice] 1#1: nginx/1.27.0
2024/06/19 07:44:52 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/06/19 07:44:52 [notice] 1#1: OS: Linux 3.10.0-1127.el7.x86_64
2024/06/19 07:44:52 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:4096
2024/06/19 07:44:52 [notice] 1#1: start worker processes
2024/06/19 07:44:52 [notice] 1#1: start worker process 29
2024/06/19 07:44:52 [notice] 1#1: start worker process 30
# nginx-test-7f86f678c6-5x99l/error.log
2024/06/19 07:28:29 [notice] 1#1: using the "epoll" event method
2024/06/19 07:28:29 [notice] 1#1: nginx/1.27.0
2024/06/19 07:28:29 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/06/19 07:28:29 [notice] 1#1: OS: Linux 3.10.0-1127.el7.x86_64
2024/06/19 07:28:29 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:4096
2024/06/19 07:28:29 [notice] 1#1: start worker processes
2024/06/19 07:28:29 [notice] 1#1: start worker process 29
2024/06/19 07:28:29 [notice] 1#1: start worker process 30
2024/06/19 07:44:52 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2024/06/19 07:44:52 [notice] 29#29: gracefully shutting down
2024/06/19 07:44:52 [notice] 29#29: exiting
2024/06/19 07:44:52 [notice] 29#29: exit
2024/06/19 07:44:52 [notice] 30#30: gracefully shutting down
2024/06/19 07:44:52 [notice] 30#30: exiting
2024/06/19 07:44:52 [notice] 30#30: exit
2024/06/19 07:44:52 [notice] 1#1: signal 17 (SIGCHLD) received from 29
2024/06/19 07:44:52 [notice] 1#1: worker process 29 exited with code 0
2024/06/19 07:44:52 [notice] 1#1: signal 29 (SIGIO) received
2024/06/19 07:44:52 [notice] 1#1: signal 17 (SIGCHLD) received from 30
2024/06/19 07:44:52 [notice] 1#1: worker process 30 exited with code 0
2024/06/19 07:44:52 [notice] 1#1: exit</small></small>


==== 弹性伸缩 ====
==== 弹性伸缩 ====
  kubectl scale --replicas=2 deployment <DEPLOY_NAME> -n <NS>
  kubectl scale --replicas=2 deployment <DEPLOY_NAME> -n ${NS}
==== 删除 ====
==== 删除 ====
  kubectl delete namespace <NS>
  kubectl delete namespace ${NS}
  # 有些使用 statefulsets 为 Pod 提供持久存储和持久标识符,先删除 tatefulsets,才可以继续删除相应的 pods。
  # 有些使用 statefulsets 为 Pod 提供持久存储和持久标识符,先删除 tatefulsets,才可以继续删除相应的 pods。
  kubectl delete statefulsets --all -n <NS>
  kubectl delete statefulsets --all -n ${NS}


=== Demo ===
=== Demo ===
第132行: 第167行:


=== Error ===
=== Error ===
* kubectl apply -f nginx.yaml 创建三个 pods,但只有一个成功
==== 创建三个 pods,但只有一个成功 ====
可能的原因是只有一个节点上有镜像文件
可能的原因是只有一个节点上有镜像文件(kubectl apply -f nginx.yaml )
==== unknown field "spec.template.spec.name" ====
==== unknown field "spec.template.spec.name" ====
  yaml 缩进问题
  yaml 缩进问题

2024年6月19日 (三) 16:11的版本

基本概念

Pod

Pod 是 K8s 中集群部署应用和服务的最小单元,一个 Pod 中可以部署多个容器。

Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod 对多容器的支持是 K8s 最基础的设计理念。

RC(副本控制器)

RC(Replication Controller,RC)通过启动/停止 Pod 副本保证集群中有指定数目的 Pod 运行。

RS(副本集)

RS(Replica Set,RS)是新一代 RC,提供同样的高可用能力,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为 Deployment 的理想状态参数使用。

Deployment(部署)

Deployment 提供了一种对 Pod 和 ReplicaSet 的管理方式,每一个 Deployment 都对应集群中的一次部署。用来创建/更新/滚动升级服务。

滚动升级实际是创建一个新的 RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧 RS 中的副本数减小到 0 的复合操作。

Service(服务)

RC、RS 和 Deployment 保证了支撑服务的微服务 Pod 的数量,Service 解决如何访问这些服务,以及对绑定的 Pod 提供负载均衡。

一个 Pod 只是一个运行服务的实例,随时可能在节点上停止,然后在新的节点上用一个新的 IP 启动一个新的 Pod,因此不能使用确定的 IP 和端口号提供服务。这对于业务来说,就不能根据 Pod 的 IP 作为业务调度。K8s 就引入了 Service 的概念,为 Pod 提供一个入口,通过 Labels 标签来选择后端的 Pod,从而允许后端 Pod 的 IP 地址变更。

当声明 Service 的时候,会自动生成一个虚拟的 cluster IP,可以通过这个 IP 来访问后端的 Pod。如果集群配置了 CoreDNS 服务,那么也可以通过 Service 的名字来访问。

Service 对外暴露服务的方式
  1. ClusterIP (默认) :在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问,一般这种类型的 Service 上层会挂一个 Ingress,通过 Ingress 暴露服务
  2. NodePort:在每个选定 Node 的相同端口上公开 Service,使用 <NodeIP>:<NodePort> 即可从集群外部访问 Service
  3. LoadBalancer:使用云厂商的 K8S 集群,即可使用这种方式的暴露 Service,自建的服务一般不支持。使用 LoadBalancer,会生成一个 IP 地址,通过这个即可访问 Service, 通知这个 IP 也是高可用的
  4. ExternalName: 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的 externalName 指定)公开 Service,不使用代理。这种类型需要 kube-dns v1.7 或更高版本
NodePort 出来的端口在主机上并不可见(netstat -lntp),而是通过 iptables (or IPVS)控制,iptables -L 可以看到所有规则。

操作

查询

## -o wide: 显示较多的信息
## -o yaml: 显示全部详细信息
# namespace, pods, service, configmap, deployments, jobs, replicasets, statefulsets, rs, rc
kubectl get ns
kubectl get deploy -n ${NS}
kubectl get pods -n ${NS}
kubectl get svc -n ${NS}
kubectl get cm -n ${NS}
## describe
# pods 在哪些主机上
kubectl describe pods -n ${NS} |grep Node
# 各主机 describe
kubectl describe node

## log
kubectl logs <POD> -n ${NS} [-c <CONTAINER_NAME>]

在容器中执行命令

Format: kubectl exec [POD] -- [COMMAND] instead
  • 命名空间:-n OR --namespace
  • 指定容器:-c OR --container,Pod 中有多个容器
  • 交互模式:-it,通常与 shell 命令一起使用,如 bash
-- bash
kubectl exec <POD> -n ${NS} -- bash
-- cmd
kubectl exec <POD> -n ${NS} -- cat /var/log/nginx/access.log

滚动重启

在同 node 上将原来的 pod 改名,建立一个新的 pod,与原来同名。

kubectl rollout restart deployment <DEPLOY_NAME> -n ${NS}
# kubectl get deployment -n ${NS}
# Starting
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-test   4/3     1            4           92m
# finished
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-test   3/3     3            3           92m

原来的 pod 名称 = nginx-test-666988cd9c-qcvnb,rollout restart 过程将原 pod 改名为 nginx-test-7f86f678c6-5x99l。如果 mount 了以 pod 名称的 node 目录,则原目录文件在改名后的目录中。
# nginx-test-666988cd9c-qcvnb/error.log 
2024/06/19 07:44:52 [notice] 1#1: using the "epoll" event method
2024/06/19 07:44:52 [notice] 1#1: nginx/1.27.0
2024/06/19 07:44:52 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 
2024/06/19 07:44:52 [notice] 1#1: OS: Linux 3.10.0-1127.el7.x86_64
2024/06/19 07:44:52 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:4096
2024/06/19 07:44:52 [notice] 1#1: start worker processes
2024/06/19 07:44:52 [notice] 1#1: start worker process 29
2024/06/19 07:44:52 [notice] 1#1: start worker process 30

# nginx-test-7f86f678c6-5x99l/error.log 
2024/06/19 07:28:29 [notice] 1#1: using the "epoll" event method
2024/06/19 07:28:29 [notice] 1#1: nginx/1.27.0
2024/06/19 07:28:29 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 
2024/06/19 07:28:29 [notice] 1#1: OS: Linux 3.10.0-1127.el7.x86_64
2024/06/19 07:28:29 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:4096
2024/06/19 07:28:29 [notice] 1#1: start worker processes
2024/06/19 07:28:29 [notice] 1#1: start worker process 29
2024/06/19 07:28:29 [notice] 1#1: start worker process 30
2024/06/19 07:44:52 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2024/06/19 07:44:52 [notice] 29#29: gracefully shutting down
2024/06/19 07:44:52 [notice] 29#29: exiting
2024/06/19 07:44:52 [notice] 29#29: exit
2024/06/19 07:44:52 [notice] 30#30: gracefully shutting down
2024/06/19 07:44:52 [notice] 30#30: exiting
2024/06/19 07:44:52 [notice] 30#30: exit
2024/06/19 07:44:52 [notice] 1#1: signal 17 (SIGCHLD) received from 29
2024/06/19 07:44:52 [notice] 1#1: worker process 29 exited with code 0
2024/06/19 07:44:52 [notice] 1#1: signal 29 (SIGIO) received
2024/06/19 07:44:52 [notice] 1#1: signal 17 (SIGCHLD) received from 30
2024/06/19 07:44:52 [notice] 1#1: worker process 30 exited with code 0
2024/06/19 07:44:52 [notice] 1#1: exit

弹性伸缩

kubectl scale --replicas=2 deployment <DEPLOY_NAME> -n ${NS}

删除

kubectl delete namespace ${NS}
# 有些使用 statefulsets 为 Pod 提供持久存储和持久标识符,先删除 tatefulsets,才可以继续删除相应的 pods。
kubectl delete statefulsets --all -n ${NS}

Demo

创建 Nginx 集群

kubectl apply -f nginx.yaml -n rds2024
kubectl apply -f nginx_s.yaml -n rds2024
# 在所有的 K8s 集群上,端口 32080 均可查看
# nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-bi
  namespace: rds2024
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        ports:
          - containerPort: 80
        name: nginx
        volumeMounts:
        - name: log
          mountPath: /var/log/nginx
      volumes:
      - name: log
        hostPath:
          path: /u01/kube/nginx/logs
          type: DirectoryOrCreate
# nginx_s.yaml
apiVersion: apps/v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32080

Error

创建三个 pods,但只有一个成功

可能的原因是只有一个节点上有镜像文件(kubectl apply -f nginx.yaml )

unknown field "spec.template.spec.name"

yaml 缩进问题

delete Terminating namespace

kubectl proxy
kubectl get ns ${NS} -o json > nsdel.json
vi nsdel.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @nsdel.json http://127.0.0.1:8001/api/v1/namespaces/${NS}/finalize
kubectl delete ns ${NS}
kubectl delete ns ${NS} --force --grace-period=0