Q、Kubernetes是啥?
Kubernetes是一个分步式自动化容器管理平台,具有完备的集群管理能力,内建智能负载均衡器,拥有强大的故障发现和自我修复功能。大家习惯把Kubernetes称为K8s。K8s本身不能实现硬件设备、操作系统,网络、软件服务等资源创建,主要是基于各个组件和模块来实现的。
一、有如下特点,优势,及应用场景。
1、特点:
可移植,可扩展,自动化。
2、优势:
轻量级,开源,弹性伸缩,负载均衡,开源
3、场景:
快速部署、扩展应用,实现docker容器创建,部署,复制,扩展,收缩,以及均衡、节省资源使用。

二、k8s几个常用概念
k8s集群中一般有master和node节点,
通过kubectl get nodes可以查看k8s集群节点情况。如下可以看到k8s集群由1个Master+2Node组成。

[root@k8master ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE     VERSION
k8smaster   Ready    master   7d21h   v1.19.3
k8snode1    Ready    <none>   7d17h   v1.19.3
k8snode2    Ready    <none>   7d21h   v1.19.3
[root@k8master ~]#

1、Master节点
是k8s集群管理节点,负责管理集群,对整个集群的资源进行调度,控制,提供集群资源数据访问入口,所有对集群的操作指令均需要通过访问入口授权才可以。
运行apiserver,controller manager 以及scheduler服务进程以及可选的Etcd key值数据库。
这里资源调度是由schelduler进程负责的。

2、Node节点
有地方也称作work节点,是k8s集群操作单元,也是运行pod服务节点,是pod的宿主机,拥有名称和IP,运行docker服务,关联master节点。运行kubelet,kube-proxy以及dokcer服务进程。

3、Pod

运行在node节点上,由若干容器组成。

如果把一个k8s集群看作一个小区的话,node节点就是一个单元楼,而pod就是单元楼里的门牌,容器就是门牌里面的房间。如下:

kubernetes基本概念 kubernetes的特性_IP

可以通过kubectl get pod查看k8s集群里pod信息,如下可以看到我的k8s集群中运行3个pod,一个mysql,两个web。

[root@k8master ~]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
mysql-4s4td   1/1     Running   0          22h
myweb-5gngj   1/1     Running   0          22h
myweb-bt9hn   1/1     Running   0          22h
[root@k8master ~]#

可以通过describe查看pod详细信息,如下:可能看到pod运行在哪个node节点上,以及IP,Lables,RC,Port等

[root@k8master ~]# kubectl describe pod mysql-4s4td
Name:         mysql-4s4td
Namespace:    default
Priority:     0
Node:         k8snode2/172.18.1.12
Start Time:   Tue, 22 Dec 2020 13:00:44 +0800
Labels:       app=mysql
Annotations:  <none>
Status:       Running
IP:           10.244.2.4
IPs:
  IP:           10.244.2.4
Controlled By:  ReplicationController/mysql
Containers:
  mysql:
    Container ID:   docker://e5573eebc18545665344a4335ec20996f1d7e8e9eea2513d8f773798e975173b
    Image:          mysql:5.6
    Image ID:       docker-pullable://mysql@sha256:51d59639d9a864ec302008c81d6909c532eff8b946993ef6448c086ba7917e82
    Port:           3306/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Tue, 22 Dec 2020 13:01:47 +0800
    Ready:          True
    Restart Count:  0
    Environment:
      MYSQL_ROOT_PASSWORD:  123456
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9ln7v (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-9ln7v:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-9ln7v
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:          <none>
[root@k8master ~]#

4、service
server定义了pod逻辑集合和访问该集合策略,提供一个统一的服务访问入口。关联多个相同Label的Pod,而用户不需要了解后台pod是如何运行的。
可以通过kubectl get svc查看service信息。如下

[root@k8master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          7d23h
mysql        ClusterIP   10.111.33.137    <none>        3306/TCP         23h
myweb        NodePort    10.105.244.254   <none>        8080:30001/TCP   23h
[root@k8master ~]#

外部系统访问service机制:
k8s有三种IP:
node IP,node节点的IP,是节点的物理网卡的IP地址。在k8s集群外主机访问k8s集群内部某个节点或服务的时候,必须通通node IP进行通信。
pod IP,每个pod的IP,是docker 容器间通信用,根据docker0网桥的IP地址,是一个虚拟的二层网络。
cluster IP:service的IP。是一个虚拟机的IP,仅作用于k8s service这个对象,无法被ping,由于k8s管理和分配,结合service Port组成一个具体的通信端口,单独的cluster IP不具备通信基础。
5、RC(Replication Controller)
是用来管理pod的副本,保证集群中存在指定数据的Pod副本。一般RC由下面几个部分组成:
pod副本数:replicas
用于筛选目标的pod的Label selector
以及用于创建pod的模板(template)
如下,一个web应用的RC

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 2    #启动2副本。
  selector:
    app: myweb
  template:   #模板
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        ports:
        - containerPort: 8080

当定义了一个RC并提交到k8s集群后,Master节点上controller manager组件获悉后巡检当前存活的目标pod,并确保目标pod实例数量刚好等于RC中定义的数量。如果存在多个Pod副本在运行,系统会停掉一些pod,如果少于pod副本运行,会自动创建pod。
删除定义的RC不会影响到通过RC已经创建的Pod.

6、Label
在k8s集群中,任意的API对象都是通过Label进行标识,Node,Pod,Service,RC都会有Label来标识。Label是RC和Service运行的基础,二者都是通过Label来进行关联Node上运行的Pod,可以通过Label selector来查询筛选资源对象。Label和Label Selector共同构成k8s系统中最核心的应用模型。
一般:
kube-Controller进程通过资源对象RC上定义Label Selector来筛选要监控的Pod副本的数量,从而实现副本数量始终符合预期设定的全自动控制流程
kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起每个Service岛对应Pod的请求转发路由表,从而实现Service的智能负载均衡
通过对某些Node定义特定的Label,并且在Pod定义文件中使用Nodeselector这种标签调度策略,kuber-scheduler进程可以实现Pod”定向调度“的特性。

7、Namespace
Namespace用于实现多租户的资源隔离,可将集群内部的资源对象分配到不同的Namespace中,形成逻辑上的不同项目、小组或用户组,便于不同的Namespace在共享使用整个集群的资源的同时还能被分别管理。

K8s集群在启动后,会创建一个名为“default”的Namespace,且默认情况下K8s的相关资源,如Pod、RC、Service都将被系统创建到此默认名为default的Namespace中。