K8S总结

76 阅读8分钟

1,服务注册与发现

服务(service) 注册:
向API SERVER提交一个Service定义,service得到一个虚拟IP地址(VIP,也叫ClusterIP) ,集群DNS根据Service创建DNS A记录。
ps: 集群DNS使用的是CoreDNS,CoreDNS实现了一个控制器,会对API Servier进行监听,一旦发现有新建的Service对象,就创建一个从Service名称
映射到ClusterIP的域名记录。
k8s自动为每个Service创建Endpoints对象。Endpoints对象的指责就是保存一个符合Service标签选择器的Pod列表
服务(service) 发现:
假设我们在一个 Kubernetes 集群中有两个应用,my-app 和 your-app,my-app 的 Pod 的前端是一个 名为 my-app-svc 的 Service 对象;your-app Pod 之前的 Service 就是 your-app-svc。
这两个 Service 对象对应的 DNS 记录是:my-app-svc:10.0.0.10 ;your-app-svc:10.0.0.20
如果 my-app 中的 Pod 想要连接到 your-app 中的 Pod,就得向 DNS 服务器发起对域名 your-app-svc 的查询。假设它们本地的 DNS 解析缓存中没有这个记录,
则需要把查询提交到集群 DNS 服务器。会得到 you-app-svc 的 ClusterIP(VIP)。
另一种回答方式:Endpoints是k8s中的一种资源对象,k8s通过Endpoints监控到Pod的IP,service又关联Endpoints从而实现Pod的发现。

具体的完整的流程:
创建新的 Service 对象时,会得到一个虚拟 IP,被称为 ClusterIP。服务名及其 ClusterIP 被自动注册到集群 DNS 中,
并且会创建相关的 Endpoints 对象用于保存符合标签条件的健康 Pod 的列表,Service 对象会向列表中的 Pod 转发流量。

一个 Pod 需要用 Service 连接其它 Pod。首先向集群 DNS 发出查询,把 Service 名称解析为 ClusterIP,然后把流量发送给位于 Service 网络的 ClusterIP 上。
然而没有到 Service 网络的路由,所以 Pod 把流量发送给它的缺省网关。这一行为导致流量被转发给 Pod 所在节点的网卡,然后是节点的缺省网关。
这个操作中,节点的内核修改了数据包 Header 中的目标 IP,使其转向健康的 Pod。

[IPVS介绍]t.zoukankan.com/huanggze-p-…

2,网络

PS:同一个集群service类型是ClusterIP,集群和外部需要类型是NodePort,但是NodePort会占有大量端口,端口配置麻烦,也可以使用LoadBalancer来处理,但最终最好是用Ingress来做。)

1,pod内部容器container之间的通信
在同一个 Pod 内,所有容器共享它们的网络命名空间 — 包括它们的 IP 地址和 MAC 地址,并且可以通过 localhost 发现对方。
Pod 使用了一个容器 Pause容器,Pause容器 在 Pod 中首先被创建,而其他容器则通过连接到Pause容器的方式来进行通信。

2,pod与pod通信 (
1),同一个集群:pod在同一主机
通过veth pair对实现通信。
2),同一个集群:pod在不同主机
pod在不同主机的通信依赖于CNI插件。
PS:
CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。
实现了这个接口的就是 CNI 插件。常见的 CNI 插件包括 Calico、flannel等。

3,pod与service通信
1),直接通过Service的虚拟IP
2),直接访问服务名,通过DNS进行域名解析找到Service对应到虚拟IP(VIP)

4,外网与service通信  
1),hostNetwork (了解即可,生产上不使用此方式)
在 Pod 中设置 hostNotwork:true 就可以让 Pod 直接使用 Node 的网络,使用 NodeIP:PodPort 访问 Pod
但是 Pod 启动的时候可能被调度到不同的 Node 上,所有外部访问 Pod 的 IP 也是变化的,而且调度 Pod 的时候还需要考虑是否与宿主机上的端口冲突.
2),hostPort (了解即可,生产上不推荐)
设置容器的 hostPort,hostPort 是直接将容器的端口映射为 Node 上的端口, 使用 NodeIP:NodePort 访问 Pod。
缺点是需要维护端口映射关系,不然 Pod 重新调度后就访问不到了。
4),LoadBalancer (了解即可)
LoadBalancer 针对于 Service,且只能在云服务平台上使用(AWS、Azure、阿里云等),使用任一节点的 IP 访问,如 LoadBalancerIP:LoadBalancerPort。
4),NodePort (了解即可,生产上不推荐)
 创建 NodePort 类型的 Service 时,用户可以指定范围为 30000-32767 的端口,对该端口的访问就能通过 kube-proxy 代理到 Service 后端的 Pod 中。
 使用 NodeIP:PodPort 访问 Pod。这种服务暴露方式,无法让你指定自己想要的应用常用端口,不过可以在集群上再部署一个反向代理作为流量入口。
5), Ingress (重点)
Ingress Controller 以 Docker 容器的方式部署在 K8s 的顶部,简单来说就是 K8s 所使用的负载均衡器,类型有:Nginx、Envoy、HAProxy 等。
一般使用 K8s 官方的 Ingress-Nginx Controller(注意,不是 Nginx 公司的 Nginx Ingress Controller) 作为外网访问服务的方式。

k8s网络,咕泡学员5,关于k8s不得不说的事儿(上) 58分。

K8s 集群内外访问服务的方式

3,存储

PV PVC NFS

4,编排

是一个概念,从k8s各个组件以及作用去概括介绍就行。 容器编排(K8S)详解

5,pod定义文件完整内容



# yaml格式的pod定义文件完整内容:
apiVersion: v1       #必选,版本号,例如v1
kind: Pod            #必选,类型Pod
metadata:            #必选,元数据
  name: string       #必选,Pod名称
  namespace: string    #必选,Pod所属的命名空间
  labels:              #自定义标签
    - name: string     #自定义标签名字
  annotations:         #自定义注释列表
    - name: string
spec:              #必选,Pod中容器的详细定义
  containers:      #必选,Pod中容器列表
  - name: string     #必选,容器名称
    image: string    #必选,容器的镜像名称
    imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
    command: [string]    #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]       #容器的启动命令参数列表
    workingDir: string   #容器的工作目录
    volumeMounts:        #挂载到容器内部的存储卷配置
    - name: string       #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string    #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean    #是否为只读模式
    ports:       #需要暴露的端口库号列表
    - name: string         #端口号名称
      containerPort: int   #容器需要监听的端口号
      hostPort: int        #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string     #端口协议,支持TCP和UDP,默认TCP
    env:               #容器运行前需设置的环境变量列表
    - name: string     #环境变量名称
      value: string    #环境变量的值
    resources:         #资源限制和请求的设置
      limits:          #资源限制的设置
        cpu: string    #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string     #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests:            #资源请求的设置
        cpu: string        #Cpu请求,容器启动的初始可用数量
        memory: string     #内存请求,容器启动的初始可用数量
    livenessProbe:     #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
      exec:      #对Pod容器内检查方式设置为exec方式
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0  #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0       #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0        #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged:false
    restartPolicy: [Always | Never | OnFailure] # Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
    nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
    imagePullSecrets:      #Pull镜像时使用的secret名称,以key:secretkey格式指定
    - name: string
    hostNetwork: false      #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    volumes:           #在该pod上定义共享存储卷列表
    - name: string     #共享存储卷名称 (volumes类型有很多种)
      emptyDir: {}     #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
      hostPath: string     #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
        path: string       #Pod所在宿主机的目录,将被用于同期中mount的目录
      secret:              #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:     #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
        name: string
        items:
        - key: string
          path: string