Kubernetes -- k8s简介、控制器资源组件、简单run命令

k8s 简介:

什么是k8s?

  1. Kubernetes (k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整的功能,提高了大规模容器集群管理的便捷性。
  2. 容器是使用Linux内核的两个特性(namespace和cgroup)执行的普通进程。namespace允许您为进程提供一个“view”,该进程将隐藏在这些名称空间之外的所有内容,从而为其提供自己的运行环境。这使得进程不能看到或干扰其他进程:
  3. 名称空间包括:
    主机名
    进程id
    文件系统
    网络接口
    进程间通信(IPC)

Kubernetes的优势:

  • 容器编排
  • 轻量级
  • 开源
  • 弹性伸缩
  • 负载均衡

相关网站:

Kubernetes (k8s) 官网:https://kubernetes.io/
Kubernetes (k8s) 官方文档:https://kubernetes.io/zh-cn/docs/home/
Kubernetes(k8s)GitHub地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.25.md

Kubernetes (k8s )核心组件

  1. etcd etcd是一个高可用的分布式键值存储系统,存储元数据,保证集群的高可用,K8s使用它来存储各个资源的状态,从而实现了Restful的API;
  2. api server Kubernetes 控制面的核心是 API 服务器。 API 服务器负责提供 HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信 监听6443端口
  3. controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  4. scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  5. kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  6. Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI);
  7. kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡;常用的两种代理模式iptables和ipvs

master与node节点服务:

  • Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd
  • Node节点主要由三个模块组成:kubelet、kube-proxy、runtime

  • coredns 负责为整个集群提供DNS服务
  • flanneld 负责为整个集群提供网络服务


pod创建过程

kubernetes之pod生命周期:https://www.kubernetes.org.cn/5335.html


k8s中的资源名词

cluster

cluster 是计算、存储、网络资源的集合,k8s利用这些资源运行各种基于容器的应用

master

master 是cluster的大脑,他的主要职责是调度,即决定将应用放在哪里运行。master运行linux操作系统,可以是物理机或者虚拟机。为了高可用,可以运行多个master

node

node的职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linux

pod

pod是k8s最小工作单元.Pod是最小的,管理,创建,计划的最小单元,每个pod包含一个或多个容器;pod中的容器会作为一个整体被master调度到一个node上运行

controller

k8s通常不会直接创建pod,而是通过controller来管理pod的;controller中定义了pod的部署特性,比如有几个剧本,在什么样的node上运行等。为了满足不同的业务场景,k8s提供了多种controller ,包括:deployment 、replicaset、daemonset 、job 等

deployment

Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法。使用Deployment来创建ReplicaSet;ReplicaSet在后台创建pod。

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

replicaset

Deployment创建ReplicaSet;ReplicaSet在后台创建pod.replicaset实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset

保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么(维护阿,更新啊,Replication Controller都不关心)

daemonset

DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用,

  • 日志收集,比如fluentd,logstash等
  • 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
  • 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

StatefulSet

稳定的持久化存储;能够保证pod的每个副本在整个生命周期中名称是不变的;当某个pod发生故障需要删除并重新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除
详解网址:https://www.kubernetes.org.cn/statefulset

job

Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

CronJob

CronJob即定时任务,就类似于Linux系统的crontab,在指定的时间周期运行指定的任务。在Kubernetes 1.5,使用CronJob需要开启batch/v2alpha1 API,即–runtime-config=batch/v2alpha1
https://www.kubernetes.org.cn/cronjob

service

https://www.kubernetes.org.cn/kubernetes-services
https://www.cnblogs.com/du-z/p/11388805.html

namespace

可以将一个物理的cluster逻辑上划分成多个虚拟cluster,每个cluster就是一个namespace。不同的namespace里的资源是完全隔离的

k8s集群创建pods

第一步:创建nginx pod

╭─root@node1 ~  
╰─➤  kubectl run nginx --image=nginx -r 2

# -r  指定创建的pod数量

第二步:查看pod (详细)

╭─root@node1 ~  
╰─➤  kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE     IP       NODE    NOMINATED NODE   READINESS GATES
nginx-7bb7cd8db5-d2qf2   0/1     ContainerCreating   0          5m56s   <none>   node2   <none>           <none>
nginx-7bb7cd8db5-sr7qt   0/1     ContainerCreating   0          5m56s   <none>   node3   <none>           <none>

第三步:查看deployment

# kubectl api-resources   查看缩写

╭─root@node1 ~  
╰─➤  kubectl get deploy     
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   0/2     2            0           15m


# READY 2/2 第一个2是已经启动的pod数,第二个2是需要总共启动的pod数量
# UP-TO-DATE  需要的数量
# AVAILABLE 可用的数量

分析创建过程

  1. kubectl 通过api-server创建nginx deployment
  2. deployment-manager 创建nginx deployment
  3. scheduler把两个pod调度到不同的节点之上
  4. 节点之上的kubelet创建两个pod

k8s集群deployment

第一步:查看当前deployment

╭─root@node1 ~  
╰─➤  kubectl get deploy     
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   0/2     2            0           15m

第二步:查看当前deployment详细信息

╭─root@node1 ~  
╰─➤  kubectl describe deploy nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Tue, 20 Aug 2019 03:43:44 -0400
Labels:                 run=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-7bb7cd8db5 (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  56m   deployment-controller  Scaled up replica set nginx-7bb7cd8db5 to 2

第三步:查看replicaset

╭─root@node1 ~  
╰─➤  kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
nginx-7bb7cd8db5   2         2         2       58m

第四步:查看replicaset详细信息

╭─root@node1 ~  
╰─➤  kubectl describe rs nginx-7bb7cd8db5
Name:           nginx-7bb7cd8db5
Namespace:      default
Selector:       pod-template-hash=7bb7cd8db5,run=nginx
Labels:         pod-template-hash=7bb7cd8db5
                run=nginx
Annotations:    deployment.kubernetes.io/desired-replicas: 2
                deployment.kubernetes.io/max-replicas: 3
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/nginx      # replicaset 被deployment管理
Replicas:       2 current / 2 desired
Pods Status:    2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  pod-template-hash=7bb7cd8db5
           run=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  60m   replicaset-controller  Created pod: nginx-7bb7cd8db5-sr7qt
  Normal  SuccessfulCreate  60m   replicaset-controller  Created pod: nginx-7bb7cd8db5-d2qf2

第五步:查看pod详细信息

╭─root@node1 ~  
╰─➤  kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7bb7cd8db5-d2qf2   1/1     Running   0          62m
nginx-7bb7cd8db5-sr7qt   1/1     Running   0          62m

╭─root@node1 ~  
╰─➤  kubectl describe  pod nginx-7bb7cd8db5-d2qf2         
Name:           nginx-7bb7cd8db5-d2qf2
Namespace:      default
Priority:       0
Node:           node2/192.168.137.4
Start Time:     Tue, 20 Aug 2019 03:43:46 -0400
Labels:         pod-template-hash=7bb7cd8db5
                run=nginx
Annotations:    <none>
Status:         Running
IP:             10.244.1.2
Controlled By:  ReplicaSet/nginx-7bb7cd8db5
Containers:
  nginx:
    Container ID:   docker://67466adb9736a6d86f12513f589fa50c47003b7f37ca1abb0155a39b37064d0c
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:53ddb41e46de3d63376579acf46f9a41a8d7de33645db47a486de9769201fec9
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 20 Aug 2019 04:02:04 -0400
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-ngn4n (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-ngn4n:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-ngn4n
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason   Age   From            Message
  ----    ------   ----  ----            -------
  Normal  Pulled   45m   kubelet, node2  Successfully pulled image "nginx"
  Normal  Created  45m   kubelet, node2  Created container nginx
  Normal  Started  45m   kubelet, node2  Started container nginx

第六步:监测pod日志

╭─root@node1 ~  
╰─➤  kubectl logs -f  nginx-7bb7cd8db5-d2qf2
posted @ 2019-08-19 15:28  du-z  阅读(2305)  评论(0编辑  收藏  举报