Kubernetes Note

基本概念和术语

Mater

指集群的控制节点,运行着一组关键进程

>Kube-apiserver: 提供了HTTP Rest接口服务,是Kubernetes所有资源的增删改查等操作的唯一入口
>Kube-controller-manager: Kubernetes所有资源对象的自动化控制中心
>Kube-scheduler: 负责资源调度(Pod调度)的进程
>Etcd: Kubernetes所有资源对象数据都保存在etcd中
Node

可以在运行期间动态加入kubernetes集群,一加入集群,Node上的kubelet进程会定时向Master节点汇报自身情报(如操作系统信息,Docker版本,CPU内存情况,Pod信息),Node超时不上报信息,会被Master判定为“失联",Node被标记为Not Ready,随后Master触发”工作负载大转移"

Pod

最基本的概念,每个Pod都有一个特殊容器Pause,还包含一个或多个紧密相关的用户业务容器,Pod里的多个业务容器共享Pause容器的IP和Volume,每个Pod都有一个Pod IP,且集群内任意两个Pod可以通过Pod IP通信

Endpoint: PodIP+ContainerPort

分类:普通Pod和静态Pod(不会存放在Etcd里,而是存放在Node的一个具体文件中,并只在此Node上启动运行)

资源限制:

>spec:
 containers:
   -name: db
    image: mysql
    resources: 
      requests:    # 资源最小申请
        memory: "64Mi"
        cpu: "250m"
      limits:      # 资源最大申请
        memory: "120Mi"
        cpu: "500m" # m表示千分之一CPU,500m就是0.5个CPU
Label

Label Selector

>基于等式的(Equality-based):
 name=redis-slave 匹配所有具有标签name=redis-slave的资源对象
 env!=production 匹配所有不具有标签env=production的资源对象
>基于集合的(Set-based): 
 name in (redis-master,redis-slave) 匹配所有具有标签name=redis-master或name=redis-slave的资源对象
 name not in (php-frontend) 匹配所有不具有标签name=php-fronted的资源对象
>多个表达式之间用“,”进行分割,关系是AND
 name=redis-slave,env!=production
RC

Kubernetes最核心的概念,管理Pod的副本数量

>apiVersion: v1
>kind: ReplicationController
>metadata:
 name: frontend
>spec:
 replicas: 1
 selector: 
   tier: frontend
 template:
   metadata:
     labels:
       app: app-demo
       tier: frontend
   spec:
     containers:
      - name: tomcat-demo
        image: tomcat
        imagePullPolicy: IfNotPresent
        env:
         - name: GET_HOSTS_FROM
           value: dns
        ports:
         - containerPort: 80

手动scale

>kubectl scale rc redis-slave --replicas=3

通过RC的机制,Kubernetes很容易实现滚动升级(Rolling Update)

RS

Kubernetes1.2后支持Replication Set,下一代的RC,最大的区别RS支持基于集合的Label Selector(Set-based selector),RC只支持基于等式的Label Selector(Equality-based selector)

Deployment

Kubernetes1.2后引入的概念,是为了更好的解决Pod的编排问题,相对于RC的一个最大升级是我们可以随时知道当前Pod"部署"进度

例子

>apiVersion: extensions/v1beta1
>kind: Deployment
>metadata:
 name: frontend
>spec:
 replicas: 1
 selector:
   matchLabels:
     tier: frontend
   matchExpressions:
     - {key: tier, operator: In, values: [frontend]}
 template:
   metadata:
     labels:
       app: app-demo
       tier: frontend
   spec:
     containers:
      - name: tomcat-demo
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
         - containerPort: 8080

创建查看

>kubectl create -f tomcat-deployment.yaml
>kubectl get deployments 
>kubectl get rs
HPA

Horizontal Pod Autoscalinig Pod横向自动扩容,与RC,Deployment一样属于Kubernetes的资源对象,通过追踪分析所有RC控制的所有Pod的负载变化,来针对性调整目标Pod的副本数

Pod负载度量标准

>CPUUtilizationPercentage
>应用程序自定义的度量指标,比如服务在每秒内的相应的请求数(TPC或QPS)
Service

每个Service就是微服务架构中的一个"微服务",定义了一个服务的访问入口地址

Service一旦创建,Kubernetes就会自动为它分配一个可用Cluster IP,在Service的整个生命周期,Cluster IP不会发生改变

服务发现: 用Service Name与Service Cluster IP做一个DNS域名映射

例子

>apiVersion: v1
>kind: Service
>metadata:
 name: tomcat-service
>spec: 
 ports:
  - name: service-port
    port: 8080         # 定义了Service的虚端口
    targetPort: 8080   # 容器所暴露EXPOSE
  - name: shutdown-port
    port: 8005
    targetPort: 8005
 selector:
   tier: frontend

查看Endpoint

>kubectl get endpoints

查看svc

>kubectl get svc tomcat-service -o yaml
三种IP

Node IP: Node节点的IP地址是Kubernetes集群中每个节点的物理网卡的IP地址

Pod IP:

​ Docker Engine 根据docker0网桥的ip地址段进行分配的,通常是一个虚拟的二层网络

Cluster IP:

​ Service的虚拟IP,无法被Ping,没有一个“实体网络对象"来响应,Cluster IP 只能结合Service Port组成一个具体的通信端口

NodePort

在每个Node上为需要外部访问的Service开启一个对应的TCP监听端口

>apiVersion: v1
>kind: Service
>metadata:
 name: tomcat-service
>spec:
 type: NodePort
 ports:
  - port: 8080
    nodePort: 31002
 selector:
   tier: frontend
Volume

是Pod中能够被多个容器访问的共享目录

例子

>spec:
 volumes:
  - name: datavol
    emptyDir: {}
 containers:
  - name: tomcat-demo
    image: tomcat
    volumeMounts:
     - mountPath: /mydata-data
     	name: datavol
    imagePullPolicy: IfNotPresent

Volume类型:

>emptyDir:
一个emptyDir Volume是在pod分配到Node时创建的,无需指定宿主机上对应的目录,由Kubernetes自动分配,当Pod从Node上移除时,emptyDir也被永久删除
>使用场景:临时空间

>volumes:
- name: datavol
  emptyDir: {}
>hostPath:
为在Pod上挂载宿主机上的文件或目录
>使用场景:容器生成的日志文件需要永久保存在宿主机上的文件系统
>注意:
1.不同Node的具有相同配置的Pod可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结果不一致
2.使用了资源管理,Kubernetes无法将hostPath在宿主机上是使用的资源纳入管理

>volumes:
- name: "persistent-storage"
  hostPath: 
    path: "/data"
>NFS:
使用网络文件系统

>volumes:
- name: nfs
  nfs: 
    server: nfs-server.localhost
    path: "/"
>gcePersistentDisk
使用谷歌公有云提供的永久磁盘(Persistent Disk,PD)
>awsElasticBlockStor	
使用亚马逊公有云提供的EBS Volume存储数据
Persistent Volume

网络存储,可以理解成Kubernetes集群中的某个网络存储中对应的一块存储

类型:

>GCE Persistent Disks,NFS,RBD,iSCSCI,AWS ElasticBlockStor,GlusterFS

NFS类型PV yaml例子

>apiVersion: v1
>kind: PersistentVolume
>metadata:
 name: pv03
>spec:
 capacity:
   storage: 5Gi
 accessModes:
  - ReadWriteOnce
 nfs:
   path: /somepath
   server: 172.17.0.2
># accessModes属性: 
># ReadWriteOnce: 读写权限,只能被单个Node挂载
># ReadOnlyMany: 只读权限,允许被多个Node挂载
># ReadWriteMany: 读写权限,允许被多个Node挂载

PV状态

>Available: 空闲状态
>Bound: 已经绑定大道某个PVC上
>Released: 对应的PVC已经删除,单资源还没被集群收回
>Failed: PV自动回收失败

某个Pod想申请某种条件的PV,首先需要定义一个PVC(PersistentVolumeClaim)

>apiVersion: v1
>kind: PersistentVolumeClaim
>metadata:
 name: myclaim
>spec:
 accessModes:
  - ReadWriteOnce
 resources:
   requests:
     storage: 8Gi

然后再Pod的Volume定义中引用上述PVC

>volumes:
- name: mypd
  persistentVolumeClaim:
    claimName: myclaim
Namespace命名空间

实现多租房的资源隔离,集群启动后,会创建一个名为“default"的Namespace,如果不指名Namespace,资源会被创建到default的空间上

通过命令查看: kubectl get namespaces

Annotation注解

用户任意定义的“附加"信息,用来记录如下信息

>build信息,release信息,Docker镜像信息
>日志库,监控库

安装配置

Kubeadm工具快速安装
二进制方式安装
Kubernetes集群的安全设置

在一个安全的内网环境中,Kubernetes的各个组件与Master之间可以通过kube-apiserver的非安全端口http://:8080进行访问。但如果API Server需要对外提供服务,或者集群中的某些容器也需要访问API Server以获取集群中的某些信息,则更安全的做法是启用HTTPS安全机制。Kubernetes提供了基于CA签名的双向数字证书认证方式和简单的基于HTTP Base或Token的认证方式,其中CA证书方式的安全性最高。本节先介绍如何以CA证书的方式配置Kubernetes集群,要求Master上的kube-apiserver、kube-controller-manager、kube-scheduler进程及各Node上的kubelet、kube-proxy进程进行CA签名双向数字证书安全设置。

kubectl命令用法详解

kubectl [command] [TYPE] [NAME] [flags]

command: 子命令,用于操作Kubernetes集群资源对象,如create/delete/describe/get/apply

TYPE: 资源对象类型,单数,复数,简写形式表示

NAME: 资源对象的名称,不指定名称,返回TYPE的全部对象

flags: kubectl子命令的可选参数,

参考资料

https://github.com/kubernetes/kubernetes/blob/v1.25.10/pkg/scheduler/scheduler.go

官方文档:

可供学习的资料

https://granulate.io/blog/a-deep-dive-into-kubernetes-scheduling/

https://www.infoq.cn/article/or7crphtdlx1ivhsfngk

https://www.cnblogs.com/zhangmingcheng/p/16324140.html

https://xie.infoq.cn/article/33fb565b66b825a9683abf864

https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/

https://kubernetes.io/docs/concepts/scheduling-eviction/scheduler-perf-tuning/

https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity

https://www.infoq.cn/article/3S9hqoOX0mODAVyM0VH3?utm_source=related_read_bottom&utm_medium=article

https://www.qikqiak.com/k3s/scheduler/overview/

https://www.jianshu.com/p/91f4c8967a92

https://rx-m.com/kube-scheduler-kubecon-cloudnativecon-na-2021/

https://blog.csdn.net/i_want_to_be_a_god/article/details/106969992

http://www.iceyao.com.cn/post/2020-08-31-k8s-scheduler-framework/

https://qiankunli.github.io/2020/09/03/scheduler_score.html

https://blog.crazytaxii.com/posts/k8s_scheduler_bind/


Kubernetes Note
https://centyuan.github.io/2023/12/05/K8s和Docker/Kubernetes-Note/
作者
hlyuan
发布于
2023年12月5日
许可协议