K8S 基本概念和应用

​​​​​​​Kubernetes基本概念和应用_哔哩哔哩_bilibili

K8s基本概念入门_运维Linux和python-CSDN博客​​​​​​​

GitHub - spring2go/spring-petclinic-msa: 微服务版spring-petlinic,课程《Kubernetes微服务实践》

K8S:核心是解决集群资源调度的问题的

0. k8s for mac install

在 Mac OS 上搭建 Kubernetes | Zone Of Xiang

1. 下载安装 Docker for Mac

Docker Desktop for Mac release notes | Docker Documentation

K8S 基本概念和应用_第1张图片

K8S 基本概念和应用_第2张图片

Docker Hub 【镜像管理仓库】

如上:这个镜像的最新就是v1.22.4。所以需要保持版本一致

一. 架构概览

K8S 基本概念和应用_第3张图片

Master:管理和调度集群资源

Worker:资源的提供者 。提供的资源单位是Pod【里面是容器(CPU和内存的资源隔离单位)】,Pod里面可以放置一个或多个容器,如果是多个的话「一个是主容器,其他是辅助容器,同一个Pod里面的容器,共享网络和存储,可以通信」 

K8S 基本概念和应用_第4张图片

etcd:分布式的KV数据库,高可用部署的话,至少需要3个节点

API server:K8S的接口和通信总线。是唯一能够访问和操作etcd数据库的 组件 

K8S 基本概念和应用_第5张图片

 K8S 基本概念和应用_第6张图片​ 

K8S 基本概念和应用_第7张图片​ K8S 基本概念和应用_第8张图片

二. Pod

K8S 基本概念和应用_第9张图片​ K8S 基本概念和应用_第10张图片

hub.docker.com/r/spring2go/spring-petclinic/tags 【制作一个单体镜像,已经上传到官方的docker hub】

这个镜像启动的时候用的是:嵌入式内存数据库 HSQLDB 【应用可以独立启动,不依赖外部数据库】

K8S 基本概念和应用_第11张图片

K8S 基本概念和应用_第12张图片

 K8S 基本概念和应用_第13张图片

默认情况下:K8S集群内部的Pod对外不可见的 【私有环境,有自己的网络,外部无法直接访问】 

K8S 基本概念和应用_第14张图片

可以使用端口转发方式暴露内部的服务【仅仅适用于调试和测试环境 】 

三、反向代理 - Service

K8S 基本概念和应用_第15张图片​ 传统的做法

K8S 基本概念和应用_第16张图片

在K8S里面也有一个类似反向代理的抽象概念。【Service】

NodePort相当于可以部署在集群边界上的反向代理

通过NodePort。外部服务就可以访问K8S集群内部的应用。。。

【当前K8S里面的Service还和传统的反向代理不一样,这里的是一个抽象概念】 ,Service将流量反向路由到后端的Pod是通过Selector和Labels机制来实现的。

Labels是一种打标签机制。可以给Pod打上标签(键值对 ,如上:app petclinic)

Selector是一种路由选择机制。如果上面的标签可以和后端Pod的标签匹配上,就可以将流量路由到该Pod上面

 Service具有路由转发和负载均衡的能力,可以有效的屏蔽后端ip的变化

K8S 基本概念和应用_第17张图片​可以将K8S集群内的服务暴露到公网 上面【底层也是依赖NodePort】  

适用于K8S集群内部。内部的一种反向代理,微服务应用之间的互通互联 依赖ClusterIP

三. Label和Selector

K8S 基本概念和应用_第18张图片​  

四、Service

K8S 基本概念和应用_第19张图片​kind: Service  【表示部署一个Service反向代理】

apiVersion:v1 【表示这是K8S的core 核心API】

metadata:【可以给Service起一个名字】 

spec/ports:port 80 【这个Service要暴露的port 80】targetPort:对应的Pod的端口【转发】

spec/selector:【指定要选择后端Pod的标签,相当于路由映射配置】

type:【Service的类型。本地K8S环境,不能选择LoadBalancer,只能选择NodePort】LoadBalancer只有公有云才可以支持 

K8S 基本概念和应用_第20张图片

上述:31080上面暴露Service,让本机可以访问这个Service 

同时:还需要改动这里【为了发布后可以正确路由】

K8S 基本概念和应用_第21张图片K8S 基本概念和应用_第22张图片

五. 通过Service实现蓝绿发布

K8S 基本概念和应用_第23张图片

K8S 基本概念和应用_第24张图片​ Blue-Green-Deployment: 是一种应用升级发布方式,可以瞬间切换到新版本,也可以瞬间回退到老版本。可以做到用户体验不中断

下面以在K8S中升级应用来说明蓝绿发布的过程:

K8S 基本概念和应用_第25张图片

K8S 基本概念和应用_第26张图片K8S 基本概念和应用_第27张图片

K8S 基本概念和应用_第28张图片K8S 基本概念和应用_第29张图片

 K8S 基本概念和应用_第30张图片

六. 应用集群抽象 ReplicaSet

K8S 基本概念和应用_第31张图片

 K8S 基本概念和应用_第32张图片

K8S 基本概念和应用_第33张图片 Kubernetes API Reference Docs

【务必需要找到对应的版本,不然真的可能会有问题的呢?。。。。】

K8S 基本概念和应用_第34张图片

 

 K8S 基本概念和应用_第35张图片

k8s: 加载所有的yml‘K8S 基本概念和应用_第36张图片 

K8S 基本概念和应用_第37张图片 如上:pod的状态不对。不应该是ErrImagePull。结合des分析之后,发现容器版本写错了1.0.0_RELEASE 。应该是1.0.0.RELEASE。调整后:

K8S 基本概念和应用_第38张图片

K8S 基本概念和应用_第39张图片 如上:这就是高可用。。。 

K8S 基本概念和应用_第40张图片

 K8S 基本概念和应用_第41张图片

请注意:这里的apiVersion应该结合官方文档。 

七. 滚动发布抽象 Deployment

K8S 基本概念和应用_第42张图片 K8S 基本概念和应用_第43张图片

K8S 基本概念和应用_第44张图片 K8S 基本概念和应用_第45张图片

K8S 基本概念和应用_第46张图片 滚动发布。在ReplicaSet的基础上再次包装(Deployment)K8S 基本概念和应用_第47张图片

会始终保证有Pod可用。保证服务的正常运行 。同时前置的Service还是屏蔽后端Pod ip的变化;Deployment的引用:把滚动发布的机制给封装和自动化了   

 Deployment发布规范:

Kubernetes API Reference Docs

K8S 基本概念和应用_第48张图片

K8S 基本概念和应用_第49张图片

 如上:minReadySeconds 10

表示Pod起来后,需要等待10s才算是就绪。这样可以在滚动发布的批次中增加10s的时延,方便我们查看滚动发布的效果

K8S 基本概念和应用_第50张图片

K8S 基本概念和应用_第51张图片

K8S 基本概念和应用_第52张图片 也就是说:10s后,变成了正常状态。

验证滚动发布:

 K8S 基本概念和应用_第53张图片

选取一个新镜像。

发布配置

K8S 基本概念和应用_第54张图片

滚动发布中。。。【会生成新的replicaset,不断进行rolling, 新的Pod不断拉入,老的Pod不断停止移除】 整个Deployment已经完成了

K8S 基本概念和应用_第55张图片

查看发布历史: 1代表v1.0.1         2代表v1.0.1

第二条语句代表回退中。从2回退到1【回退的详细情况可以通过如下命令查看】 

环境清理:因为说封装的关系

K8S 基本概念和应用_第56张图片 K8S 基本概念和应用_第57张图片

八. K8S内部服务反向代理机制  ClusterIP Service

K8S 基本概念和应用_第58张图片

K8S 基本概念和应用_第59张图片

K8S 基本概念和应用_第60张图片 K8S 基本概念和应用_第61张图片

 mysql-pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
    - name: mysql
      image: mysql:5.7
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: petclinic
        - name: MYSQL_DATABASE
          value: petclinic

mysql-service.yml 

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
    - name: tcp
      port: 3306
      targetPort: 3306
  type: ClusterIP

petclinic-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: petclinic
spec:
  replicas: 1
  selector:
    matchLabels:
      app: petclinic
  template:
    metadata:
      labels:
        app: petclinic
    spec:
      containers:
      - name: petclinic
        image: spring2go/spring-petclinic:1.0.1.RELEASE
        env:
          - name: SPRING_PROFILES_ACTIVE
            value: mysql
          - name: DATASOURCE_URL
            value: jdbc:mysql://mysql/petclinic
          - name: DATASOURCE_PASSWORD
            value: petclinic
          - name: DATASOURCE_USERNAME
            value: root
          - name: DATASOURCE_INIT_MODE
            value: always

petclinic-service.yml

apiVersion: v1
kind: Service
metadata:
  name: petclinic
spec:
  ports:
    - name: http
      port: 8080
      targetPort: 8080
      nodePort: 31080
  selector:
    app: petclinic
  type: NodePort

启动的话,因为有依赖关系,所以需要严格意义上安装上述顺序进行启动

K8S 基本概念和应用_第62张图片

可以通过查看Pod日志,确认PetClinit是否成功启动

kubectl logs petclinic-5f776bbbc4-t6x6z

K8S 基本概念和应用_第63张图片

9. K8S名字空间Namespace和Kube-Dns

K8S 基本概念和应用_第64张图片

内置的k8s DNS.可以完成如上:域名到ip的转化【本质上是查询服务名和IP的映射关系】 

petclinic Pod通过内置的DNS client 配合 k8s内置的DNS域名解析服务就可以完成这个目的

名字空间Namespace是K8S中的一种逻辑隔离机制。方便对资源进行逻辑管理。

在一个K8S当中,可以配置多个Namespace。只是逻辑隔离,不是物理隔离。

K8S 基本概念和应用_第65张图片

可以看到内置的名字空间。

default:是缺省名字空间。当前实验的资源就住在default当中

kube-system:k8s运行所需要的一些系统组件。

K8S 基本概念和应用_第66张图片 如上的kube-dns就是K8S内置的域名解析服务

【这里会有:etcd、apiserver、controller-manager、proxy、scheduler】等等

K8S 基本概念和应用_第67张图片

当petclinic应用准备访问mysql service的时候。Pod内部操作系统自带的DNS client会先查询kube-dns服务。获得mysql ClusterIP对应的ip。然后发起调度

可以通过kubectl连接到petclinic pod上面,运行里面的linux命令,进一步查看域名解析机制

 可以查看linux本地配置的nameserver 和搜索域

K8S 基本概念和应用_第68张图片

也就是说:上面的pod里面的dns client指向的是nameserver【也就是k8s内置的域名服务】

查看mysql对应的clusterIp 【nslookup mysql】

K8S 基本概念和应用_第69张图片 其中mysql.default.svc.cluster.local是全域名【msyql拼接了搜索域对应的内容  default命名空间下面】K8S 基本概念和应用_第70张图片

 可以看到两者是吻合的。都是对应的上的。。。

清理环境

 K8S 基本概念和应用_第71张图片

K8S 基本概念和应用_第72张图片

10. K8S配置抽象ConfigMap

K8S 基本概念和应用_第73张图片

微服务需要配置管理来针对支持不同环境的灵活的静态或者动态配置

K8S平台内置支持微服务配置。就是ConfigMap。是K8S平台所支持的一种资源

开发人员将配置填写在ConfigMap中。发布以后呢?k8s支持将ConfigMap里的配置以环境变量的形式注入到Pod中 这样Pod里面的应用就可以以环境变量的形式来访问这些应用。。。

ConfigMap也支持以存储卷Volume的形式挂载在Pod中。这样Pod中的应用就可以以本地配置的方式来访问

K8S 基本概念和应用_第74张图片

K8S 基本概念和应用_第75张图片 K8S 基本概念和应用_第76张图片

之前的内容中。为了能让Petclinic Pod能够正常的连接mysql 数据库 

在 Petclinic Pod中以环境变量的形式传入了数据库链接字符串的配置参数

这次我们调整一下:不是写在环境变量。而是从ConfigMap里面获取

所以需要先独立部署一个:petclinic-config的ConfigMap【内容就是支持petclinic正常运行所需要的配置项】

K8S 基本概念和应用_第77张图片

petclinic-config.xml

apiVersion: v1
kind: ConfigMap
metadata:
  name: petclinic-config
data:
  SPRING_PROFILES_ACTIVE: mysql
  DATASOURCE_URL: jdbc:mysql://mysql/petclinic
  DATASOURCE_PASSWORD: petclinic
  DATASOURCE_USERNAME: root
  DATASOURCE_INIT_MODE: always
  TEST_CONFIG: test_config_v1

mysql-svc.xml

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
    - name: mysql
      image: mysql:5.7
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: petclinic
        - name: MYSQL_DATABASE
          value: petclinic
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
    - name: tcp
      port: 3306
      targetPort: 3306
  type: ClusterIP

petclinic-svc.xml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: petclinic
spec:
  replicas: 1
  selector:
    matchLabels:
      app: petclinic
  template:
    metadata:
      labels:
        app: petclinic
    spec:
      containers:
      - name: petclinic
        image: spring2go/spring-petclinic:1.0.1.RELEASE
        envFrom:
          - configMapRef:
              name: petclinic-config
---
apiVersion: v1
kind: Service
metadata:
  name: petclinic
spec:
  ports:
    - name: http
      port: 8080
      targetPort: 8080
      nodePort: 31080
  selector:
    app: petclinic
  type: NodePort

 K8S 基本概念和应用_第78张图片K8S 基本概念和应用_第79张图片

两种方式来验证结果的正确性:

1. 查看petclinic的启动日志【kubectl logs petclinic-f77f5c8f-hqp6m】 

 2. 打开浏览器访问

K8S 基本概念和应用_第80张图片

3. 可以到petclinic pod里面查看环境变量

【kubectl exec petclinic-f77f5c8f-hqp6m printenv】

 11. ConfigMap变更传播

实际应用当中。经常有配置变更的需求,而且我们希望配置变更以后,应用可以实时或者近实时的获取到更新的配置值

那么问题来了?

如果我变更了Config里面的值,重新发布下,会不会进行传播到应用中呢?【如下:发现并不能进行传播】

K8S 基本概念和应用_第81张图片

方案一:【简单粗暴】

可以delete掉上面的petclinic pod。然后replicaset会重新创建一个。 

K8S 基本概念和应用_第82张图片

方案二:【优雅一点的做法】

修改ConfigMap的name和引用 

清理工作:

  

K8S 基本概念和应用_第83张图片

12.  K8S机密配置抽象Secret

K8S 基本概念和应用_第84张图片

ConfigMap主要针对普通数据

Secret来支持敏感数据配置

K8S 基本概念和应用_第85张图片

 Secret是一种特殊的配置。提供较安全的存储和访问配置的机制

K8S 基本概念和应用_第86张图片

 K8S 基本概念和应用_第87张图片

K8S 基本概念和应用_第88张图片

会把secret里面的内容以yaml的形式展示出来

启动data里面:已经将结果进行了base64编码【但是,我们可以在metadata里面看到原始值】

也就是说secret的配置值,并没有复杂的加密,并不是特别安全

K8S 基本概念和应用_第89张图片

你可能感兴趣的:(K8S,kubernetes,容器,docker)