1.K8s集群架构结构介绍

2.K8s创建一次部署

3.K8s的自愈

4.Pod介绍

5.K8s将多个pod封装成一个统一服务

6.K8s的滚动升级

7.K8s的对象描述符文件简单介绍

8.K8s安装lens

1.K8s集群架构结构介绍

系统学习K8s——简介与安装中,我们学习了K8s的集群架构为主从结构。

image.png

master节点的关键组件:

  • kubelet(监工):所有节点必备,控制这个节点所有的pod生命周期以及与api-server的交互工作。
  • api-server: 负责接收所有请求,集群内对集群的任何修改都是通过命令行,UI界面把请求发给api-server才能执行。api-server是整个集群对内,堆外的唯一入口。
  • kube-proxy:整个节点的网络流量负责
  • 都有容器运行时环境

worker节点:

  • kubelet(监工):所有节点必备的。控制这个节点所有pod的生命周期以及与api-server交互等工作
  • kube-proxy:整个节点的网络流量负责
  • cri:都有容器运行时环境

2.K8s创建一次部署

基本命令:

kubectl create deployment 这次部署的名字 --image=应用的镜像
#创建nginx,并部署3份
kubectl create deployment my-nginx --image=nginx --replicas=3
#Create a deployment named my-nginx that runs the nginx image and expose port 80.
kubectl create deployment my-nginx --image=nginx --port=80

Deployment(部署):
在k8s中,通过kubectl create deployment命令,可以创建应用程序(docker image)的实例(docker container),这个实例会被包含在pod中,pod是K8s中的最小单元

在K8s集群中发布deployment后,deployment将指示K8s如何创建和更新应用程序的实例,master节点将应用程序实例调度到集群中等具体节点上。

image.png

3.K8s的自愈

我们先创建3个节点的nginx,然后再删除一个pod,此时deployment有自愈机制,会自行恢复。

kubectl create deployment my-nginx --image=nginx --replicas=3

image.png
然后我们删除一个:

kubectl delete pod my-nginx-6b74b79f57-5bwp2

image.png

自愈原理:
创建应用程序实例后,Kubernetes Deployment Controller持续监控这些实例,如果运行实例的worker节点关机或者删除,则Kubernetes Deployment Controller将在集群资源中寻找最优的一个worker节点上创建一个新的实例。这提供了一种自我修复机制来解决机器故障或者维护问题。

在容器编排之前的年代,各种安装脚本通常用于开机启动应用程序,但是不能够使用应用程序从机器故障中恢复。通过创建应用程序实例并确保它们在集群中的运行实例个数,Kubernetes Deployment 提供了一种完全不同的方式来管理应用程序。

4.Pod介绍

前面简单实操了一下K8s,经常提到pod,现在我们来讲解一下pod是什么。
Pod(容器组)是K8s中的一个抽象的概念,用于存放一组container(可包含一个或者多个container),以及这些container的一些共享资源,这些资源有:

  • 共享存储,称为卷(Volumes)
  • 网络,每个pod在集群中都有一个唯一IP,pod中的container共享该ip地址。
  • container的基本信息,例如镜像版本,暴露端口之类。

image.png

Pod(容器组)是K8s集群上的基本单元。当我们在K8s上创建Deployment时,会在集群上创建包含容器的pod(而不是直接创建容器)。每个pod都要与运行他的worker节点绑定,并保持在那里直到终止或删除。如果node发生故障,则会在集群中的其它node上运行相同的pod。

pod的故障排除常用命令:

# kubectl get 资源类型
    
    #获取类型为Deployment的资源列表
    kubectl get deployments
    
    #获取类型为Pod的资源列表
    kubectl get pods
    
    #获取类型为Node的资源列表
    kubectl get nodes

 # kubectl describe 资源类型 资源名称
    
    #查看名称为nginx-XXXXXX的Pod的信息
    kubectl describe pod nginx-XXXXXX    
    
    #查看名称为nginx的Deployment的信息
    kubectl describe deployment my-nginx    

 # kubectl logs Pod名称
    
    #查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
    #本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
    kubectl logs -f nginx-pod-XXXXXXX

  # kubectl exec Pod名称 操作命令
    
    # 在名称为nginx-pod-xxxxxx的Pod中运行bash
    kubectl exec -it nginx-pod-xxxxxx /bin/bash
    

5.K8s将多个pod封装成一个统一服务

我们通过service可以将多个pod封装成一组服务:

image.png

先来介绍一下什么是service:
K8s的service是一个抽象层,他将一组pod聚合成一个service提供给外部调用,支持暴露,负载均衡,服务发现等。

  • 尽管每一个pod都有IP地址,但是如果没有service,这些IP不会暴露在集群外部,Service允许我们的应用程序接受流量,service有以下几种type方式暴露。

    • ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。
    • NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用<NodeIP>:<NodePort> 从集群外部访问 Service。是 ClusterIP 的超集。
    • LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
    • ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。不使用代理。这种类型需要kube-dns的v1.7或更高版本。

我们刚刚在发布nginx的时候,启动了3个副本,然后我们将这3个nginx组装成一个service。

kubectl expose deployment my-nginx --port=80 --target-port=80 --type=NodePort
 ## --port:集群内访问service的端口 8912
 ## --target-port: pod容器的端口 8080
 ## --nodePort: 每个机器开发的端口 30403

创建好后,我们进行验证

 ## 进行验证
 kubectl get svc 
 curl ip:port

image.png

然后我们进入每一个pod内部修改nginx的主页标识,看看是否会负载均衡。

kubectl exec -it pod名  /bin/bash  #进pod并执行命令
cd /usr/share/nginx/html/
echo 11111111 > index.html

image.png

6.K8s的滚动升级介绍

滚动升级就是允许通过使用新的pod逐步更新老的pod从而实现Deployments更新,停机时间为0.

与应用程序的扩展类似,如果暴露了Deployment,服务(Service)将在更新期间仅对可用的pod进行负载均衡,可用pod是应用程序用户可用的实例。

滚动更新过程如图所示:

初始状态:
image.png

下线一个pod,然后上线一个pod:
image.png
逐步更新:
image.png
全部更新完成:
image.png

kubectl set image deployment/my-nginx  nginx=nginx:1.9.1

image.png

7.K8s的对象描述符文件简单介绍

我们之前使用K8s的命令行做了一些基本的操作,实际上这些命令非常多,记住及其困难,所以我们一般通过声明式API,通过对象描述符的文件YML来用文件固化操作

我们要将我们要部署的服务写成yml文件。
Pod --》 yaml , Deploy--》yaml , Service --》 yaml
然后apply这个文件就可以了。
kubectl apply -f xxx.yaml

部署一个应用的yml:

apiVersion: apps/v1    #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment    #该配置的类型,我们使用的是 Deployment
metadata:            #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment    #Deployment 的名称
  labels:        #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
    app: nginx    #为该Deployment设置key为app,value为nginx的标签
spec:            #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1    #使用该Deployment创建一个应用程序实例
  selector:        #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:        #这是选择或创建的Pod的模板
    metadata:    #Pod的元数据
      labels:    #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:        #期望Pod实现的功能(即在pod中部署)
      containers:    #生成container,与docker中的container是同一种
      - name: nginx    #container的名称
        image: nginx:1.7.9    #使用镜像nginx:1.7.9创建container,该container默认80端口可访问

暴露应用

apiVersion: v1
kind: Service
metadata:
  name: nginx-service    #Service 的名称
  labels:         #Service 自己的标签
    app: nginx    #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:        #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:        #标签选择器
    app: nginx    #选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port    #端口的名字
    protocol: TCP        #协议类型 TCP/UDP
    port: 80            #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 80    #将请求转发到匹配 Pod 的 80 端口
  type: NodePort    #Serive的类型,ClusterIP/NodePort/LoaderBalancer

8.K8s安装lens

我们可以在windows上安装一个lens客户端(https://k8slens.dev/), 这样就可以使用图形界面的方式来操作K8s,非常便捷。

安装完毕后使用 image.png 进行操作,把/etc/kubernetes/admin.conf 的文件全部复制进去,就可以链接并进行操作了!

image.png


苏凌峰
73 声望38 粉丝

你的迷惑在于想得太多而书读的太少。