Kubernetes基本概念的学习

 

Master节点:整个集群的控制中枢

 

 

 

Master节点有以下组件:

 

         Kube-APIServer:各个模块之间信息交互都需要通过Kube-APIserver,同事他也是集群管理,资源配置,整个集群安全机制的入口;

 

         ControllerManager:集群状态管理器,保证Pod或其他资源达到期望值,也是需要和APIServer进行通信,在需要的时候创建,更新或者删除它锁管理的资源,比如一个服务创建了5个副本,更新的时候需要增加一个,APIServer就会通知ContrllerManager增加一个副本;

 

         Scheduler:集群的调度中心,他会根据一系列的条件,选择一个或者一批节点,然后部署我们的Pod。

 

         Etcd:后端存储,键值数据库

Node节点:工作节点

         kubelet:负责监听节点上的Pod状态,同时上报节点和节点上的Pod状态,负责与Master节点通信,并管理节点上面的Pod。

         KubeProxy:负责Pod之间的通信,将指定的流量分发到后端正确的机器上。

        查看proxy的工作端口:

[root@master01 ~]# netstat -ntlp | grep kube-proxy
tcp        0      0 0.0.0.0:30004           0.0.0.0:*               LISTEN      4226/kube-proxy     
tcp        0      0 0.0.0.0:30587           0.0.0.0:*               LISTEN      4226/kube-proxy     
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      4226/kube-proxy     
tcp6       0      0 :::10256                :::*                    LISTEN      4226/kube-proxy     

       查看proxy的工作模式

[root@master01 ~]# curl 127.0.0.1:10249/proxyMode
iptables

     ipvs:(内核级别的转发)监听Master节点,增加和删除service以及endpoint的消息。调用Netlink接口,创建响应的IPVS规则,通过ipvs规则将流量转发到响应的pod上。

查看ipvs的规则

 

[root@master01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

 

       iptables:监听Master节点,增加和删除service以及endpoint的消息,对于每一个service,他都会场景一个iptables,将service的clusterIP代理到后端对应的Pod。

  Calico: 符合CIN标准的网络组件。 给每个pod生产一个唯一的ip,并且把每个节点当作一个路由器;

  CoreDNS:用于kubernetes集群内部的Service解析,可以让Pod把service名称解析成为IP地址,然后通过service的IP地址连接到对应的应用上。

[root@master01 ~]# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.1.0.10    <none>        53/UDP,53/TCP,9153/TCP   27d

Docker容器引擎:容器引擎,对容器进行管理。

 

一、基本资源概念

kubernetes是以namespace隔离的,查看namespace

[root@master01 ~]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   27d
jna                    Active   20d
kube-node-lease        Active   27d
kube-public            Active   27d
kube-system            Active   27d
kubernetes-dashboard   Active   27d

查看系统的namespace下的pod

[root@master01 ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-577f77cb5c-twhgv   1/1     Running   12         26d
calico-node-5k47s                          1/1     Running   13         27d
calico-node-n9kvg                          1/1     Running   13         27d
calico-node-rbpkm                          1/1     Running   13         27d
coredns-6d56c8448f-bhsbd                   1/1     Running   12         26d
coredns-6d56c8448f-xkpnt                   1/1     Running   12         26d
etcd-master01                              1/1     Running   13         27d
kube-apiserver-master01                    1/1     Running   14         27d
kube-controller-manager-master01           1/1     Running   16         27d
kube-proxy-mlwjh                           1/1     Running   13         27d
kube-proxy-pzglf                           1/1     Running   13         27d
kube-proxy-xfb2l                           1/1     Running   15         27d
kube-scheduler-master01                    1/1     Running   15         27d

1 POD: k8s最小部署单元,有一个或者一组容器的集合;每个pod还包含了一个pause容器,pause容器是每个pod容器的父容器,主要负责僵尸容器的回收管理,通过这个容器可以使同一个Pod的里边的多个容器共享存储、网络、PId、IPC

[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
web-96d5df5c8-lfbgg     1/1     Running   3          5d22h
web-96d5df5c8-nf9tz     1/1     Running   3          5d22h
web-96d5df5c8-tnzt4     1/1     Running   3          5d22h
web2-5fc4444698-8h68t   1/1     Running   1          4d1h
web2-5fc4444698-f99kz   1/1     Running   1          4d1h
web2-5fc4444698-jlsp2   1/1     Running   1          4d1h

2 Deployment:最常见的控制器,用于更高级别的部署和管理Pod,滚动升级,副本的管理,回滚

用于部署无状态的服务,这个最常用的控制器,一般用于管理维护企业内部无状态的微服务、比如configserver、zuulspringboot。可以管理多个副本的Pod,实现无缝迁移,自动扩容缩容、自动灾难恢复,一键回滚的功能。

[root@master01 ~]# kubectl get deployment
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    3/3     3            3           5d22h
web2   3/3     3            3           4d1h

3 Service:为一组Pod提供负载均衡,对外提供统一访问入口

[root@master01 ~]# kubectl get service
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP        6d21h
web          NodePort    10.1.156.192   <none>        80:31614/TCP   5d22h
web2         NodePort    10.1.249.74    <none>        80:30209/TCP   35m

 4 Label:标签,附加到某个资源上,用于关联对象,查询和筛选

 5、Namespaces:命名空间、将资源对象逻辑上隔离、从而形成多个虚拟集群,也利于权限控制。

     5.1 应用场景:

               .根据不同端对换房命名空间

               .根据项目划分命名空间

[root@master01 ~]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   6d22h
kube-node-lease        Active   6d22h
kube-public            Active   6d22h
kube-system            Active   6d22h
kubernetes-dashboard   Active   6d19h

 .default:默认命名空间

 .kube-system:K8s系统方面的命名空间

 .kube-public:公开命名空间,谁都可以访问,

 .kube-node-lease:K8s内部命名空间

5.2   -n参数可以查看指定命名空间下的pod

[root@master01 ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-577f77cb5c-twhgv   1/1     Running   4          6d2h
calico-node-5k47s                          1/1     Running   5          6d20h
calico-node-n9kvg                          1/1     Running   5          6d20h
calico-node-rbpkm                          1/1     Running   5          6d20h
coredns-6d56c8448f-bhsbd                   1/1     Running   4          6d2h
coredns-6d56c8448f-xkpnt                   1/1     Running   4          6d2h
etcd-master01                              1/1     Running   5          6d22h
kube-apiserver-master01                    1/1     Running   5          6d22h
kube-controller-manager-master01           1/1     Running   5          6d22h
kube-proxy-mlwjh                           1/1     Running   5          6d22h
kube-proxy-pzglf                           1/1     Running   5          6d22h
kube-proxy-xfb2l                           1/1     Running   5          6d22h
kube-scheduler-master01                    1/1     Running   5          6d22h

5.3 创建命名空间

[root@master01 ~]# kubectl create namespace jna
namespace/jna created
[root@master01 ~]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   6d23h
jna                    Active   8s
kube-node-lease        Active   6d23h
kube-public            Active   6d23h
kube-system            Active   6d23h
kubernetes-dashboard   Active   6d20h

5.4  在指定的命名空间中创建pod

[root@master01 ~]# kubectl create deployment web --image=nginx --replicas=2 -n jna
deployment.apps/web created

get pod是默认的namespace看不到刚才创建的

[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
web-96d5df5c8-lfbgg     1/1     Running   3          5d23h
web-96d5df5c8-nf9tz     1/1     Running   3          5d23h
web-96d5df5c8-tnzt4     1/1     Running   3          5d23h
web2-5fc4444698-8h68t   1/1     Running   1          4d2h
web2-5fc4444698-f99kz   1/1     Running   1          4d2h
web2-5fc4444698-jlsp2   1/1     Running   1          4d2h

查看指定的namespace

[root@master01 ~]# kubectl get pod -n jna
NAME                  READY   STATUS    RESTARTS   AGE
web-96d5df5c8-68f4z   1/1     Running   0          19s
web-96d5df5c8-v6wm7   1/1     Running   0          19s

5.6  在yaml中指定namespace

apiVersion: v1
kind: Service
metadata:
  name: web2
  namespace: jna
spec:
  selector:
    app: nginx2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

创建service

[root@master01 ~]# kubectl apply -f service2.yaml 
service/web2 created

查看指定namespace下的pod和service

[root@master01 ~]# kubectl get pod,service -n jna
NAME                      READY   STATUS    RESTARTS   AGE
pod/web-96d5df5c8-68f4z   1/1     Running   0          18m
pod/web-96d5df5c8-v6wm7   1/1     Running   0          18m

NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/web2   NodePort   10.1.252.146   <none>        80:31741/TCP   2m7s

查看日志的时候也要加对应的-n  jna

[root@master01 ~]# kubectl logs web-96d5df5c8-68f4z -n jna
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/

 

 

yaml文件编写apiVersion: v1 #必选,API的版本号

kind:  Pod           #类型Pod
metadata:           #元数据
   name:  nginx       #pod名称, 符合RFC  1035规范的Pod名称
   namespace:   default     #Pod的命名空间,不指定是default,可以使用-n参数指定
lables: #可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend
annotations: #添加注释,比如版本的修改等信息
app:nginx
spec: #必选,用于定义容器的详细信息
initContainers: #初始化容器,在容器启动之前执行一些初始化操作
- command
- sh
- -c
- echo "I am Inicontainer for init some configuration"
image: busybox
imagePullPolicy: IfNotPresent
name: init-container
containers: #必选,容器列表
- name: nginx #容器名称
image: nginx:1.15.2 #容器你高兴的地址
imagePullPolicy: Always #拉去镜像的策略,IfNotPresent:如果宿主机有镜像,不需要在拉去,Always:总是拉去
command: #容器启动执行的命令
- nginx
- -g
workingDir: /usr/share/nginx/html #工作目录
volumeMounts: #kexuan,存储卷名称,可以配置多个
- name: webroot #存储卷名称
mountPath: /usr/share/nginx/html #挂载目录
readOnly: true #只读
ports: #可选,容器需要暴露的端口号列表
- name: http #端口名称
containerPort: 80 #端口号
protocol: TCP # 端口协议,默认TCP
    env: 可选,环境变量配置列表
- name: TZ #变量名称
value: Asia/Shanghai #变量的值
- name: LANG
value: en_US.utf8
resources: #可选,资源限制和资源请求
limits: #最大限制设置
cpu: 1000m
memory: 512Mi
restartPolicy: Always #可选,末日人为Always。容器故障或者没有启动成功,就自动重启该容器,onfailure:容器不为0的状态为止
imagePullSecrets: #可选,拉取镜像的secret,可以使用多个

查看容器的标签:

[root@master01 ~]# kubectl get node --show-labels
NAME       STATUS   ROLES    AGE   VERSION   LABELS
master01   Ready    master   27d   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master01,kubernetes.io/os=linux,node-role.kubernetes.io/master=
work01     Ready    <none>   27d   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work01,kubernetes.io/os=linux
work02     Ready    <none>   27d   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work02,kubernetes.io/os=linux

创建新的namespace

[root@master01 ~]# kubectl create namespace nsname
namespace/nsname created

 六、Pod探针

StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动,如果配置了startupProbe,就会禁止其他的探测,直到他成功位置,成功后将不在进行探测;

LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行响应的处理,若没有配置该探针,默认就是success。

ReadinessProbe: 一般用于探测容器内的程序是否健康。

探针的检测方式

 ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。

TCPSocketAction: 通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。

HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码200~400之间,则认为容器健康,

查看容器自带的LivenessProbe:

[root@master01 ~]# kubectl edit deploy coredns -n kube-system


livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: coredns
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 9153
name: metrics
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: 8181
scheme: HTTP


 七、Statefulset的基本概念

StatefulSet(有状态集,缩写为sts)常用于部署有状态的且有序启动的应用程序,比如在进行SpringCloud项目容器化时候,Eureka的部署是比较合适用StatefulSet部署方式的,可以给每个Eureka实例创建一个唯一且固定的标识符,并且每个Eureka实例无需配置多余的Service,其余SpringBoot应用可以直接通过Eureka的HeadlessService即可进行注册。

StatefulSet主要用于管理有状态应用程序的工作负载API对象,比如生产环境中,可以部署Elasticsearch集群、MongDB集群或者需要持久化的RabbitMQ集群、Redis集群、Kafka集群和ZooKeeper集群等。

        Service:headless service,没有ClusterIP

        和Deployment类似,一个StatefulSet也同样管理着基于相同容器规范的Pod。不同的是StatefulSet为每个Pod维护了一个粘性标识。这些Pod是根据相同的规范创建的,但是不可互换,每个Pod都有一个持久的标识符,在重新调度时候也会保留,一般格式为StatefulSetName-Number。

       一般StatefulSet用于一下啊一个多个需求的应用程序:

             需要稳定的独一无二的网络标识符;

              需要持久化数据;

              需要有序的,优雅的部署和扩展;

             需要有序的自动滚动更新;

创建一个StatefulSet

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

 创建一个statefulset

[root@master01 ~]# vi statefulset.yaml
[root@master01 ~]# 
[root@master01 ~]# kubectl create -f statefulset.yaml
service/nginx created
statefulset.apps/web created

查看statefulset

[root@master01 ~]# kubectl get statefulset
NAME   READY   AGE
web    0/2     47m

Statefulset的删除

  级联删除:删除Statefulset的时候,删除Pod

[root@master01 ~]# kubectl delete statefulset web

  非级联删除:  删除Statefulset的时候,删除Pod        

[root@master01 ~]# kubectl delete statefulset web --cascade=false

8、DaemonSet

DaemonSet:守护进程集,缩写为ds,在所有节点或者是匹配的节点都部署一个Pod。

运行集群存储的daemon,比如ceph或者qlusterd,节点的CNI网络插件,calico;

节点日志的收集:fluentd或者是filebeat;

节点的监控:node  export

服务暴露:部署一个  ingresss  nginx

编写yaml,kind改为DaemonSet

apiVersion: v1
kind: DaemonSet
metadata:
  name: nginx
  labels:
    app: nginx

查看系统的daemonset

root@master01 ~]# kubectl get daemonset -n kube-system
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
calico-node   3         3         0       3            0           kubernetes.io/os=linux   32d
kube-proxy    3         3         3       3            3           kubernetes.io/os=linux   32d

 9、Label和Selector

Label:对k8s中各种资源镜像分类、分组,添加一个具有特别属性的一个标签。

Selector:通过一个过滤的语法镜像查找到对应标签的资源。

给一个node打标签

[root@master01 ~]# kubectl label node work01 region=subnet6
node/work01 labeled

过滤这个标签

[root@master01 ~]# kubectl get node -l region=subnet6
NAME     STATUS   ROLES    AGE   VERSION
work01   Ready    <none>   33d   v1.19.0

查看打的标签

[root@master01 ~]# kubectl get node --show-labels
NAME       STATUS   ROLES    AGE   VERSION   LABELS
master01   Ready    master   33d   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master01,kubernetes.io/os=linux,node-role.kubernetes.io/master=
work01     Ready    <none>   33d   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work01,kubernetes.io/os=linux,region=subnet6
work02     Ready    <none>   33d   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work02,kubernetes.io/os=linux

给pod打标签

[root@master01 ~]# kubectl label pod busybox app=busybox

删除标签:

[root@master01 ~]# kubectl label busybox app-

修改标签:

[root@master01 ~]# kubectl label pod busybox app=busybox2 --overwrite

 10、Kubernetes涉及的网络

 

 网络架构

 

posted @ 2023-03-09 15:18  中仕  阅读(14)  评论(0编辑  收藏  举报